diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 000000000..713f85d59 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,27 @@ +{ + "name": "EMS-ESP Devcontainer", + "image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm", + "features": { + "ghcr.io/devcontainers/features/node:1": {}, + "ghcr.io/devcontainers-extra/features/pnpm:2": {}, + "ghcr.io/devcontainers/features/python:1": {}, + "ghcr.io/shyim/devcontainers-features/bun:0": {} + }, + + "forwardPorts": [ + 3000, + 3080 + ], + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "cd mock-api && pnpm install && cd .. && cd interface && pnpm install", + + // Configure tool-specific properties. + "customizations": { + "vscode": { + "extensions": [ + "platformio.platformio-ide" + ] + } + } +} diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 339f49b00..8d349fca4 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -21,7 +21,7 @@ _Make sure your have performed every step and checked the applicable boxes befor - [ ] Searched the issue in [issues](https://github.com/emsesp/EMS-ESP32/issues) - [ ] Searched the issue in [discussions](https://github.com/emsesp/EMS-ESP32/discussions) -- [ ] Searched the issue in the [docs](https://docs.emsesp.org/Troubleshooting/) +- [ ] Searched the issue in the [docs](https://emsesp.org/Troubleshooting/) - [ ] Searched the issue in the [chat](https://discord.gg/3J3GgnzpyT) - [ ] Provide the System information in the area below, taken from `http:///api/system` diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 10f68424e..62c86f614 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,7 +1,7 @@ blank_issues_enabled: false contact_links: - name: EMS-ESP Docs - url: https://docs.emsesp.org + url: https://emsesp.org about: All the information related to EMS-ESP. - name: EMS-ESP Discussions and Support url: https://github.com/emsesp/EMS-ESP32/discussions diff --git a/.github/workflows/dev_release.yml b/.github/workflows/dev_release.yml new file mode 100644 index 000000000..0eb0f329c --- /dev/null +++ b/.github/workflows/dev_release.yml @@ -0,0 +1,79 @@ +name: 'Build dev release' + +on: + workflow_dispatch: + push: + paths: + - 'src/emsesp_version.h' + branches: + - 'dev' + +permissions: + contents: write + +jobs: + pre-release: + name: 'Build Dev Release' + runs-on: ubuntu-latest + steps: + + - name: Install python 3.13 + uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install Node.js 24 + uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Enable Corepack + run: corepack enable pnpm + + - name: Get the EMS-ESP version + id: build_info + run: | + version=`grep -E '^#define EMSESP_APP_VERSION' ./src/emsesp_version.h | awk -F'"' '{print $2}'` + echo "VERSION=$version" >> $GITHUB_OUTPUT + + - name: Install PlatformIO + run: | + python -m pip install --upgrade pip + pip install -U platformio + python -m pip install intelhex + + - name: Build webUI + run: | + platformio run -e build_webUI + + - name: Build modbus + run: | + platformio run -e build_modbus + + - name: Build standalone + run: | + platformio run -e build_standalone + + - name: Build all PIO target environments, from default_envs + run: | + platformio run + + - name: Commit the generated files + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore: update generated files for v${{steps.build_info.outputs.VERSION}}" + + - name: Create GitHub Release + id: 'automatic_releases' + uses: emsesp/action-automatic-releases@v1.0.0 + with: + repo_token: '${{ secrets.GITHUB_TOKEN }}' + title: Development Build v${{steps.build_info.outputs.VERSION}} + automatic_release_tag: 'latest' + prerelease: true + files: | + CHANGELOG_LATEST.md + ./build/firmware/*.* diff --git a/.github/workflows/github-releases-to-discord.yml b/.github/workflows/github-releases-to-discord.yml index ed1808922..4c559d8f9 100644 --- a/.github/workflows/github-releases-to-discord.yml +++ b/.github/workflows/github-releases-to-discord.yml @@ -1,16 +1,17 @@ -name: 'github-releases-to-discord' +name: 'Publish releases to discord' on: - workflow_dispatch: release: types: [published] jobs: github-releases-to-discord: runs-on: ubuntu-latest + permissions: + contents: read steps: - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: GitHub Releases To Discord uses: SethCohen/github-releases-to-discord@v1.13.1 diff --git a/.github/workflows/pr_check.yml b/.github/workflows/pr_check.yml index 003969d14..1b35c830b 100644 --- a/.github/workflows/pr_check.yml +++ b/.github/workflows/pr_check.yml @@ -1,37 +1,32 @@ -name: 'pr_check' +name: 'Pre-check on PR' +permissions: + contents: read on: workflow_dispatch: pull_request: branches: dev paths: - - '**.c' - - '**.cpp' - - '**.h' - - '**.hpp' - - '**.json' - - '**.py' - - '**.md' - - '.github/workflows/pr_check.yml' - + - 'src/**' + jobs: pre-release: name: 'Automatic pre-release build' runs-on: ubuntu-latest steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 - - name: Install python 3.11 - uses: actions/setup-python@v5 + - name: Install python 3.13 + uses: actions/setup-python@v6 with: - python-version: '3.11' + python-version: '3.13' - name: Install PlatformIO run: | pip install wheel pip install -U platformio - - name: Build native + - name: Run unit tests run: | - platformio run -e native + platformio run -e native-test -t exec diff --git a/.github/workflows/pre_release.yml b/.github/workflows/pre_release.yml deleted file mode 100644 index f5884632b..000000000 --- a/.github/workflows/pre_release.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: 'pre-release' - -on: - workflow_dispatch: - push: - branches: - - 'dev' - -jobs: - pre-release: - name: 'Automatic pre-release build' - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Enable Corepack - run: corepack enable - - - name: Install python 3.11 - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install Node.js 20 - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Get EMS-ESP version - id: build_info - run: | - version=`grep -E '^#define EMSESP_APP_VERSION' ./src/version.h | awk -F'"' '{print $2}'` - echo "VERSION=$version" >> $GITHUB_OUTPUT - - - name: Install PlatformIO - run: | - python -m pip install --upgrade pip - pip install -U platformio - - - name: Build WebUI - run: | - cd interface - yarn install - yarn typesafe-i18n --no-watch - sed -i "s/= 'pl'/= 'en'/" ./src/i18n/i18n-util.ts - yarn build - yarn webUI - - - name: Build all PIO target environments from default_envs - run: | - platformio run - env: - NO_BUILD_WEBUI: true - - - name: Create GitHub Release - id: 'automatic_releases' - uses: emsesp/action-automatic-releases@v1.0.0 - with: - repo_token: '${{ secrets.GITHUB_TOKEN }}' - title: Development Build v${{steps.build_info.outputs.VERSION}} - automatic_release_tag: 'latest' - prerelease: true - files: | - CHANGELOG_LATEST.md - ./build/firmware/*.* diff --git a/.github/workflows/sonar_check.yml b/.github/workflows/sonar_check.yml index 6c8da39e3..2b3af4291 100644 --- a/.github/workflows/sonar_check.yml +++ b/.github/workflows/sonar_check.yml @@ -1,12 +1,14 @@ # see https://github.com/marketplace/actions/sonarcloud-scan-for-c-and-c#usage name: Sonar Check - +permissions: + contents: read + on: push: branches: - dev - # pull_request: - # types: [opened, synchronize, reopened] + paths: + - 'src/**' jobs: build: @@ -17,18 +19,15 @@ jobs: BUILD_WRAPPER_OUT_DIR: bw-output steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: fetch-depth: 0 - - - name: Install sonar-scanner and build-wrapper - uses: SonarSource/sonarcloud-github-c-cpp@v2 - - - name: Run build-wrapper - run: build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make all - - - name: Run sonar-scanner + - name: Install Build Wrapper + uses: SonarSource/sonarqube-scan-action/install-build-wrapper@master + - name: Run Build Wrapper + run: build-wrapper-linux-x86-64 --out-dir ${{ env.BUILD_WRAPPER_OUT_DIR }} make all + - name: SonarQube Scan + uses: SonarSource/sonarqube-scan-action@master env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: sonar-scanner --define sonar.cfamily.compile-commands="${{ env.BUILD_WRAPPER_OUT_DIR }}/compile_commands.json" + diff --git a/.github/workflows/stable_release.yml b/.github/workflows/stable_release.yml new file mode 100644 index 000000000..bf834352b --- /dev/null +++ b/.github/workflows/stable_release.yml @@ -0,0 +1,63 @@ +name: 'Build stable release' + +permissions: + contents: write + +on: + workflow_dispatch: + push: + tags: + - 'v*' + +jobs: + tagged-release: + name: 'Build Stable Release' + runs-on: ubuntu-latest + steps: + + - name: Install python 3.13 + uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install Node.js 24 + uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: Checkout repository + uses: actions/checkout@v5 + + - name: Enable Corepack + run: corepack enable pnpm + + - name: Install PlatformIO + run: | + python -m pip install --upgrade pip + pip install -U platformio + python -m pip install intelhex + + - name: Build webUI + run: | + platformio run -e build_webUI + + - name: Build modbus + run: | + platformio run -e build_modbus + + - name: Build standalone + run: | + platformio run -e build_standalone + + - name: Build all PIO target environments, from default_envs + run: | + platformio run + + - name: Create GitHub Release + uses: emsesp/action-automatic-releases@v1.0.0 + with: + repo_token: '${{ secrets.GITHUB_TOKEN }}' + prerelease: false + files: | + CHANGELOG.md + ./build/firmware/*.* diff --git a/.github/workflows/stale_issues.yml b/.github/workflows/stale_issues.yml new file mode 100644 index 000000000..6903b401f --- /dev/null +++ b/.github/workflows/stale_issues.yml @@ -0,0 +1,27 @@ +name: "Mark or close stale issues and PRs" +permissions: + contents: read + issues: write + pull-requests: write + +on: + schedule: + - cron: "30 1 * * *" + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v10 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + days-before-stale: 30 + days-before-close: 5 + stale-issue-message: "This issue is stale because it has been open 30 days with no activity. Remove stale label or comment otherwise this will be closed in 5 days." + stale-pr-message: "This PR has been automatically marked as stale because there has been no activity in last 30 days. It will be closed if no further activity occurs. Thank you for your contributions." + close-issue-message: "This issue was closed because it has been stalled for 5 days with no activity." + close-pr-message: "This PR was automatically closed because of being stale." + stale-pr-label: "stale" + stale-issue-label: "stale" + exempt-issue-labels: "bug,enhancement,pinned,security" + exempt-pr-labels: "bug,enhancement,pinned,security" diff --git a/.github/workflows/tagged_release.yml b/.github/workflows/tagged_release.yml deleted file mode 100644 index aa5bd46d5..000000000 --- a/.github/workflows/tagged_release.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: 'tagged-release' - -on: - workflow_dispatch: - push: - tags: - - 'v*' - -jobs: - tagged-release: - name: 'Tagged Release' - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Enable Corepack - run: corepack enable - - - name: Install python 3.11 - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Install Node.js 20 - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Install PlatformIO - run: | - python -m pip install --upgrade pip - pip install -U platformio - - - name: Build WebUI - run: | - cd interface - yarn install - yarn typesafe-i18n --no-watch - sed -i "s/= 'pl'/= 'en'/" ./src/i18n/i18n-util.ts - yarn build - yarn webUI - - - name: Build all PIO target environments from default_envs - run: | - platformio run - env: - NO_BUILD_WEBUI: true - - - name: Create GitHub Release - uses: emsesp/action-automatic-releases@v1.0.0 - with: - repo_token: '${{ secrets.GITHUB_TOKEN }}' - prerelease: false - files: | - CHANGELOG.md - ./build/firmware/*.* diff --git a/.github/workflows/test_release.yml b/.github/workflows/test_release.yml index bfd34f80c..63d160048 100644 --- a/.github/workflows/test_release.yml +++ b/.github/workflows/test_release.yml @@ -1,55 +1,65 @@ -name: 'test-release' +name: 'Build test release' on: workflow_dispatch: push: branches: - - 'dev2' + - 'test' + +permissions: + contents: read jobs: pre-release: - name: 'Automatic test-release build' + name: 'Build Test Release' runs-on: ubuntu-latest + permissions: + contents: write steps: - - uses: actions/checkout@v4 + + - name: Install python 3.13 + uses: actions/setup-python@v6 + with: + python-version: '3.13' + + - name: Install Node.js 24 + uses: actions/setup-node@v6 + with: + node-version: 24 + + - name: Checkout repository + uses: actions/checkout@v5 - name: Enable Corepack - run: corepack enable + run: corepack enable pnpm - - uses: actions/setup-python@v5 - with: - python-version: '3.11' - - - name: Use Node.js 20.x - uses: actions/setup-node@v4 - with: - node-version: '20.x' - - - name: Get EMS-ESP source code and version + - name: Get the EMS-ESP version id: build_info run: | - version=`grep -E '^#define EMSESP_APP_VERSION' ./src/version.h | awk -F'"' '{print $2}'` + version=`grep -E '^#define EMSESP_APP_VERSION' ./src/emsesp_version.h | awk -F'"' '{print $2}'` echo "VERSION=$version" >> $GITHUB_OUTPUT - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install -U platformio + python -m pip install intelhex - - name: Build WebUI + - name: Build webUI run: | - cd interface - yarn install - yarn typesafe-i18n --no-watch - sed -i "s/= 'pl'/= 'en'/" ./src/i18n/i18n-util.ts - yarn build - yarn webUI + platformio run -e build_webUI - - name: Build all target environments from default_envs + - name: Build modbus + run: | + platformio run -e build_modbus + + - name: Build standalone + run: | + platformio run -e build_standalone + + - name: Build all PIO target environments, from default_envs run: | platformio run - env: - NO_BUILD_WEBUI: true - name: Create GitHub Release id: 'automatic_releases' diff --git a/.gitignore b/.gitignore index 406ba24b1..bb18f41fa 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,6 @@ .vscode/c_cpp_properties.json .vscode/extensions.json .vscode/launch.json -.vscode/settings.json # c++ compiling .clang_complete @@ -28,14 +27,10 @@ stats.html *.sln *.sw? .pnp.* -*/.yarn/cache/* -*/.yarn/install-state.gz analyse.html interface/vite.config.ts.timestamp* *.local src/ESP32React/WWWData.h -.yarn/* -.yarnrc.yml # i18n generated files interface/src/i18n/i18n-react.tsx @@ -76,3 +71,7 @@ CMakeLists.txt logs/* sdkconfig.* sdkconfig_tasmota_esp32 +pnpm-lock.yaml +.cache/ +interface/.tsbuildinfo +test/test_api/package-lock.json diff --git a/CHANGELOG.md b/CHANGELOG.md index da9a72b55..8e4f2328f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,92 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.8.0] + +## Added + +- analogsensor types: NTC and RGB-Led +- Flag for HMC310 [#2465](https://github.com/emsesp/EMS-ESP32/issues/2465) +- boiler auxheatersource [#2489](https://github.com/emsesp/EMS-ESP32/discussions/2489) +- thermostat last error for RC100/300 [#2501](https://github.com/emsesp/EMS-ESP32/issues/2501) +- boiler 0xC6 telegram [#1963](https://github.com/emsesp/EMS-ESP32/issues/1963) +- CS6800i changes [#2448](https://github.com/emsesp/EMS-ESP32/issues/2448), [#2449](https://github.com/emsesp/EMS-ESP32/issues/2449) +- charging pump [#2544](https://github.com/emsesp/EMS-ESP32/issues/2544) +- hybrid CSH5800iG [#2569](https://github.com/emsesp/EMS-ESP32/issues/2569) +- added EMS Device details to Home Assistant MQTT Discovery +- disinfection command [#2601](https://github.com/emsesp/EMS-ESP32/issues/2601) +- added new board profile for upcoming BBQKees E32V2.2 +- set differential pressure entity in Mixer device +- set set climate action cooling/heating in HA [#2583](https://github.com/emsesp/EMS-ESP32/issues/2583) +- Internal sensors of E32V2_2 +- FW200 display options [#2610](https://github.com/emsesp/EMS-ESP32/discussions/2610) +- CR11 mode settings OFF/MANUAL depends on selTemp [#2437](https://github.com/emsesp/EMS-ESP32/issues/2437) +- implemented eFuse settings for BBQKees boards to store model type and ESP chipset +- Analogsensors for pulse output [#2624](https://github.com/emsesp/EMS-ESP32/discussions/2624) +- Analogsensors frequency input [#2631](https://github.com/emsesp/EMS-ESP32/discussions/2631) +- SRC plus thermostats [#2636](https://github.com/emsesp/EMS-ESP32/issues/2636) +- Greenstar 2000 [#2645](https://github.com/emsesp/EMS-ESP32/issues/2645) +- RC3xx `dhw modetype` [#2659](https://github.com/emsesp/EMS-ESP32/discussions/2659) +- new boiler entities VR0,VR1, compressor speed [#2669](https://github.com/emsesp/EMS-ESP32/issues/2669) +- solar temperature TS16 [#2690](https://github.com/emsesp/EMS-ESP32/issues/2690) +- pumpmode enum for HT3 boilers, add commands for manual defrost, chimneysweeper [#2727](https://github.com/emsesp/EMS-ESP32/issues/2727) +- pid settings [#2735](https://github.com/emsesp/EMS-ESP32/issues/2735) +- refresh MQTT button added to MQTT Settings page +- heating assistance, rounding custum settings [#2763](https://github.com/emsesp/EMS-ESP32/discussions/2763) +- added counter 0..2 for short pulses, high frequency [#2758](https://github.com/emsesp/EMS-ESP32/issues/2758) +- added LWT (Last Will and Testament) to MQTT entities in Home Assistant +- added api/metrics endpoint for prometheus integration by @gr3enk [#2774](https://github.com/emsesp/EMS-ESP32/pull/2774) +- added RTL8201 to eth phy list [#2800](https://github.com/emsesp/EMS-ESP32/issues/2800) +- added partitions to Web UI Version page, so previous firmware versions can be installed [#2837](https://github.com/emsesp/EMS-ESP32/issues/2837) +- button pressures show LED. On a long press (10 seconds) the LED flashes for 5 seconds to indicate a factory reset is about to happen. [#2848](https://github.com/emsesp/EMS-ESP32/issues/2848) +- added `txpause` command to pause the TX, by setting Txmode to 0 (disabled) [#2850](https://github.com/emsesp/EMS-ESP32/issues/2850) + +## Fixed + +- dhw/switchtime [#2490](https://github.com/emsesp/EMS-ESP32/issues/2490) +- switch to secure mqtt [#2492](https://github.com/emsesp/EMS-ESP32/issues/2492) +- update link buttons [#2497](https://github.com/emsesp/EMS-ESP32/issues/2497) +- refresh scheduler states [#2502](https://github.com/emsesp/EMS-ESP32/discussions/2502) +- also rebuild HA config on mqtt connect for scheduler, custom and shower +- FB100 controls the hc, not the master [#2510](https://github.com/emsesp/EMS-ESP32/issues/2510) +- IPM DHW module, [#2524](https://github.com/emsesp/EMS-ESP32/issues/2524) +- charge optimization [#2543](https://github.com/emsesp/EMS-ESP32/issues/2543) +- shower active state retained, shows correctly in HA +- MQTT Command Topic with slashes [#2571](https://github.com/emsesp/EMS-ESP32/issues/2571) +- Add pulsed water meter input to V1.3 gateway with Lilygo S3 [#2550](https://github.com/emsesp/EMS-ESP32/issues/2550) +- fix missing long 10-second press of Button to perform a factory reset +- fix wwMaxPower on Junkers ZBS14 [#2609](https://github.com/emsesp/EMS-ESP32/issues/2609) +- ventilation bypass state from telegram 0x55C [#1197](https://github.com/emsesp/EMS-ESP32/issues/1197) +- set selflowtemp for ems+ boilers [#2641](https://github.com/emsesp/EMS-ESP32/discussions/2641) +- syslog timestamp [#2704](https://github.com/emsesp/EMS-ESP32/issues/2704) +- fixed FS format command [#2720](https://github.com/emsesp/EMS-ESP32/discussions/2720) +- dhw priority setting to boiler and mixer, telegrams 0x2CC, 0x2CD, etc. +- check for valid GPIOs when board profile is changed [#2841](https://github.com/emsesp/EMS-ESP32/issues/2841) + +## Changed + +- show console log with ISO date/time [#2533](https://github.com/emsesp/EMS-ESP32/discussions/2533) +- removed ESP32 CPU temperature +- updated core libraries like AsyncTCP, AsyncWebServer and Modbus +- remove command `scan deep` +- ignore repeated `forceheatingoff` commands [#2641](https://github.com/emsesp/EMS-ESP32/discussions/2641) +- optimized web for better performance by adding lazy loading and caching +- internal system analog sensors (core_voltage, supply_voltage and gateway_temperature) cannot be accidentally removed +- double click button reconnects EMS-ESP to AP +- place system message command in side scheduler loop to reduce stack memory usage by 2KB +- syslog mark interval set to 1 hour +- handle process_telegram in oneloop +- improved GPIO validation for Analog Sensors and System GPIOs +- entities with no values are greyed out in the Web UI in the Customization page +- added System Status to Web Status page +- show number on entities and supported languages in log on boot +- on tx read fail delay the 3rd. retry 2 sec +- move vectors and lists to PSRAM +- removed unused last topic/payload echo-check +- added Home Assistant device details to MQTT Discovery for all devices +- device_class and state_class changes for HA MQTT Discovery [#2825](https://github.com/emsesp/EMS-ESP32/issues/2825) + + ## [3.7.2] 22 March 2025 ## Added @@ -85,7 +171,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - The automatically generated temperature sensor ID has replaced dashes (`-`) with underscores (`_`) to be compatible with Home Assistant. - `api/system/info` has it's JSON key names changed to camelCase syntax. -For more details go to [docs.emsesp.org](https://docs.emsesp.org/). +For more details go to [emsesp.org](https://emsesp.org/). ## Added @@ -217,7 +303,7 @@ For more details go to [docs.emsesp.org](https://docs.emsesp.org/). ## **IMPORTANT! BREAKING CHANGES** -Writeable Text entities have moved from type `sensor` to `text` in Home Assistant to make them also editable within an HA dashboard. Examples are `datetime`, `holidays`, `switchtime`, `vacations`, `maintenancedate`. You will need to manually remove any old discovery topics from your MQTT broker using an application like MQTT Explorer. +Writeable Text entities have moved from type `sensor` to `text` in Home Assistant to make them also editable within an HA dashboard. Examples are `datetime`, `holidays`, `switchtime`, `vacations`, `maintenancedate`... You will need to manually remove any old discovery topics from your MQTT broker using an application like MQTT Explorer. ## Added diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 825c32f0d..b47972202 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -1 +1,3 @@ # Changelog + +For more details go to [emsesp.org](https://emsesp.org/). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3967b676b..04d99e530 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,7 +6,7 @@ Everybody is welcome and invited to contribute to the EMS-ESP Project by: - providing Pull Requests (Features, Fixes, suggestions) - testing new released features and report issues on your EMS equipment -- contributing to missing [documentation](https://docs.emsesp.org) +- contributing to missing [documentation](https://emsesp.org) This document describes rules that are in effect for this repository, meant for handling issues by contributors in the issue tracker and PRs. @@ -69,7 +69,7 @@ Format: `(): ` ## Example -``` +```text feat: add hat wobble ^--^ ^------------^ | | @@ -96,7 +96,7 @@ References: ## Contributor License Agreement (CLA) -``` +```text By making a contribution to this project, I certify that: (a) The contribution was created in whole or in part by me and I diff --git a/Makefile b/Makefile index 88c8e03a0..fdab1d661 100644 --- a/Makefile +++ b/Makefile @@ -19,17 +19,20 @@ C = $(words $N)$(eval N := x $N) ECHO = python3 $(I)/scripts/echo_progress.py --stepno=$C --nsteps=$T endif -# determine number of parallel compiles based on OS +# Optimize parallel build configuration UNAME_S := $(shell uname -s) +JOBS ?= 1 ifeq ($(UNAME_S),Linux) EXTRA_CPPFLAGS = -D LINUX - JOBS ?= $(shell nproc) + JOBS := $(shell nproc) endif ifeq ($(UNAME_S),Darwin) EXTRA_CPPFLAGS = -D OSX -Wno-tautological-constant-out-of-range-compare - JOBS ?= $(shell sysctl -n hw.ncpu) + JOBS := $(shell sysctl -n hw.ncpu) endif -MAKEFLAGS += -j $(JOBS) -l $(JOBS) + +# Set optimal parallel build settings +MAKEFLAGS += -j$(JOBS) -l$(shell echo $$(($(JOBS) * 2))) # $(info Number of jobs: $(JOBS)) @@ -44,8 +47,8 @@ MAKEFLAGS += -j $(JOBS) -l $(JOBS) #---------------------------------------------------------------------- TARGET := emsesp BUILD := build -SOURCES := src/core src/devices src/web src/test lib_standalone lib/semver lib/espMqttClient/src lib/espMqttClient/src/* lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/PButton -INCLUDES := src/core src/devices src/web src/test lib/* lib_standalone lib/semver lib/espMqttClient/src lib/espMqttClient/src/Transport lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src +SOURCES := src/core src/devices src/web src/test lib_standalone lib/semver lib/espMqttClient/src lib/espMqttClient/src/* lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/PButton +INCLUDES := src/core src/devices src/web src/test lib_standalone lib/* lib/semver lib/espMqttClient/src lib/espMqttClient/src/Transport lib/ArduinoJson/src lib/uuid-common/src lib/uuid-console/src lib/uuid-log/src lib/uuid-telnet/src lib/uuid-syslog/src LIBRARIES := CPPCHECK = cppcheck @@ -64,7 +67,7 @@ DEFINES += -DARDUINOJSON_ENABLE -DARDUINOJSON_ENABLE_ARDUINO_STRING -DARDUINOJSO DEFINES += -DEMSESP_STANDALONE -DEMSESP_TEST -DEMSESP_DEBUG -DEMC_RX_BUFFER_SIZE=1500 DEFINES += $(ARGS) -DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.7.3-dev\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32S3\" +DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DEFAULT_VERSION=\"3.8.0-dev.0\" -DEMSESP_DEFAULT_BOARD_PROFILE=\"S32S3\" #---------------------------------------------------------------------- # Sources & Files @@ -72,16 +75,21 @@ DEFAULTS = -DEMSESP_DEFAULT_LOCALE=\"en\" -DEMSESP_DEFAULT_TX_MODE=8 -DEMSESP_DE OUTPUT := $(CURDIR)/$(TARGET) SYMBOLS := $(CURDIR)/$(BUILD)/$(TARGET).out -CSOURCES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.c)) -CXXSOURCES := $(foreach dir,$(SOURCES),$(wildcard $(dir)/*.cpp)) +# Optimize source discovery - use shell find for better performance +CSOURCES := $(shell find $(SOURCES) -name "*.c" 2>/dev/null) +CXXSOURCES := $(shell find $(SOURCES) -name "*.cpp" 2>/dev/null) -OBJS := $(patsubst %,$(BUILD)/%.o,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)) ) -DEPS := $(patsubst %,$(BUILD)/%.d,$(basename $(CSOURCES)) $(basename $(CXXSOURCES)) ) +OBJS := $(patsubst %,$(BUILD)/%.o,$(basename $(CSOURCES)) $(basename $(CXXSOURCES))) +DEPS := $(patsubst %,$(BUILD)/%.d,$(basename $(CSOURCES)) $(basename $(CXXSOURCES))) -INCLUDE += $(addprefix -I,$(foreach dir,$(INCLUDES), $(wildcard $(dir)))) -INCLUDE += $(addprefix -I,$(foreach dir,$(LIBRARIES),$(wildcard $(dir)/include))) +# Optimize include path discovery +INCLUDE_DIRS := $(shell find $(INCLUDES) -type d 2>/dev/null) +LIBRARY_INCLUDES := $(shell find $(LIBRARIES) -name "include" -type d 2>/dev/null) +INCLUDE += $(addprefix -I,$(INCLUDE_DIRS) $(LIBRARY_INCLUDES)) -LDLIBS += $(addprefix -L,$(foreach dir,$(LIBRARIES),$(wildcard $(dir)/lib))) +# Optimize library path discovery +LIBRARY_DIRS := $(shell find $(LIBRARIES) -name "lib" -type d 2>/dev/null) +LDLIBS += $(addprefix -L,$(LIBRARY_DIRS)) #---------------------------------------------------------------------- # Compiler & Linker @@ -98,13 +106,12 @@ CXX := /usr/bin/g++ # LDFLAGS Linker Flags #---------------------------------------------------------------------- CPPFLAGS += $(DEFINES) $(DEFAULTS) $(INCLUDE) -CPPFLAGS += -ggdb -g3 -O3 -CPPFLAGS += -MMD -CPPFLAGS += -flto=auto -fno-lto -CPPFLAGS += -Wall -Wextra -Werror -CPPFLAGS += -Wswitch-enum -CPPFLAGS += -Wno-unused-parameter -CPPFLAGS += -Wno-missing-braces +CPPFLAGS += -ggdb -g3 -MMD +CPPFLAGS += -flto=auto +CPPFLAGS += -Wall -Wextra -Werror -Wswitch-enum +CPPFLAGS += -Wno-unused-parameter -Wno-missing-braces -Wno-vla-cxx-extension +CPPFLAGS += -ffunction-sections -fdata-sections -fno-exceptions -fno-rtti -fno-threadsafe-statics +CPPFLAGS += -Os -DNDEBUG CPPFLAGS += $(EXTRA_CPPFLAGS) @@ -125,11 +132,13 @@ else LD := $(CXX) endif -#DEPFLAGS += -MF $(BUILD)/$*.d +# Dependency file generation +DEPFLAGS += -MF $(BUILD)/$*.d -MT $@ LINK.o = $(LD) $(LDFLAGS) $(LDLIBS) $^ -o $@ COMPILE.c = $(CC) $(C_STANDARD) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ COMPILE.cpp = $(CXX) $(CXX_STANDARD) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ +COMPILE.s = $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@ #---------------------------------------------------------------------- # Special Built-in Target @@ -142,7 +151,10 @@ COMPILE.cpp = $(CXX) $(CXX_STANDARD) $(CXXFLAGS) $(DEPFLAGS) -c $< -o $@ .SUFFIXES: .INTERMEDIATE: .PRECIOUS: $(OBJS) $(DEPS) -.PHONY: all clean help +.PHONY: all clean help cppcheck run + +# Enable second expansion for more flexible rules +.SECONDEXPANSION: #---------------------------------------------------------------------- # Targets @@ -157,7 +169,6 @@ $(OUTPUT): $(OBJS) @mkdir -p $(@D) @$(ECHO) Linking $@ $(LINK.o) - $(SYMBOLS.out) $(BUILD)/%.o: %.c @mkdir -p $(@D) @@ -171,6 +182,7 @@ $(BUILD)/%.o: %.cpp $(BUILD)/%.o: %.s @mkdir -p $(@D) + @$(ECHO) Compiling $@ @$(COMPILE.s) cppcheck: $(SOURCES) @@ -185,8 +197,15 @@ clean: @$(RM) -rf $(BUILD) $(OUTPUT) help: - @echo available targets: all run clean - @echo $(OUTPUT) + @echo "Available targets:" + @echo " all - Build the project (default)" + @echo " run - Build and run the executable" + @echo " clean - Remove build artifacts" + @echo " cppcheck - Run static analysis" + @echo " help - Show this help message" + @echo "" + @echo "Output: $(OUTPUT)" + @echo "Jobs: $(JOBS)" -include $(DEPS) diff --git a/README.md b/README.md index b1d36b4f8..93b2ed589 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Contribute - + Guides @@ -35,7 +35,7 @@ [![chat](https://img.shields.io/discord/816637840644505620.svg?style=flat-square&color=blueviolet)](https://discord.gg/3J3GgnzpyT) [![GitHub stars](https://img.shields.io/github/stars/emsesp/EMS-ESP32.svg?style=social&label=Star)](https://github.com/emsesp/EMS-ESP32/stargazers) -[![GitHub forks](https://img.shields.io/github/forks/emsesp/EMS-ESP32.svg?style=social&label=Fork)](https://github.com/emsesp/EMS-ES32P/network) +[![GitHub forks](https://img.shields.io/github/forks/emsesp/EMS-ESP32.svg?style=social&label=Fork)](https://github.com/emsesp/EMS-ESP32/network) [![donate](https://img.shields.io/badge/donate-PayPal-blue.svg)](https://www.paypal.com/paypalme/prderbyshire/2) **EMS-ESP** is an open-source firmware for the Espressif ESP32 microcontroller to communicate with **EMS** (Energy Management System) compatible equipment from manufacturers such as Bosch, Buderus, Nefit, Junkers, Worcester, Sieger, elm.leblanc and iVT. @@ -60,17 +60,17 @@ It requires a small circuit to interface with the EMS bus which can be purchased ## 🚀  **Installing** -Head over to [download.emsesp.org](https://download.emsesp.org) for instructions on how to install EMS-ESP. There is also further details on which boards are supported in [this section](https://docs.emsesp.org/Getting-Started/#first-time-install) of the documentation. +Head over to the [Installation Guide](https://emsesp.org/Installing) section of the documentation for instructions on how to install EMS-ESP. ## 📋  **Documentation** -Visit [emsesp.org](https://docs.emsesp.org) for more details on how to install and configure EMS-ESP. There is also a collection of Frequently Asked Questions and Troubleshooting tips with example customizations from the community. +Visit [emsesp.org](https://emsesp.org) for more details on how to install and configure EMS-ESP. There is also a collection of Frequently Asked Questions and Troubleshooting tips with example customizations from the community. ## 💬  **Getting Support** To chat with the community reach out on our [Discord Server](https://discord.gg/3J3GgnzpyT). -If you find an issue or have a request, see [here](https://docs.emsesp.org/Support/) on how to submit a bug report or feature request. +If you find an issue or have a request, see [how to request support](https://emsesp.org/Support/) on how to submit a bug report or feature request. ## 🎥  **Live Demo** @@ -82,13 +82,19 @@ EMS-ESP is a project created by [proddy](https://github.com/proddy) and owned an If you like **EMS-ESP**, please give it a ✨ on GitHub, or even better fork it and contribute. You can also offer a small donation. This is an open-source project maintained by volunteers, and your support is greatly appreciated. +## 📦  **Building** + +To build the web interface only, run `platformio run -e build_webUI`. This will install the necessary dependencies and build the web interface and also create the embedded code used need to build the firmware. You can run the web interface locally by going to the `interface` directory and running `pnpm standalone`. + +To build the firmware, run `platformio run`. This will build the firmware for all ESP32 modules and place the binaries in the `build/firmware` folder. If you want to configure the build for a single platform create a local `pio_local.ni` file in the root directory (see example in `pio_local.ini_example`). + ## 📢  **Libraries used** -- [esp8266-react](https://github.com/rjwats/esp8266-react) by @rjwats for the core framework that provides the Web UI, which has been heavily modified +- [esp8266-react](https://github.com/rjwats/esp8266-react) originally by @rjwats for the core framework that provides the Web UI, which has been heavily modified - [uuid-\*](https://github.com/nomis/mcu-uuid-console) from @nomis. The console, syslog, telnet and logging are based off these awesome open source libraries - [ArduinoJson](https://github.com/bblanchon/ArduinoJson) for all the JSON processing - [espMqttClient](https://github.com/bertmelis/espMqttClient) for the MQTT client -- ESPAsyncWebServer and AsyncTCP for the Web server and TCP backends, with custom modifications for performance +- [ESPAsyncWebServer](https://github.com/ESP32Async/ESPAsyncWebServer) and [AsyncTCP](https://github.com/ESP32Async/AsyncTCP) for the Web server ## 📜  **License** diff --git a/boards/s3_32M_P.json b/boards/s3_32M_P.json index 1aa0746c1..65e0b390b 100644 --- a/boards/s3_32M_P.json +++ b/boards/s3_32M_P.json @@ -25,7 +25,7 @@ "upload": { "flash_size": "32MB", "maximum_ram_size": 327680, - "maximum_size": 16777216, + "maximum_size": 33554432, "require_upload_port": true, "speed": 460800 }, diff --git a/boards/seeed_xiao_esp32c6.json b/boards/seeed_xiao_esp32c6.json new file mode 100644 index 000000000..224f0e215 --- /dev/null +++ b/boards/seeed_xiao_esp32c6.json @@ -0,0 +1,48 @@ +{ + "build": { + "core": "esp32", + "extra_flags": [ + "-DARDUINO_XIAO_ESP32C6", + "-DARDUINO_USB_MODE=1", + "-DARDUINO_USB_CDC_ON_BOOT=1" + ], + "f_cpu": "160000000L", + "f_flash": "80000000L", + "flash_mode": "qio", + "hwids": [ + [ + "0x2886", + "0x0046" + ], + [ + "0x303a", + "0x1001" + ] + ], + "mcu": "esp32c6", + "variant": "XIAO_ESP32C6" + }, + "connectivity": [ + "wifi", + "bluetooth", + "zigbee", + "thread" + ], + "debug": { + "openocd_target": "esp32c6.cfg" + }, + "frameworks": [ + "arduino", + "espidf" + ], + "name": "Seeed Studio XIAO ESP32C6", + "upload": { + "flash_size": "4MB", + "maximum_ram_size": 327680, + "maximum_size": 4194304, + "require_upload_port": true, + "speed": 460800 + }, + "url": "https://wiki.seeedstudio.com/XIAO_ESP32C6_Getting_Started/", + "vendor": "Seeed Studio" +} diff --git a/cspell.json b/cspell.json index 403b84e0a..24df974df 100644 --- a/cspell.json +++ b/cspell.json @@ -32,6 +32,9 @@ "**/*.json", "src/core/modbus_entity_parameters.hpp", "sdkconfig.*", - "managed_components/**" + "managed_components/**", + "pnpm-*.yaml", + "vite.config.ts", + "lib/esp32-psram/**" ] } \ No newline at end of file diff --git a/docs/Modbus-Entity-Registers.md b/docs/Modbus-Entity-Registers.md index b0b4e6aa9..05c5b8d09 100644 --- a/docs/Modbus-Entity-Registers.md +++ b/docs/Modbus-Entity-Registers.md @@ -1,5856 +1,6451 @@ - - +# Modbus Entity/Register Mapping -# Entity/Register Mapping +:::warning +This file has been auto-generated. Do not modify. +::: -!!! note +## Devices of type \_boiler - This file has been auto-generated. Do not modify. +### CS5800i, CS6800i, WLW176i, WLW186i -## Devices of type *alert* -### EM10 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| setflowtemp | set flow temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 0 | 1 | 1 | -| setburnpow | burner set power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 1 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| mandefrost | manual defrost | cmd [off\|on] | | true | DEVICE_DATA | 84 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 0 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 87 | 2 | 1/100 | +| nrgcool | energy cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 89 | 2 | 1/100 | +| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 91 | 2 | 1/100 | +| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 93 | 2 | 1/100 | +| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 95 | 2 | 1/100 | +| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 97 | 2 | 1/100 | +| metercool | meter cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 99 | 2 | 1/100 | +| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 2 | 2 | 1/100 | +| uptimetotal | heatpump total uptime | time (>=0<=279620) | minutes | false | DEVICE_DATA | 101 | 2 | 1/60 | +| uptimecontrol | total operating time heat | time (>=0<=279620) | minutes | false | DEVICE_DATA | 103 | 2 | 1/60 | +| uptimecompheating | operating time compressor heating | time (>=0<=279620) | minutes | false | DEVICE_DATA | 105 | 2 | 1/60 | +| uptimecompcooling | operating time compressor cooling | time (>=0<=279620) | minutes | false | DEVICE_DATA | 107 | 2 | 1/60 | +| dhw.uptimecomp | operating time compressor | time (>=0<=279620) | minutes | false | DHW | 4 | 2 | 1/60 | +| uptimecomppool | operating time compressor pool | time (>=0<=279620) | minutes | false | DEVICE_DATA | 109 | 2 | 1/60 | +| totalcompstarts | total compressor control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 111 | 2 | 1 | +| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 113 | 2 | 1 | +| coolingstarts | cooling control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 115 | 2 | 1 | +| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 6 | 2 | 1 | +| poolstarts | pool control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 117 | 2 | 1 | +| nrgconstotal | total energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 119 | 2 | 1 | +| nrgconscomptotal | total energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 121 | 2 | 1 | +| nrgconscompheating | energy consumption compressor heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 123 | 2 | 1 | +| dhw.nrgconscomp | energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DHW | 8 | 2 | 1 | +| nrgconscompcooling | energy consumption compressor cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 125 | 2 | 1 | +| nrgconscomppool | energy consumption compressor pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 127 | 2 | 1 | +| auxelecheatnrgconstotal | total aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 129 | 2 | 1 | +| auxelecheatnrgconsheating | aux elec. heater energy consumption heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 131 | 2 | 1 | +| dhw.auxelecheatnrgcons | aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DHW | 10 | 2 | 1 | +| auxelecheatnrgconspool | aux elec. heater energy consumption pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 133 | 2 | 1 | +| nrgsupptotal | total energy supplied | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 135 | 2 | 1 | +| nrgsuppheating | total energy supplied heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 137 | 2 | 1 | +| dhw.nrgsupp | total energy warm supplied | uint24 (>=0<=16777214) | kWh | false | DHW | 12 | 2 | 1 | +| nrgsuppcooling | total energy supplied cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 139 | 2 | 1 | +| nrgsupppool | total energy supplied pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 141 | 2 | 1 | +| hppower | compressor power output | uint16 (>=0<=3199) | kW | false | DEVICE_DATA | 143 | 1 | 1/10 | +| hpmaxpower | compressor max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 144 | 1 | 1 | +| pvmaxcomp | pv compressor max power | uint8 (>=0<=25) | kW | true | DEVICE_DATA | 145 | 1 | 1/10 | +| powerreduction | power reduction | uint8 (>=30<=60) | % | true | DEVICE_DATA | 146 | 1 | 10 | +| hpsetdiffpress | set differential pressure | uint8 (>=150<=750) | mbar | true | DEVICE_DATA | 147 | 1 | 50 | +| hpcompon | hp compressor | boolean | | false | DEVICE_DATA | 148 | 1 | 1 | +| hpactivity | compressor activity | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 149 | 1 | 1 | +| hpbrinepumpspd | brine pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 150 | 1 | 1 | +| hpswitchvalve | switch valve | boolean | | false | DEVICE_DATA | 151 | 1 | 1 | +| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 152 | 1 | 1 | +| hptargetspd | compressor target speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 153 | 1 | 1 | +| hpcircspd | circulation pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 154 | 1 | 1 | +| recvalve | receiver valve VR0 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 155 | 1 | 1 | +| expvalve | expansion valve VR1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 156 | 1 | 1 | +| hpbrinein | brine in/evaporator | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 157 | 1 | 1/10 | +| hpbrineout | brine out/condenser | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 158 | 1 | 1/10 | +| hptc0 | heat carrier return (TC0) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 159 | 1 | 1/10 | +| hptc1 | heat carrier forward (TC1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 160 | 1 | 1/10 | +| hptc3 | condenser temperature (TC3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 161 | 1 | 1/10 | +| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 162 | 1 | 1/10 | +| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 163 | 1 | 1/10 | +| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 164 | 1 | 1/10 | +| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 165 | 1 | 1/10 | +| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 166 | 1 | 1/10 | +| hptr7 | refrigerant temperature gas side (condenser input) (TR7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 167 | 1 | 1/10 | +| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 168 | 1 | 1/10 | +| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 169 | 1 | 1/10 | +| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 170 | 1 | 1/10 | +| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 171 | 1 | 1/10 | +| hptw1 | reservoir temp (TW1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 172 | 1 | 1/10 | +| poolsettemp | pool set temperature | uint8 (>=0<=127) | C | true | DEVICE_DATA | 173 | 1 | 1/2 | +| hpin1 | input 1 state | boolean | | false | DEVICE_DATA | 174 | 1 | 1 | +| hpin1opt | input 1 options | string | | true | DEVICE_DATA | 175 | 8 | 1 | +| hpin2 | input 2 state | boolean | | false | DEVICE_DATA | 183 | 1 | 1 | +| hpin2opt | input 2 options | string | | true | DEVICE_DATA | 184 | 8 | 1 | +| hpin3 | input 3 state | boolean | | false | DEVICE_DATA | 192 | 1 | 1 | +| hpin3opt | input 3 options | string | | true | DEVICE_DATA | 193 | 8 | 1 | +| hpin4 | input 4 state | boolean | | false | DEVICE_DATA | 201 | 1 | 1 | +| hpin4opt | input 4 options | string | | true | DEVICE_DATA | 202 | 8 | 1 | +| maxheatcomp | heat limit compressor | enum [0 kW\|3 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 210 | 1 | 1 | +| maxheatheat | heat limit heating | enum [3 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 211 | 1 | 1 | +| dhw.maxheat | heat limit | enum [3 kW\|6 kW\|9 kW] | | true | DHW | 14 | 1 | 1 | +| auxheatersource | aux heater source | enum [not installed\|electric heater\|exclusive\|parallel\|hybrid] | | true | DEVICE_DATA | 212 | 1 | 1 | +| pvcooling | cooling only with PV | boolean | | true | DEVICE_DATA | 213 | 1 | 1 | +| auxheateronly | aux heater only | boolean | | true | DEVICE_DATA | 214 | 1 | 1 | +| auxheateroff | disable aux heater | boolean | | true | DEVICE_DATA | 215 | 1 | 1 | +| auxheaterstatus | aux heater status | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 216 | 1 | 1 | +| auxheaterlevel | aux heater level | uint8 (>=0<=100) | % | false | DEVICE_DATA | 217 | 1 | 1 | +| auxheaterdelay | aux heater on delay | uint16 (>=10<=1000) | K*min | true | DEVICE_DATA | 218 | 1 | 10 | +| auxmaxlimit | aux heater max limit | uint8 (>=0<=10) | K | true | DEVICE_DATA | 219 | 1 | 1/10 | +| auxlimitstart | aux heater limit start | uint8 (>=0<=10) | K | true | DEVICE_DATA | 220 | 1 | 1/10 | +| auxheatrmode | aux heater mode | enum [eco\|comfort] | | true | DEVICE_DATA | 221 | 1 | 1 | +| hphystheat | on/off hyst heat | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 222 | 1 | 5 | +| hphystcool | on/off hyst cool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 223 | 1 | 5 | +| hphystpool | on/off hyst pool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 224 | 1 | 5 | +| silentmode | silent mode | enum [off\|auto\|on] | | true | DEVICE_DATA | 225 | 1 | 1 | +| silentfrom | silent mode from | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 226 | 1 | 15 | +| silentto | silent mode to | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 227 | 1 | 15 | +| mintempsilent | min outside temp for silent mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 228 | 1 | 1 | +| tempparmode | outside temp parallel mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 229 | 1 | 1 | +| auxheatmix | aux heater mixing valve | int8 (>=-100<=100) | % | false | DEVICE_DATA | 230 | 1 | 1 | +| tempdiffheat | temp diff TC3/TC0 heat | uint8 (>=2<=10) | K | true | DEVICE_DATA | 231 | 1 | 1/10 | +| tempdiffcool | temp diff TC3/TC0 cool | uint8 (>=2<=10) | K | true | DEVICE_DATA | 232 | 1 | 1/10 | +| vpcooling | valve/pump cooling | boolean | | true | DEVICE_DATA | 233 | 1 | 1 | +| heatcable | heating cable | boolean | | true | DEVICE_DATA | 234 | 1 | 1 | +| vc0valve | VC0 valve | boolean | | true | DEVICE_DATA | 235 | 1 | 1 | +| primepump | primary heatpump | boolean | | true | DEVICE_DATA | 236 | 1 | 1 | +| primepumpmod | primary heatpump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 237 | 1 | 1 | +| hp3way | 3-way valve | boolean | | true | DEVICE_DATA | 238 | 1 | 1 | +| elheatstep1 | el. heater step 1 | boolean | | true | DEVICE_DATA | 239 | 1 | 1 | +| elheatstep2 | el. heater step 2 | boolean | | true | DEVICE_DATA | 240 | 1 | 1 | +| elheatstep3 | el. heater step 3 | boolean | | true | DEVICE_DATA | 241 | 1 | 1 | +| hpea0 | condensate reservoir heating (EA0) | boolean | | false | DEVICE_DATA | 242 | 1 | 1 | +| hppumpmode | primary heatpump mode | enum [auto\|continuous] | | true | DEVICE_DATA | 243 | 1 | 1 | +| fan | fan | uint8 (>=20<=100) | % | true | DEVICE_DATA | 244 | 1 | 1 | +| fanspd | fan speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 245 | 1 | 1 | +| shutdown | shutdown | cmd [off\|on] | | true | DEVICE_DATA | 246 | 1 | 1 | +| hpcurrpower | compressor current power | uint16 (>=0<=31999) | W | false | DEVICE_DATA | 247 | 1 | 1 | +| hppowerlimit | power limit | uint16 (>=0<=31999) | W | true | DEVICE_DATA | 248 | 1 | 1 | +| dhw.alternatingop | alternating operation | boolean | | true | DHW | 15 | 1 | 1 | +| dhw.altopprioheat | prioritise heating during dhw | uint8 (>=20<=120) | minutes | true | DHW | 16 | 1 | 1 | +| dhw.altopprio | prioritise dhw during heating | uint8 (>=30<=120) | minutes | true | DHW | 17 | 1 | 1 | +| dhw.comfoff | comfort switch off | uint8 (>=15<=65) | C | true | DHW | 18 | 1 | 1 | +| dhw.ecooff | eco switch off | uint8 (>=15<=65) | C | true | DHW | 19 | 1 | 1 | +| dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | +| dhw.comfdiff | comfort diff | uint8 (>=4<=15) | K | true | DHW | 21 | 1 | 1 | +| dhw.ecodiff | eco diff | uint8 (>=4<=15) | K | true | DHW | 22 | 1 | 1 | +| dhw.ecoplusdiff | eco+ diff | uint8 (>=4<=15) | K | true | DHW | 23 | 1 | 1 | +| dhw.comfstop | comfort stop temp | uint8 (>=0<=254) | C | true | DHW | 24 | 1 | 1 | +| dhw.ecostop | eco stop temp | uint8 (>=0<=254) | C | true | DHW | 25 | 1 | 1 | +| dhw.ecoplusstop | eco+ stop temp | uint8 (>=0<=254) | C | true | DHW | 26 | 1 | 1 | +| dhw.hpcircpump | circulation pump available during dhw | boolean | | true | DHW | 27 | 1 | 1 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | + +### Greenstar 2000 -## Devices of type *boiler* -### BK13/BK15, Smartline, GB1*2 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | ### C1200W -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### CS*800i, Logatherm WLW* | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 0 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | -| nrgcool | energy cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 87 | 2 | 1/100 | -| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 89 | 2 | 1/100 | -| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 91 | 2 | 1/100 | -| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 93 | 2 | 1/100 | -| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 95 | 2 | 1/100 | -| metercool | meter cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 97 | 2 | 1/100 | -| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 2 | 2 | 1/100 | -| uptimetotal | heatpump total uptime | time (>=0<=279620) | minutes | false | DEVICE_DATA | 99 | 2 | 1/60 | -| uptimecontrol | total operating time heat | time (>=0<=279620) | minutes | false | DEVICE_DATA | 101 | 2 | 1/60 | -| uptimecompheating | operating time compressor heating | time (>=0<=279620) | minutes | false | DEVICE_DATA | 103 | 2 | 1/60 | -| uptimecompcooling | operating time compressor cooling | time (>=0<=279620) | minutes | false | DEVICE_DATA | 105 | 2 | 1/60 | -| dhw.uptimecomp | operating time compressor | time (>=0<=279620) | minutes | false | DHW | 4 | 2 | 1/60 | -| uptimecomppool | operating time compressor pool | time (>=0<=279620) | minutes | false | DEVICE_DATA | 107 | 2 | 1/60 | -| totalcompstarts | total compressor control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 109 | 2 | 1 | -| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 111 | 2 | 1 | -| coolingstarts | cooling control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 113 | 2 | 1 | -| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 6 | 2 | 1 | -| poolstarts | pool control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 115 | 2 | 1 | -| nrgconstotal | total energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 117 | 2 | 1 | -| nrgconscomptotal | total energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 119 | 2 | 1 | -| nrgconscompheating | energy consumption compressor heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 121 | 2 | 1 | -| dhw.nrgconscomp | energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DHW | 8 | 2 | 1 | -| nrgconscompcooling | energy consumption compressor cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 123 | 2 | 1 | -| nrgconscomppool | energy consumption compressor pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 125 | 2 | 1 | -| auxelecheatnrgconstotal | total aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 127 | 2 | 1 | -| auxelecheatnrgconsheating | aux elec. heater energy consumption heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 129 | 2 | 1 | -| dhw.auxelecheatnrgcons | aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DHW | 10 | 2 | 1 | -| auxelecheatnrgconspool | aux elec. heater energy consumption pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 131 | 2 | 1 | -| nrgsupptotal | total energy supplied | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 133 | 2 | 1 | -| nrgsuppheating | total energy supplied heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 135 | 2 | 1 | -| dhw.nrgsupp | total energy warm supplied | uint24 (>=0<=16777214) | kWh | false | DHW | 12 | 2 | 1 | -| nrgsuppcooling | total energy supplied cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 137 | 2 | 1 | -| nrgsupppool | total energy supplied pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 139 | 2 | 1 | -| hppower | compressor power output | uint16 (>=0<=3199) | kW | false | DEVICE_DATA | 141 | 1 | 1/10 | -| hpmaxpower | compressor max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 142 | 1 | 1 | -| pvmaxcomp | pv compressor max power | uint8 (>=0<=25) | kW | true | DEVICE_DATA | 143 | 1 | 1/10 | -| powerreduction | power reduction | uint8 (>=30<=60) | % | true | DEVICE_DATA | 144 | 1 | 10 | -| hpsetdiffpress | set differential pressure | uint8 (>=150<=750) | mbar | true | DEVICE_DATA | 145 | 1 | 50 | -| hpcompon | hp compressor | boolean | | false | DEVICE_DATA | 146 | 1 | 1 | -| hpactivity | compressor activity | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 147 | 1 | 1 | -| hpbrinepumpspd | brine pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 148 | 1 | 1 | -| hpswitchvalve | switch valve | boolean | | false | DEVICE_DATA | 149 | 1 | 1 | -| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 150 | 1 | 1 | -| hpcircspd | circulation pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 151 | 1 | 1 | -| hpbrinein | brine in/evaporator | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 152 | 1 | 1/10 | -| hpbrineout | brine out/condenser | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 153 | 1 | 1/10 | -| hptc0 | heat carrier return (TC0) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 154 | 1 | 1/10 | -| hptc1 | heat carrier forward (TC1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 155 | 1 | 1/10 | -| hptc3 | condenser temperature (TC3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 156 | 1 | 1/10 | -| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 157 | 1 | 1/10 | -| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 158 | 1 | 1/10 | -| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 159 | 1 | 1/10 | -| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 160 | 1 | 1/10 | -| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 161 | 1 | 1/10 | -| hptr7 | refrigerant temperature gas side (condenser input) (TR7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 162 | 1 | 1/10 | -| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 163 | 1 | 1/10 | -| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 164 | 1 | 1/10 | -| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 165 | 1 | 1/10 | -| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 166 | 1 | 1/10 | -| hptw1 | reservoir temp (TW1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 167 | 1 | 1/10 | -| poolsettemp | pool set temperature | uint8 (>=0<=127) | C | true | DEVICE_DATA | 168 | 1 | 1/2 | -| hp4way | 4-way valve (VR4) | enum [cooling & defrost\|heating & dhw] | | false | DEVICE_DATA | 169 | 1 | 1 | -| hpin1 | input 1 state | boolean | | false | DEVICE_DATA | 170 | 1 | 1 | -| hpin1opt | input 1 options | string | | true | DEVICE_DATA | 171 | 8 | 1 | -| hpin2 | input 2 state | boolean | | false | DEVICE_DATA | 179 | 1 | 1 | -| hpin2opt | input 2 options | string | | true | DEVICE_DATA | 180 | 8 | 1 | -| hpin3 | input 3 state | boolean | | false | DEVICE_DATA | 188 | 1 | 1 | -| hpin3opt | input 3 options | string | | true | DEVICE_DATA | 189 | 8 | 1 | -| hpin4 | input 4 state | boolean | | false | DEVICE_DATA | 197 | 1 | 1 | -| hpin4opt | input 4 options | string | | true | DEVICE_DATA | 198 | 8 | 1 | -| maxheatcomp | heat limit compressor | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 206 | 1 | 1 | -| maxheatheat | heat limit heating | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 207 | 1 | 1 | -| dhw.maxheat | heat limit | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DHW | 14 | 1 | 1 | -| mandefrost | manual defrost | boolean | | true | DEVICE_DATA | 208 | 1 | 1 | -| pvcooling | cooling only with PV | boolean | | true | DEVICE_DATA | 209 | 1 | 1 | -| auxheateronly | aux heater only | boolean | | true | DEVICE_DATA | 210 | 1 | 1 | -| auxheateroff | disable aux heater | boolean | | true | DEVICE_DATA | 211 | 1 | 1 | -| auxheaterstatus | aux heater status | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 212 | 1 | 1 | -| auxheaterlevel | aux heater level | uint8 (>=0<=100) | % | false | DEVICE_DATA | 213 | 1 | 1 | -| auxheaterdelay | aux heater on delay | uint16 (>=10<=1000) | K*min | true | DEVICE_DATA | 214 | 1 | 10 | -| auxmaxlimit | aux heater max limit | uint8 (>=0<=10) | K | true | DEVICE_DATA | 215 | 1 | 1/10 | -| auxlimitstart | aux heater limit start | uint8 (>=0<=10) | K | true | DEVICE_DATA | 216 | 1 | 1/10 | -| auxheatrmode | aux heater mode | enum [eco\|comfort] | | true | DEVICE_DATA | 217 | 1 | 1 | -| hphystheat | on/off hyst heat | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 218 | 1 | 5 | -| hphystcool | on/off hyst cool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 219 | 1 | 5 | -| hphystpool | on/off hyst pool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 220 | 1 | 5 | -| silentmode | silent mode | enum [off\|auto\|on] | | true | DEVICE_DATA | 221 | 1 | 1 | -| silentfrom | silent mode from | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 222 | 1 | 15 | -| silentto | silent mode to | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 223 | 1 | 15 | -| mintempsilent | min outside temp for silent mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 224 | 1 | 1 | -| tempparmode | outside temp parallel mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 225 | 1 | 1 | -| auxheatmix | aux heater mixing valve | int8 (>=-100<=100) | % | false | DEVICE_DATA | 226 | 1 | 1 | -| tempdiffheat | temp diff TC3/TC0 heat | uint8 (>=2<=10) | K | true | DEVICE_DATA | 227 | 1 | 1/10 | -| tempdiffcool | temp diff TC3/TC0 cool | uint8 (>=2<=10) | K | true | DEVICE_DATA | 228 | 1 | 1/10 | -| vpcooling | valve/pump cooling | boolean | | true | DEVICE_DATA | 229 | 1 | 1 | -| heatcable | heating cable | boolean | | true | DEVICE_DATA | 230 | 1 | 1 | -| vc0valve | VC0 valve | boolean | | true | DEVICE_DATA | 231 | 1 | 1 | -| primepump | primary heatpump | boolean | | true | DEVICE_DATA | 232 | 1 | 1 | -| primepumpmod | primary heatpump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 233 | 1 | 1 | -| hp3way | 3-way valve | boolean | | true | DEVICE_DATA | 234 | 1 | 1 | -| elheatstep1 | el. heater step 1 | boolean | | true | DEVICE_DATA | 235 | 1 | 1 | -| elheatstep2 | el. heater step 2 | boolean | | true | DEVICE_DATA | 236 | 1 | 1 | -| elheatstep3 | el. heater step 3 | boolean | | true | DEVICE_DATA | 237 | 1 | 1 | -| hpea0 | condensate reservoir heating (EA0) | boolean | | false | DEVICE_DATA | 238 | 1 | 1 | -| hppumpmode | primary heatpump mode | enum [auto\|continuous] | | true | DEVICE_DATA | 239 | 1 | 1 | -| fan | fan | uint8 (>=20<=100) | % | true | DEVICE_DATA | 240 | 1 | 1 | -| shutdown | shutdown | cmd [off\|on] | | true | DEVICE_DATA | 241 | 1 | 1 | -| hpcurrpower | compressor current power | uint16 (>=0<=31999) | W | false | DEVICE_DATA | 242 | 1 | 1 | -| hppowerlimit | power limit | uint16 (>=0<=31999) | W | true | DEVICE_DATA | 243 | 1 | 1 | -| dhw.alternatingop | alternating operation | boolean | | true | DHW | 15 | 1 | 1 | -| dhw.altopprioheat | prioritise heating during dhw | uint8 (>=20<=120) | minutes | true | DHW | 16 | 1 | 1 | -| dhw.altopprio | prioritise dhw during heating | uint8 (>=30<=120) | minutes | true | DHW | 17 | 1 | 1 | -| dhw.comfoff | comfort switch off | uint8 (>=15<=65) | C | true | DHW | 18 | 1 | 1 | -| dhw.ecooff | eco switch off | uint8 (>=15<=65) | C | true | DHW | 19 | 1 | 1 | -| dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | -| dhw.comfdiff | comfort diff | uint8 (>=6<=12) | K | true | DHW | 21 | 1 | 1 | -| dhw.ecodiff | eco diff | uint8 (>=6<=12) | K | true | DHW | 22 | 1 | 1 | -| dhw.ecoplusdiff | eco+ diff | uint8 (>=6<=12) | K | true | DHW | 23 | 1 | 1 | -| dhw.comfstop | comfort stop temp | uint8 (>=0<=254) | C | true | DHW | 24 | 1 | 1 | -| dhw.ecostop | eco stop temp | uint8 (>=0<=254) | C | true | DHW | 25 | 1 | 1 | -| dhw.ecoplusstop | eco+ stop temp | uint8 (>=0<=254) | C | true | DHW | 26 | 1 | 1 | -| dhw.hpcircpump | circulation pump available during dhw | boolean | | true | DHW | 27 | 1 | 1 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### Cascade CM10 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +### CS5800iG -### Cascade MC400 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### Cascade MCM10 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +### BK13/BK15, Smartline, GB1*2 -### Cerapur Aero | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### EasyControl Adapter -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Ecomline Excellent -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 0 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | -| nrgcool | energy cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 87 | 2 | 1/100 | -| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 89 | 2 | 1/100 | -| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 91 | 2 | 1/100 | -| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 93 | 2 | 1/100 | -| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 95 | 2 | 1/100 | -| metercool | meter cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 97 | 2 | 1/100 | -| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 2 | 2 | 1/100 | -| uptimetotal | heatpump total uptime | time (>=0<=279620) | minutes | false | DEVICE_DATA | 99 | 2 | 1/60 | -| uptimecontrol | total operating time heat | time (>=0<=279620) | minutes | false | DEVICE_DATA | 101 | 2 | 1/60 | -| uptimecompheating | operating time compressor heating | time (>=0<=279620) | minutes | false | DEVICE_DATA | 103 | 2 | 1/60 | -| uptimecompcooling | operating time compressor cooling | time (>=0<=279620) | minutes | false | DEVICE_DATA | 105 | 2 | 1/60 | -| dhw.uptimecomp | operating time compressor | time (>=0<=279620) | minutes | false | DHW | 4 | 2 | 1/60 | -| uptimecomppool | operating time compressor pool | time (>=0<=279620) | minutes | false | DEVICE_DATA | 107 | 2 | 1/60 | -| totalcompstarts | total compressor control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 109 | 2 | 1 | -| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 111 | 2 | 1 | -| coolingstarts | cooling control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 113 | 2 | 1 | -| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 6 | 2 | 1 | -| poolstarts | pool control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 115 | 2 | 1 | -| nrgconstotal | total energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 117 | 2 | 1 | -| nrgconscomptotal | total energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 119 | 2 | 1 | -| nrgconscompheating | energy consumption compressor heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 121 | 2 | 1 | -| dhw.nrgconscomp | energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DHW | 8 | 2 | 1 | -| nrgconscompcooling | energy consumption compressor cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 123 | 2 | 1 | -| nrgconscomppool | energy consumption compressor pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 125 | 2 | 1 | -| auxelecheatnrgconstotal | total aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 127 | 2 | 1 | -| auxelecheatnrgconsheating | aux elec. heater energy consumption heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 129 | 2 | 1 | -| dhw.auxelecheatnrgcons | aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DHW | 10 | 2 | 1 | -| auxelecheatnrgconspool | aux elec. heater energy consumption pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 131 | 2 | 1 | -| nrgsupptotal | total energy supplied | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 133 | 2 | 1 | -| nrgsuppheating | total energy supplied heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 135 | 2 | 1 | -| dhw.nrgsupp | total energy warm supplied | uint24 (>=0<=16777214) | kWh | false | DHW | 12 | 2 | 1 | -| nrgsuppcooling | total energy supplied cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 137 | 2 | 1 | -| nrgsupppool | total energy supplied pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 139 | 2 | 1 | -| hppower | compressor power output | uint16 (>=0<=3199) | kW | false | DEVICE_DATA | 141 | 1 | 1/10 | -| hpmaxpower | compressor max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 142 | 1 | 1 | -| pvmaxcomp | pv compressor max power | uint8 (>=0<=25) | kW | true | DEVICE_DATA | 143 | 1 | 1/10 | -| powerreduction | power reduction | uint8 (>=30<=60) | % | true | DEVICE_DATA | 144 | 1 | 10 | -| hpsetdiffpress | set differential pressure | uint8 (>=150<=750) | mbar | true | DEVICE_DATA | 145 | 1 | 50 | -| hpcompon | hp compressor | boolean | | false | DEVICE_DATA | 146 | 1 | 1 | -| hpactivity | compressor activity | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 147 | 1 | 1 | -| hpbrinepumpspd | brine pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 148 | 1 | 1 | -| hpswitchvalve | switch valve | boolean | | false | DEVICE_DATA | 149 | 1 | 1 | -| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 150 | 1 | 1 | -| hpcircspd | circulation pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 151 | 1 | 1 | -| hpbrinein | brine in/evaporator | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 152 | 1 | 1/10 | -| hpbrineout | brine out/condenser | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 153 | 1 | 1/10 | -| hptc0 | heat carrier return (TC0) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 154 | 1 | 1/10 | -| hptc1 | heat carrier forward (TC1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 155 | 1 | 1/10 | -| hptc3 | condenser temperature (TC3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 156 | 1 | 1/10 | -| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 157 | 1 | 1/10 | -| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 158 | 1 | 1/10 | -| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 159 | 1 | 1/10 | -| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 160 | 1 | 1/10 | -| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 161 | 1 | 1/10 | -| hptr7 | refrigerant temperature gas side (condenser input) (TR7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 162 | 1 | 1/10 | -| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 163 | 1 | 1/10 | -| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 164 | 1 | 1/10 | -| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 165 | 1 | 1/10 | -| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 166 | 1 | 1/10 | -| hptw1 | reservoir temp (TW1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 167 | 1 | 1/10 | -| poolsettemp | pool set temperature | uint8 (>=0<=127) | C | true | DEVICE_DATA | 168 | 1 | 1/2 | -| hp4way | 4-way valve (VR4) | enum [cooling & defrost\|heating & dhw] | | false | DEVICE_DATA | 169 | 1 | 1 | -| hpin1 | input 1 state | boolean | | false | DEVICE_DATA | 170 | 1 | 1 | -| hpin1opt | input 1 options | string | | true | DEVICE_DATA | 171 | 8 | 1 | -| hpin2 | input 2 state | boolean | | false | DEVICE_DATA | 179 | 1 | 1 | -| hpin2opt | input 2 options | string | | true | DEVICE_DATA | 180 | 8 | 1 | -| hpin3 | input 3 state | boolean | | false | DEVICE_DATA | 188 | 1 | 1 | -| hpin3opt | input 3 options | string | | true | DEVICE_DATA | 189 | 8 | 1 | -| hpin4 | input 4 state | boolean | | false | DEVICE_DATA | 197 | 1 | 1 | -| hpin4opt | input 4 options | string | | true | DEVICE_DATA | 198 | 8 | 1 | -| maxheatcomp | heat limit compressor | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 206 | 1 | 1 | -| maxheatheat | heat limit heating | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 207 | 1 | 1 | -| dhw.maxheat | heat limit | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DHW | 14 | 1 | 1 | -| mandefrost | manual defrost | boolean | | true | DEVICE_DATA | 208 | 1 | 1 | -| pvcooling | cooling only with PV | boolean | | true | DEVICE_DATA | 209 | 1 | 1 | -| auxheateronly | aux heater only | boolean | | true | DEVICE_DATA | 210 | 1 | 1 | -| auxheateroff | disable aux heater | boolean | | true | DEVICE_DATA | 211 | 1 | 1 | -| auxheaterstatus | aux heater status | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 212 | 1 | 1 | -| auxheaterlevel | aux heater level | uint8 (>=0<=100) | % | false | DEVICE_DATA | 213 | 1 | 1 | -| auxheaterdelay | aux heater on delay | uint16 (>=10<=1000) | K*min | true | DEVICE_DATA | 214 | 1 | 10 | -| auxmaxlimit | aux heater max limit | uint8 (>=0<=10) | K | true | DEVICE_DATA | 215 | 1 | 1/10 | -| auxlimitstart | aux heater limit start | uint8 (>=0<=10) | K | true | DEVICE_DATA | 216 | 1 | 1/10 | -| auxheatrmode | aux heater mode | enum [eco\|comfort] | | true | DEVICE_DATA | 217 | 1 | 1 | -| hphystheat | on/off hyst heat | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 218 | 1 | 5 | -| hphystcool | on/off hyst cool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 219 | 1 | 5 | -| hphystpool | on/off hyst pool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 220 | 1 | 5 | -| silentmode | silent mode | enum [off\|auto\|on] | | true | DEVICE_DATA | 221 | 1 | 1 | -| silentfrom | silent mode from | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 222 | 1 | 15 | -| silentto | silent mode to | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 223 | 1 | 15 | -| mintempsilent | min outside temp for silent mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 224 | 1 | 1 | -| tempparmode | outside temp parallel mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 225 | 1 | 1 | -| auxheatmix | aux heater mixing valve | int8 (>=-100<=100) | % | false | DEVICE_DATA | 226 | 1 | 1 | -| tempdiffheat | temp diff TC3/TC0 heat | uint8 (>=2<=10) | K | true | DEVICE_DATA | 227 | 1 | 1/10 | -| tempdiffcool | temp diff TC3/TC0 cool | uint8 (>=2<=10) | K | true | DEVICE_DATA | 228 | 1 | 1/10 | -| vpcooling | valve/pump cooling | boolean | | true | DEVICE_DATA | 229 | 1 | 1 | -| heatcable | heating cable | boolean | | true | DEVICE_DATA | 230 | 1 | 1 | -| vc0valve | VC0 valve | boolean | | true | DEVICE_DATA | 231 | 1 | 1 | -| primepump | primary heatpump | boolean | | true | DEVICE_DATA | 232 | 1 | 1 | -| primepumpmod | primary heatpump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 233 | 1 | 1 | -| hp3way | 3-way valve | boolean | | true | DEVICE_DATA | 234 | 1 | 1 | -| elheatstep1 | el. heater step 1 | boolean | | true | DEVICE_DATA | 235 | 1 | 1 | -| elheatstep2 | el. heater step 2 | boolean | | true | DEVICE_DATA | 236 | 1 | 1 | -| elheatstep3 | el. heater step 3 | boolean | | true | DEVICE_DATA | 237 | 1 | 1 | -| hpea0 | condensate reservoir heating (EA0) | boolean | | false | DEVICE_DATA | 238 | 1 | 1 | -| hppumpmode | primary heatpump mode | enum [auto\|continuous] | | true | DEVICE_DATA | 239 | 1 | 1 | -| fan | fan | uint8 (>=20<=100) | % | true | DEVICE_DATA | 240 | 1 | 1 | -| shutdown | shutdown | cmd [off\|on] | | true | DEVICE_DATA | 241 | 1 | 1 | -| hpcurrpower | compressor current power | uint16 (>=0<=31999) | W | false | DEVICE_DATA | 242 | 1 | 1 | -| hppowerlimit | power limit | uint16 (>=0<=31999) | W | true | DEVICE_DATA | 243 | 1 | 1 | -| dhw.alternatingop | alternating operation | boolean | | true | DHW | 15 | 1 | 1 | -| dhw.altopprioheat | prioritise heating during dhw | uint8 (>=20<=120) | minutes | true | DHW | 16 | 1 | 1 | -| dhw.altopprio | prioritise dhw during heating | uint8 (>=30<=120) | minutes | true | DHW | 17 | 1 | 1 | -| dhw.comfoff | comfort switch off | uint8 (>=15<=65) | C | true | DHW | 18 | 1 | 1 | -| dhw.ecooff | eco switch off | uint8 (>=15<=65) | C | true | DHW | 19 | 1 | 1 | -| dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | -| dhw.comfdiff | comfort diff | uint8 (>=6<=12) | K | true | DHW | 21 | 1 | 1 | -| dhw.ecodiff | eco diff | uint8 (>=6<=12) | K | true | DHW | 22 | 1 | 1 | -| dhw.ecoplusdiff | eco+ diff | uint8 (>=6<=12) | K | true | DHW | 23 | 1 | 1 | -| dhw.comfstop | comfort stop temp | uint8 (>=0<=254) | C | true | DHW | 24 | 1 | 1 | -| dhw.ecostop | eco stop temp | uint8 (>=0<=254) | C | true | DHW | 25 | 1 | 1 | -| dhw.ecoplusstop | eco+ stop temp | uint8 (>=0<=254) | C | true | DHW | 26 | 1 | 1 | -| dhw.hpcircpump | circulation pump available during dhw | boolean | | true | DHW | 27 | 1 | 1 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | - -### GB*72, Trendline, Cerapur, Greenstar Si -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### GB212 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### GC7000F -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Geo 5xx -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 0 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | -| nrgcool | energy cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 87 | 2 | 1/100 | -| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 89 | 2 | 1/100 | -| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 91 | 2 | 1/100 | -| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 93 | 2 | 1/100 | -| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 95 | 2 | 1/100 | -| metercool | meter cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 97 | 2 | 1/100 | -| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 2 | 2 | 1/100 | -| uptimetotal | heatpump total uptime | time (>=0<=279620) | minutes | false | DEVICE_DATA | 99 | 2 | 1/60 | -| uptimecontrol | total operating time heat | time (>=0<=279620) | minutes | false | DEVICE_DATA | 101 | 2 | 1/60 | -| uptimecompheating | operating time compressor heating | time (>=0<=279620) | minutes | false | DEVICE_DATA | 103 | 2 | 1/60 | -| uptimecompcooling | operating time compressor cooling | time (>=0<=279620) | minutes | false | DEVICE_DATA | 105 | 2 | 1/60 | -| dhw.uptimecomp | operating time compressor | time (>=0<=279620) | minutes | false | DHW | 4 | 2 | 1/60 | -| uptimecomppool | operating time compressor pool | time (>=0<=279620) | minutes | false | DEVICE_DATA | 107 | 2 | 1/60 | -| totalcompstarts | total compressor control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 109 | 2 | 1 | -| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 111 | 2 | 1 | -| coolingstarts | cooling control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 113 | 2 | 1 | -| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 6 | 2 | 1 | -| poolstarts | pool control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 115 | 2 | 1 | -| nrgconstotal | total energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 117 | 2 | 1 | -| nrgconscomptotal | total energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 119 | 2 | 1 | -| nrgconscompheating | energy consumption compressor heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 121 | 2 | 1 | -| dhw.nrgconscomp | energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DHW | 8 | 2 | 1 | -| nrgconscompcooling | energy consumption compressor cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 123 | 2 | 1 | -| nrgconscomppool | energy consumption compressor pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 125 | 2 | 1 | -| auxelecheatnrgconstotal | total aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 127 | 2 | 1 | -| auxelecheatnrgconsheating | aux elec. heater energy consumption heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 129 | 2 | 1 | -| dhw.auxelecheatnrgcons | aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DHW | 10 | 2 | 1 | -| auxelecheatnrgconspool | aux elec. heater energy consumption pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 131 | 2 | 1 | -| nrgsupptotal | total energy supplied | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 133 | 2 | 1 | -| nrgsuppheating | total energy supplied heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 135 | 2 | 1 | -| dhw.nrgsupp | total energy warm supplied | uint24 (>=0<=16777214) | kWh | false | DHW | 12 | 2 | 1 | -| nrgsuppcooling | total energy supplied cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 137 | 2 | 1 | -| nrgsupppool | total energy supplied pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 139 | 2 | 1 | -| hppower | compressor power output | uint16 (>=0<=3199) | kW | false | DEVICE_DATA | 141 | 1 | 1/10 | -| hpmaxpower | compressor max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 142 | 1 | 1 | -| pvmaxcomp | pv compressor max power | uint8 (>=0<=25) | kW | true | DEVICE_DATA | 143 | 1 | 1/10 | -| powerreduction | power reduction | uint8 (>=30<=60) | % | true | DEVICE_DATA | 144 | 1 | 10 | -| hpsetdiffpress | set differential pressure | uint8 (>=150<=750) | mbar | true | DEVICE_DATA | 145 | 1 | 50 | -| hpcompon | hp compressor | boolean | | false | DEVICE_DATA | 146 | 1 | 1 | -| hpactivity | compressor activity | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 147 | 1 | 1 | -| hpbrinepumpspd | brine pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 148 | 1 | 1 | -| hpswitchvalve | switch valve | boolean | | false | DEVICE_DATA | 149 | 1 | 1 | -| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 150 | 1 | 1 | -| hpcircspd | circulation pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 151 | 1 | 1 | -| hpbrinein | brine in/evaporator | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 152 | 1 | 1/10 | -| hpbrineout | brine out/condenser | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 153 | 1 | 1/10 | -| hptc0 | heat carrier return (TC0) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 154 | 1 | 1/10 | -| hptc1 | heat carrier forward (TC1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 155 | 1 | 1/10 | -| hptc3 | condenser temperature (TC3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 156 | 1 | 1/10 | -| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 157 | 1 | 1/10 | -| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 158 | 1 | 1/10 | -| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 159 | 1 | 1/10 | -| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 160 | 1 | 1/10 | -| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 161 | 1 | 1/10 | -| hptr7 | refrigerant temperature gas side (condenser input) (TR7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 162 | 1 | 1/10 | -| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 163 | 1 | 1/10 | -| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 164 | 1 | 1/10 | -| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 165 | 1 | 1/10 | -| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 166 | 1 | 1/10 | -| hptw1 | reservoir temp (TW1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 167 | 1 | 1/10 | -| poolsettemp | pool set temperature | uint8 (>=0<=127) | C | true | DEVICE_DATA | 168 | 1 | 1/2 | -| hp4way | 4-way valve (VR4) | enum [cooling & defrost\|heating & dhw] | | false | DEVICE_DATA | 169 | 1 | 1 | -| hpin1 | input 1 state | boolean | | false | DEVICE_DATA | 170 | 1 | 1 | -| hpin1opt | input 1 options | string | | true | DEVICE_DATA | 171 | 8 | 1 | -| hpin2 | input 2 state | boolean | | false | DEVICE_DATA | 179 | 1 | 1 | -| hpin2opt | input 2 options | string | | true | DEVICE_DATA | 180 | 8 | 1 | -| hpin3 | input 3 state | boolean | | false | DEVICE_DATA | 188 | 1 | 1 | -| hpin3opt | input 3 options | string | | true | DEVICE_DATA | 189 | 8 | 1 | -| hpin4 | input 4 state | boolean | | false | DEVICE_DATA | 197 | 1 | 1 | -| hpin4opt | input 4 options | string | | true | DEVICE_DATA | 198 | 8 | 1 | -| maxheatcomp | heat limit compressor | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 206 | 1 | 1 | -| maxheatheat | heat limit heating | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 207 | 1 | 1 | -| dhw.maxheat | heat limit | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DHW | 14 | 1 | 1 | -| mandefrost | manual defrost | boolean | | true | DEVICE_DATA | 208 | 1 | 1 | -| pvcooling | cooling only with PV | boolean | | true | DEVICE_DATA | 209 | 1 | 1 | -| auxheateronly | aux heater only | boolean | | true | DEVICE_DATA | 210 | 1 | 1 | -| auxheateroff | disable aux heater | boolean | | true | DEVICE_DATA | 211 | 1 | 1 | -| auxheaterstatus | aux heater status | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 212 | 1 | 1 | -| auxheaterlevel | aux heater level | uint8 (>=0<=100) | % | false | DEVICE_DATA | 213 | 1 | 1 | -| auxheaterdelay | aux heater on delay | uint16 (>=10<=1000) | K*min | true | DEVICE_DATA | 214 | 1 | 10 | -| auxmaxlimit | aux heater max limit | uint8 (>=0<=10) | K | true | DEVICE_DATA | 215 | 1 | 1/10 | -| auxlimitstart | aux heater limit start | uint8 (>=0<=10) | K | true | DEVICE_DATA | 216 | 1 | 1/10 | -| auxheatrmode | aux heater mode | enum [eco\|comfort] | | true | DEVICE_DATA | 217 | 1 | 1 | -| hphystheat | on/off hyst heat | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 218 | 1 | 5 | -| hphystcool | on/off hyst cool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 219 | 1 | 5 | -| hphystpool | on/off hyst pool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 220 | 1 | 5 | -| silentmode | silent mode | enum [off\|auto\|on] | | true | DEVICE_DATA | 221 | 1 | 1 | -| silentfrom | silent mode from | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 222 | 1 | 15 | -| silentto | silent mode to | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 223 | 1 | 15 | -| mintempsilent | min outside temp for silent mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 224 | 1 | 1 | -| tempparmode | outside temp parallel mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 225 | 1 | 1 | -| auxheatmix | aux heater mixing valve | int8 (>=-100<=100) | % | false | DEVICE_DATA | 226 | 1 | 1 | -| tempdiffheat | temp diff TC3/TC0 heat | uint8 (>=2<=10) | K | true | DEVICE_DATA | 227 | 1 | 1/10 | -| tempdiffcool | temp diff TC3/TC0 cool | uint8 (>=2<=10) | K | true | DEVICE_DATA | 228 | 1 | 1/10 | -| vpcooling | valve/pump cooling | boolean | | true | DEVICE_DATA | 229 | 1 | 1 | -| heatcable | heating cable | boolean | | true | DEVICE_DATA | 230 | 1 | 1 | -| vc0valve | VC0 valve | boolean | | true | DEVICE_DATA | 231 | 1 | 1 | -| primepump | primary heatpump | boolean | | true | DEVICE_DATA | 232 | 1 | 1 | -| primepumpmod | primary heatpump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 233 | 1 | 1 | -| hp3way | 3-way valve | boolean | | true | DEVICE_DATA | 234 | 1 | 1 | -| elheatstep1 | el. heater step 1 | boolean | | true | DEVICE_DATA | 235 | 1 | 1 | -| elheatstep2 | el. heater step 2 | boolean | | true | DEVICE_DATA | 236 | 1 | 1 | -| elheatstep3 | el. heater step 3 | boolean | | true | DEVICE_DATA | 237 | 1 | 1 | -| hpea0 | condensate reservoir heating (EA0) | boolean | | false | DEVICE_DATA | 238 | 1 | 1 | -| hppumpmode | primary heatpump mode | enum [auto\|continuous] | | true | DEVICE_DATA | 239 | 1 | 1 | -| fan | fan | uint8 (>=20<=100) | % | true | DEVICE_DATA | 240 | 1 | 1 | -| shutdown | shutdown | cmd [off\|on] | | true | DEVICE_DATA | 241 | 1 | 1 | -| hpcurrpower | compressor current power | uint16 (>=0<=31999) | W | false | DEVICE_DATA | 242 | 1 | 1 | -| hppowerlimit | power limit | uint16 (>=0<=31999) | W | true | DEVICE_DATA | 243 | 1 | 1 | -| dhw.alternatingop | alternating operation | boolean | | true | DHW | 15 | 1 | 1 | -| dhw.altopprioheat | prioritise heating during dhw | uint8 (>=20<=120) | minutes | true | DHW | 16 | 1 | 1 | -| dhw.altopprio | prioritise dhw during heating | uint8 (>=30<=120) | minutes | true | DHW | 17 | 1 | 1 | -| dhw.comfoff | comfort switch off | uint8 (>=15<=65) | C | true | DHW | 18 | 1 | 1 | -| dhw.ecooff | eco switch off | uint8 (>=15<=65) | C | true | DHW | 19 | 1 | 1 | -| dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | -| dhw.comfdiff | comfort diff | uint8 (>=6<=12) | K | true | DHW | 21 | 1 | 1 | -| dhw.ecodiff | eco diff | uint8 (>=6<=12) | K | true | DHW | 22 | 1 | 1 | -| dhw.ecoplusdiff | eco+ diff | uint8 (>=6<=12) | K | true | DHW | 23 | 1 | 1 | -| dhw.comfstop | comfort stop temp | uint8 (>=0<=254) | C | true | DHW | 24 | 1 | 1 | -| dhw.ecostop | eco stop temp | uint8 (>=0<=254) | C | true | DHW | 25 | 1 | 1 | -| dhw.ecoplusstop | eco+ stop temp | uint8 (>=0<=254) | C | true | DHW | 26 | 1 | 1 | -| dhw.hpcircpump | circulation pump available during dhw | boolean | | true | DHW | 27 | 1 | 1 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | - -### Greenstar 30Ri Compact -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Greenstar HIU, Logamax kompakt WS170 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| netflowtemp | heat network flow temp | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 271 | 1 | 1/10 | -| heatvalve | heating valve | uint8 (>=0<=100) | % | false | DEVICE_DATA | 272 | 1 | 1 | -| dhw.dhwvalve | valve | uint8 (>=0<=100) | % | false | DHW | 73 | 1 | 1 | -| keepwarmtemp | keep warm temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 273 | 1 | 1 | -| setreturntemp | set temp return | uint8 (>=0<=254) | C | true | DEVICE_DATA | 274 | 1 | 1 | -| heating | heating | boolean | | false | DEVICE_DATA | 275 | 1 | 1 | -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | - -### Hybrid Heatpump -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Logamax Plus GB022 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Logamax Plus, GB192, Condens GC9000, Greenstar ErP -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | - -### Logamax U122, Cerapur -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | ### Logano GB1*5, Logamatic MC10 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### Logano GB125/KB195i, Logamatic MC110 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### Logano GB212 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +### Cascade CM10 -### Proline | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | + +### Logamax Plus GB022 -### Suprapur-o | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | + +### Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [pumpstep\|const.high\|const.medium\|const.low\|prop.high\|propo.low] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | ### Topline, GB162 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | -| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 1 | 1 | 1 | -| heatingactive | heating active | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | -| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 4 | 1 | 1 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 10 | 1 | 1/10 | -| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 244 | 1 | 1/10 | -| burngas | gas | boolean | | false | DEVICE_DATA | 245 | 1 | 1 | -| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 246 | 1 | 1 | -| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 247 | 1 | 1/10 | -| fanwork | fan | boolean | | false | DEVICE_DATA | 248 | 1 | 1 | -| ignwork | ignition | boolean | | false | DEVICE_DATA | 249 | 1 | 1 | -| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | -| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 251 | 1 | 1 | -| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 252 | 1 | 1 | -| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 253 | 1 | 1 | -| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 254 | 1 | 1 | -| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 255 | 1 | 1/10 | -| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 256 | 1 | 1 | -| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 257 | 1 | 1 | -| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 258 | 1 | 1 | -| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 259 | 1 | 1 | -| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 260 | 1 | 1 | -| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 261 | 1 | 1 | -| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 262 | 1 | 1 | -| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 263 | 1 | 1 | -| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 264 | 1 | 1 | -| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 265 | 1 | 1 | -| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 13 | 1 | 1 | -| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 14 | 1 | 1 | -| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 15 | 1 | 1 | -| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 16 | 1 | 1 | -| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | -| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 18 | 1 | 1 | -| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 19 | 1 | 1 | -| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 20 | 1 | 1 | -| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 21 | 1 | 1 | -| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 22 | 1 | 1 | -| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 24 | 2 | 1 | -| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 26 | 2 | 1 | -| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 28 | 2 | 1 | -| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 30 | 2 | 1 | -| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 32 | 2 | 1 | -| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 34 | 2 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 36 | 28 | 1 | -| servicecode | service code | string | | false | DEVICE_DATA | 64 | 2 | 1 | -| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 66 | 1 | 1 | -| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 67 | 2 | 1 | -| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 69 | 1 | 1 | -| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 70 | 1 | 1 | -| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 71 | 6 | 1 | -| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 77 | 1 | 1 | -| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 78 | 1 | 1 | -| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 79 | 1 | 1 | -| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | -| pc1on | PC1 | boolean | | false | DEVICE_DATA | 81 | 1 | 1 | -| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 82 | 1 | 1 | -| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 95 | 2 | 1/10 | -| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | -| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 266 | 2 | 1/10 | -| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 69 | 2 | 1/10 | -| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 268 | 2 | 1/10 | -| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | -| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | -| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | -| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | -| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | -| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | -| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | -| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | -| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | -| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | -| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | -| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | -| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | -| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | -| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | -| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | -| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | -| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | -| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | -| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | -| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | -| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | -| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | -| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | -| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 63 | 1 | 1/10 | -| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | -| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 65 | 2 | 1 | -| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 67 | 2 | 1 | -| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 270 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 83 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 85 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -## Devices of type *controller* -### Rego 3000 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| datetime | date/time | string | | false | DEVICE_DATA | 0 | 13 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -## Devices of type *extension* -### EM10, EM100 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| flowtempvf | flow temperature in header (T0/Vf) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| input | input | uint8 (>=0<=25) | V | false | DEVICE_DATA | 1 | 1 | 1/10 | -| outpow | output IO1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 2 | 1 | 1 | -| setpower | request power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 3 | 1 | 1 | -| setpoint | set temp. | uint8 (>=0<=254) | C | false | DEVICE_DATA | 4 | 1 | 1 | -| minv | min volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 5 | 1 | 1/10 | -| maxv | max volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 6 | 1 | 1/10 | -| mint | min temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 7 | 1 | 1 | -| maxt | max temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 8 | 1 | 1 | -| mode | operating mode | uint8 (>=0<=254) | | false | DEVICE_DATA | 9 | 1 | 1 | +### Cascade MCM10 -### T1RF | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| flowtempvf | flow temperature in header (T0/Vf) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| input | input | uint8 (>=0<=25) | V | false | DEVICE_DATA | 1 | 1 | 1/10 | -| outpow | output IO1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 2 | 1 | 1 | -| setpower | request power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 3 | 1 | 1 | -| setpoint | set temp. | uint8 (>=0<=254) | C | false | DEVICE_DATA | 4 | 1 | 1 | -| minv | min volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 5 | 1 | 1/10 | -| maxv | max volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 6 | 1 | 1/10 | -| mint | min temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 7 | 1 | 1 | -| maxt | max temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 8 | 1 | 1 | -| mode | operating mode | uint8 (>=0<=254) | | false | DEVICE_DATA | 9 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -## Devices of type *heatpump* -### HP Module -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 0 | 1 | 1 | -| dewtemperature | dew point temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 1 | 1 | 1 | -| curflowtemp | current flow temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | -| rettemp | return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | -| sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 4 | 1 | 1/10 | -| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 5 | 1 | 1/10 | -| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | -| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 14 | 1 | 1 | -| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 15 | 1 | 1 | -| hybridstrategy | hybrid control strategy | enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only] | | true | DEVICE_DATA | 16 | 1 | 1 | -| lownoisemode | low noise mode | enum [off\|reduced output\|switch off hp\|perm. reduced] | | true | DEVICE_DATA | 17 | 1 | 1 | -| lownoisestart | low noise starttime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 18 | 1 | 1 | -| lownoisestop | low noise stoptime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 19 | 1 | 1 | -| dhw.hybriddhw | hybrid DHW | enum [eco\|high comfort] | | true | DHW | 0 | 1 | 1 | -| energypricegas | energy price gas | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 20 | 1 | 1 | -| energypriceel | energy price electric | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 21 | 1 | 1 | -| energyfeedpv | feed in PV | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 22 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 23 | 1 | 1 | -| airpurgemode | air purge mode | boolean | | true | DEVICE_DATA | 24 | 1 | 1 | -| heatpumpoutput | heatpump output | uint8 (>=0<=100) | % | true | DEVICE_DATA | 25 | 1 | 1 | -| coolingcircuit | cooling circuit | boolean | | true | DEVICE_DATA | 26 | 1 | 1 | -| compstartmod | compressor start modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 27 | 1 | 1 | -| heatdrainpan | heat drain pan | boolean | | true | DEVICE_DATA | 28 | 1 | 1 | -| heatcable | heating cable | boolean | | true | DEVICE_DATA | 29 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 30 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 1 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 32 | 2 | 1/100 | -| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 34 | 2 | 1/100 | -| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 36 | 2 | 1/100 | -| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 38 | 2 | 1/100 | -| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 40 | 2 | 1/100 | -| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 3 | 2 | 1/100 | -| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 42 | 2 | 1 | -| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 5 | 2 | 1 | -| fuelheat | fuel consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 44 | 2 | 1/10 | -| dhw.fueldhw | fuel consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 7 | 2 | 1/10 | -| elheat | el. consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 46 | 2 | 1/10 | -| dhw.eldhw | el. consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 9 | 2 | 1/10 | -| elgenheat | el. generation heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 48 | 2 | 1/10 | -| dhw.elgendhw | el generation | uint32 (>=0<=1677721) | kWh | false | DHW | 11 | 2 | 1/10 | +### Proline -### Hybrid Manager HM200 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 0 | 1 | 1 | -| dewtemperature | dew point temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 1 | 1 | 1 | -| curflowtemp | current flow temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | -| rettemp | return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | -| sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 4 | 1 | 1/10 | -| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 5 | 1 | 1/10 | -| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | -| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | -| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | -| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | -| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | -| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | -| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | -| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | -| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 14 | 1 | 1 | -| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 15 | 1 | 1 | -| hybridstrategy | hybrid control strategy | enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only] | | true | DEVICE_DATA | 16 | 1 | 1 | -| lownoisemode | low noise mode | enum [off\|reduced output\|switch off hp\|perm. reduced] | | true | DEVICE_DATA | 17 | 1 | 1 | -| lownoisestart | low noise starttime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 18 | 1 | 1 | -| lownoisestop | low noise stoptime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 19 | 1 | 1 | -| dhw.hybriddhw | hybrid DHW | enum [eco\|high comfort] | | true | DHW | 0 | 1 | 1 | -| energypricegas | energy price gas | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 20 | 1 | 1 | -| energypriceel | energy price electric | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 21 | 1 | 1 | -| energyfeedpv | feed in PV | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 22 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 23 | 1 | 1 | -| airpurgemode | air purge mode | boolean | | true | DEVICE_DATA | 24 | 1 | 1 | -| heatpumpoutput | heatpump output | uint8 (>=0<=100) | % | true | DEVICE_DATA | 25 | 1 | 1 | -| coolingcircuit | cooling circuit | boolean | | true | DEVICE_DATA | 26 | 1 | 1 | -| compstartmod | compressor start modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 27 | 1 | 1 | -| heatdrainpan | heat drain pan | boolean | | true | DEVICE_DATA | 28 | 1 | 1 | -| heatcable | heating cable | boolean | | true | DEVICE_DATA | 29 | 1 | 1 | -| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 30 | 2 | 1/100 | -| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 1 | 2 | 1/100 | -| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 32 | 2 | 1/100 | -| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 34 | 2 | 1/100 | -| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 36 | 2 | 1/100 | -| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 38 | 2 | 1/100 | -| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 40 | 2 | 1/100 | -| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 3 | 2 | 1/100 | -| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 42 | 2 | 1 | -| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 5 | 2 | 1 | -| fuelheat | fuel consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 44 | 2 | 1/10 | -| dhw.fueldhw | fuel consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 7 | 2 | 1/10 | -| elheat | el. consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 46 | 2 | 1/10 | -| dhw.eldhw | el. consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 9 | 2 | 1/10 | -| elgenheat | el. generation heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 48 | 2 | 1/10 | -| dhw.elgendhw | el generation | uint32 (>=0<=1677721) | kWh | false | DHW | 11 | 2 | 1/10 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -## Devices of type *heatsource* -### AM200 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| ahs1.sysflowtemp | system flow temperature | int16 (>=-3199<=3199) | C | false | AHS | 0 | 1 | 1/10 | -| ahs1.sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | AHS | 1 | 1 | 1/10 | -| ahs1.altflowtemp | alternative hs flow temperature | int16 (>=-3199<=3199) | C | false | AHS | 2 | 1 | 1/10 | -| ahs1.altrettemp | alternative hs return temperature | int16 (>=-3199<=3199) | C | false | AHS | 3 | 1 | 1/10 | -| ahs1.cyltoptemp | cylinder top temperature | int16 (>=-3199<=3199) | C | false | AHS | 4 | 1 | 1/10 | -| ahs1.cylcentertemp | cylinder center temperature | int16 (>=-3199<=3199) | C | false | AHS | 5 | 1 | 1/10 | -| ahs1.cylbottomtemp | cylinder bottom temperature | int16 (>=-3199<=3199) | C | false | AHS | 6 | 1 | 1/10 | -| ahs1.fluegastemp | flue gas temperature | int16 (>=-3199<=3199) | C | false | AHS | 7 | 1 | 1/10 | -| ahs1.valvebuffer | buffer valve | uint8 (>=0<=100) | % | false | AHS | 8 | 1 | 1 | -| ahs1.valvereturn | return valve | uint8 (>=0<=100) | % | false | AHS | 9 | 1 | 1 | -| ahs1.apumpmod | alternative hs pump modulation | uint8 (>=0<=100) | % | false | AHS | 10 | 1 | 1 | -| ahs1.vr2config | vr2 configuration | enum [off\|bypass] | | true | AHS | 11 | 1 | 1 | -| ahs1.ahsactivated | alternate heat source activation | boolean | | true | AHS | 12 | 1 | 1 | -| ahs1.apumpconfig | primary pump config | boolean | | true | AHS | 13 | 1 | 1 | -| ahs1.apumpsignal | output for pr1 pump | enum [off\|pwm\|pwm inverse] | | true | AHS | 14 | 1 | 1 | -| ahs1.apumpmin | min output pump pr1 | uint8 (>=12<=50) | % | true | AHS | 15 | 1 | 1 | -| ahs1.temprise | ahs return temp rise | boolean | | true | AHS | 16 | 1 | 1 | -| ahs1.setreturntemp | set temp return | uint8 (>=40<=75) | C | true | AHS | 17 | 1 | 1 | -| ahs1.mixruntime | mixer run time | uint16 (>=0<=600) | seconds | true | AHS | 18 | 1 | 1 | -| ahs1.setflowtemp | set flow temperature | uint8 (>=40<=75) | C | true | AHS | 19 | 1 | 1 | -| ahs1.bufbypass | buffer bypass config | enum [no\|mixer\|valve] | | true | AHS | 20 | 1 | 1 | -| ahs1.bufmixruntime | bypass mixer run time | uint16 (>=0<=600) | seconds | true | AHS | 21 | 1 | 1 | -| ahs1.bufconfig | dhw buffer config | enum [off\|monovalent\|bivalent] | | true | AHS | 22 | 1 | 1 | -| ahs1.blockmode | config htg. blocking mode | enum [off\|auto\|blocking] | | true | AHS | 23 | 1 | 1 | -| ahs1.blockterm | config of block terminal | enum [n_o\|n_c] | | true | AHS | 24 | 1 | 1 | -| ahs1.blockhyst | hyst. for boiler block | int8 (>=0<=50) | C | true | AHS | 25 | 1 | 1 | -| ahs1.releasewait | boiler release wait time | uint8 (>=0<=240) | minutes | true | AHS | 26 | 1 | 1 | -| ahs1.burner | burner | boolean | | false | AHS | 27 | 1 | 1 | -| ahs1.apump | alternative hs pump | boolean | | false | AHS | 28 | 1 | 1 | -| ahs1.heatrequest | heat request | uint8 (>=0<=100) | % | false | AHS | 29 | 1 | 1 | -| ahs1.blockremain | remaining blocktime | uint8 (>=0<=254) | minutes | false | AHS | 30 | 1 | 1 | -| ahs1.blockremaindhw | remaining blocktime dhw | uint8 (>=0<=254) | minutes | false | AHS | 31 | 1 | 1 | +### GB*72, Trendline, Cerapur, Greenstar Si -## Devices of type *mixer* -### HM210 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | -| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 5 | 1 | 10 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 7 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### IPM -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.flowtempvf | flow temperature in header (T0/Vf) | uint16 (>=0<=3199) | C | false | HC | 6 | 1 | 1/10 | +### GB212 -### IPM2 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.flowtempvf | flow temperature in header (T0/Vf) | uint16 (>=0<=3199) | C | false | HC | 6 | 1 | 1/10 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### MM10 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | int8 (>=-100<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | -| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 5 | 1 | 10 | +### GC7000F -### MM100 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | -| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 5 | 1 | 10 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 7 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### MM200 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | -| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 5 | 1 | 10 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 7 | 1 | 1 | +### Logano GB125/KB195i, Logamatic MC110 -### MM50 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | -| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 5 | 1 | 10 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 7 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### MZ100 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | -| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | -| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | -| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | -| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | -| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 5 | 1 | 10 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 7 | 1 | 1 | +### Greenstar 30Ri Compact -## Devices of type *pool* -### MP100 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| pooltemp | pool temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | -1 | 1 | 1/10 | -| poolshuntstatus | pool shunt status opening/closing | enum [stopped\|opening\|closing\|open\|close] | | false | DEVICE_DATA | -1 | 1 | 1 | -| poolshunt | pool shunt open/close (0% = pool / 100% = heat) | uint8 (>=0<=100) | % | false | DEVICE_DATA | -1 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -## Devices of type *solar* -### ISM1 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | -| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | -| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | -| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | -| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | -| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | -| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | -| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | +### Suprapur-o -### ISM2 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | -| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | -| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | -| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | -| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | -| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | -| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | -| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### SM10 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | -| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | -| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | -| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | -| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | -| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 1 | -| turnondiff | pump turn on difference | uint8 (>=0<=254) | C | true | DEVICE_DATA | 10 | 1 | 1 | -| turnoffdiff | pump turn off difference | uint8 (>=0<=254) | C | true | DEVICE_DATA | 11 | 1 | 1 | -| solarpower | actual solar power | int16 (>=-31999<=31999) | W | false | DEVICE_DATA | 12 | 1 | 1 | -| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | -| maxflow | maximum solar flow | uint8 (>=0<=25) | l/min | true | DEVICE_DATA | 15 | 1 | 1/10 | -| dhw.mintemp | minimum temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | -| solarenabled | solarmodule enabled | boolean | | true | DEVICE_DATA | 16 | 1 | 1 | +### Cerapur Aero -### SM100, MS100 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | -| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | -| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | -| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | -| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | -| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 5 | -| turnondiff | pump turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 10 | 1 | 1/10 | -| turnoffdiff | pump turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 11 | 1 | 1/10 | -| collector2temp | collector 2 temperature (TS7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 20 | 1 | 1/10 | -| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | -| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | -| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | -| heatassistpower | heat assistance valve power (M1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 21 | 1 | 1 | -| solarpump2 | pump 2 (PS4) | boolean | | false | DEVICE_DATA | 22 | 1 | 1 | -| solarpump2mod | pump 2 modulation (PS4) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| cyl2bottomtemp | second cylinder bottom temperature (TS5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 24 | 1 | 1/10 | -| cyl3bottomtemp | third cylinder bottom temperature (TS11) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 25 | 1 | 1/10 | -| cyltoptemp | cylinder top temperature (TS10) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 26 | 1 | 1/10 | -| heatexchangertemp | heat exchanger temperature (TS6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 27 | 1 | 1/10 | -| cylpumpmod | cylinder pump modulation (PS5) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 28 | 1 | 1 | -| valvestatus | valve status | boolean | | false | DEVICE_DATA | 29 | 1 | 1 | -| vs1status | valve status VS1 | boolean | | false | DEVICE_DATA | 30 | 1 | 1 | -| vs3status | valve status VS3 | boolean | | false | DEVICE_DATA | 31 | 1 | 1 | -| transferpump | transfer pump | boolean | | false | DEVICE_DATA | 32 | 1 | 1 | -| transferpumpmod | transfer pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 33 | 1 | 1 | -| collectormaxtemp | maximum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 34 | 1 | 1 | -| collectormintemp | minimum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 35 | 1 | 1 | -| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | -| energytoday | total energy today | uint24 (>=0<=16777214) | Wh | false | DEVICE_DATA | 36 | 2 | 1 | -| energytotal | total energy | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 38 | 2 | 1/10 | -| pump2worktime | pump 2 working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 40 | 2 | 1 | -| m1worktime | differential control working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 42 | 2 | 1 | -| heattransfersystem | heattransfer system | boolean | | true | DEVICE_DATA | 44 | 1 | 1 | -| externalcyl | external cylinder | boolean | | true | DEVICE_DATA | 45 | 1 | 1 | -| thermaldisinfect | thermal disinfection | boolean | | true | DEVICE_DATA | 46 | 1 | 1 | -| heatmetering | heatmetering | boolean | | true | DEVICE_DATA | 47 | 1 | 1 | -| activated | activated | boolean | | true | DEVICE_DATA | 48 | 1 | 1 | -| solarpumpmode | solar pump mode | enum [constant\|pwm\|analog] | | true | DEVICE_DATA | 49 | 1 | 1 | -| solarpumpkick | solar pump kick | boolean | | true | DEVICE_DATA | 50 | 1 | 1 | -| plainwatermode | plain water mode | boolean | | true | DEVICE_DATA | 51 | 1 | 1 | -| doublematchflow | doublematchflow | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| pump2minmod | minimum pump 2 modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 53 | 1 | 1 | -| turnondiff2 | pump 2 turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 54 | 1 | 1/10 | -| turnoffdiff2 | pump 2 turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 55 | 1 | 1/10 | -| pump2kick | pump kick 2 | boolean | | true | DEVICE_DATA | 56 | 1 | 1 | -| climatezone | climate zone | uint8 (>=0<=254) | | true | DEVICE_DATA | 57 | 1 | 1 | -| collector1area | collector 1 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 58 | 1 | 1/10 | -| collector1type | collector 1 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 59 | 1 | 1 | -| collector2area | collector 2 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 60 | 1 | 1/10 | -| collector2type | collector 2 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 61 | 1 | 1 | -| cylpriority | cylinder priority | enum [cyl 1\|cyl 2] | | true | DEVICE_DATA | 62 | 1 | 1 | -| heatcntflowtemp | heat counter flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 63 | 1 | 1/10 | -| heatcntrettemp | heat counter return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 64 | 1 | 1/10 | -| heatcnt | heat counter impulses | uint8 (>=0<=254) | | false | DEVICE_DATA | 65 | 1 | 1 | -| swapflowtemp | swap flow temperature (TS14) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 66 | 1 | 1/10 | -| swaprettemp | swap return temperature (TS15) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 67 | 1 | 1/10 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### SM200, MS200 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | -| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | -| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | -| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | -| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | -| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 5 | -| turnondiff | pump turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 10 | 1 | 1/10 | -| turnoffdiff | pump turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 11 | 1 | 1/10 | -| collector2temp | collector 2 temperature (TS7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 20 | 1 | 1/10 | -| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | -| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | -| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | -| heatassistpower | heat assistance valve power (M1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 21 | 1 | 1 | -| solarpump2 | pump 2 (PS4) | boolean | | false | DEVICE_DATA | 22 | 1 | 1 | -| solarpump2mod | pump 2 modulation (PS4) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| cyl2bottomtemp | second cylinder bottom temperature (TS5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 24 | 1 | 1/10 | -| cyl3bottomtemp | third cylinder bottom temperature (TS11) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 25 | 1 | 1/10 | -| cyltoptemp | cylinder top temperature (TS10) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 26 | 1 | 1/10 | -| heatexchangertemp | heat exchanger temperature (TS6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 27 | 1 | 1/10 | -| cylpumpmod | cylinder pump modulation (PS5) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 28 | 1 | 1 | -| valvestatus | valve status | boolean | | false | DEVICE_DATA | 29 | 1 | 1 | -| vs1status | valve status VS1 | boolean | | false | DEVICE_DATA | 30 | 1 | 1 | -| vs3status | valve status VS3 | boolean | | false | DEVICE_DATA | 31 | 1 | 1 | -| transferpump | transfer pump | boolean | | false | DEVICE_DATA | 32 | 1 | 1 | -| transferpumpmod | transfer pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 33 | 1 | 1 | -| collectormaxtemp | maximum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 34 | 1 | 1 | -| collectormintemp | minimum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 35 | 1 | 1 | -| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | -| energytoday | total energy today | uint24 (>=0<=16777214) | Wh | false | DEVICE_DATA | 36 | 2 | 1 | -| energytotal | total energy | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 38 | 2 | 1/10 | -| pump2worktime | pump 2 working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 40 | 2 | 1 | -| m1worktime | differential control working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 42 | 2 | 1 | -| heattransfersystem | heattransfer system | boolean | | true | DEVICE_DATA | 44 | 1 | 1 | -| externalcyl | external cylinder | boolean | | true | DEVICE_DATA | 45 | 1 | 1 | -| thermaldisinfect | thermal disinfection | boolean | | true | DEVICE_DATA | 46 | 1 | 1 | -| heatmetering | heatmetering | boolean | | true | DEVICE_DATA | 47 | 1 | 1 | -| activated | activated | boolean | | true | DEVICE_DATA | 48 | 1 | 1 | -| solarpumpmode | solar pump mode | enum [constant\|pwm\|analog] | | true | DEVICE_DATA | 49 | 1 | 1 | -| solarpumpkick | solar pump kick | boolean | | true | DEVICE_DATA | 50 | 1 | 1 | -| plainwatermode | plain water mode | boolean | | true | DEVICE_DATA | 51 | 1 | 1 | -| doublematchflow | doublematchflow | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| pump2minmod | minimum pump 2 modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 53 | 1 | 1 | -| turnondiff2 | pump 2 turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 54 | 1 | 1/10 | -| turnoffdiff2 | pump 2 turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 55 | 1 | 1/10 | -| pump2kick | pump kick 2 | boolean | | true | DEVICE_DATA | 56 | 1 | 1 | -| climatezone | climate zone | uint8 (>=0<=254) | | true | DEVICE_DATA | 57 | 1 | 1 | -| collector1area | collector 1 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 58 | 1 | 1/10 | -| collector1type | collector 1 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 59 | 1 | 1 | -| collector2area | collector 2 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 60 | 1 | 1/10 | -| collector2type | collector 2 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 61 | 1 | 1 | -| cylpriority | cylinder priority | enum [cyl 1\|cyl 2] | | true | DEVICE_DATA | 62 | 1 | 1 | -| heatcntflowtemp | heat counter flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 63 | 1 | 1/10 | -| heatcntrettemp | heat counter return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 64 | 1 | 1/10 | -| heatcnt | heat counter impulses | uint8 (>=0<=254) | | false | DEVICE_DATA | 65 | 1 | 1 | -| swapflowtemp | swap flow temperature (TS14) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 66 | 1 | 1/10 | -| swaprettemp | swap return temperature (TS15) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 67 | 1 | 1/10 | +### Hybrid Heatpump -### SM50 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | -| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | -| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | -| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | -| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | -| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | -| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 5 | -| turnondiff | pump turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 10 | 1 | 1/10 | -| turnoffdiff | pump turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 11 | 1 | 1/10 | -| collector2temp | collector 2 temperature (TS7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 20 | 1 | 1/10 | -| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | -| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | -| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | -| heatassistpower | heat assistance valve power (M1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 21 | 1 | 1 | -| solarpump2 | pump 2 (PS4) | boolean | | false | DEVICE_DATA | 22 | 1 | 1 | -| solarpump2mod | pump 2 modulation (PS4) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | -| cyl2bottomtemp | second cylinder bottom temperature (TS5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 24 | 1 | 1/10 | -| cyl3bottomtemp | third cylinder bottom temperature (TS11) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 25 | 1 | 1/10 | -| cyltoptemp | cylinder top temperature (TS10) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 26 | 1 | 1/10 | -| heatexchangertemp | heat exchanger temperature (TS6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 27 | 1 | 1/10 | -| cylpumpmod | cylinder pump modulation (PS5) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 28 | 1 | 1 | -| valvestatus | valve status | boolean | | false | DEVICE_DATA | 29 | 1 | 1 | -| vs1status | valve status VS1 | boolean | | false | DEVICE_DATA | 30 | 1 | 1 | -| vs3status | valve status VS3 | boolean | | false | DEVICE_DATA | 31 | 1 | 1 | -| transferpump | transfer pump | boolean | | false | DEVICE_DATA | 32 | 1 | 1 | -| transferpumpmod | transfer pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 33 | 1 | 1 | -| collectormaxtemp | maximum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 34 | 1 | 1 | -| collectormintemp | minimum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 35 | 1 | 1 | -| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | -| energytoday | total energy today | uint24 (>=0<=16777214) | Wh | false | DEVICE_DATA | 36 | 2 | 1 | -| energytotal | total energy | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 38 | 2 | 1/10 | -| pump2worktime | pump 2 working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 40 | 2 | 1 | -| m1worktime | differential control working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 42 | 2 | 1 | -| heattransfersystem | heattransfer system | boolean | | true | DEVICE_DATA | 44 | 1 | 1 | -| externalcyl | external cylinder | boolean | | true | DEVICE_DATA | 45 | 1 | 1 | -| thermaldisinfect | thermal disinfection | boolean | | true | DEVICE_DATA | 46 | 1 | 1 | -| heatmetering | heatmetering | boolean | | true | DEVICE_DATA | 47 | 1 | 1 | -| activated | activated | boolean | | true | DEVICE_DATA | 48 | 1 | 1 | -| solarpumpmode | solar pump mode | enum [constant\|pwm\|analog] | | true | DEVICE_DATA | 49 | 1 | 1 | -| solarpumpkick | solar pump kick | boolean | | true | DEVICE_DATA | 50 | 1 | 1 | -| plainwatermode | plain water mode | boolean | | true | DEVICE_DATA | 51 | 1 | 1 | -| doublematchflow | doublematchflow | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| pump2minmod | minimum pump 2 modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 53 | 1 | 1 | -| turnondiff2 | pump 2 turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 54 | 1 | 1/10 | -| turnoffdiff2 | pump 2 turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 55 | 1 | 1/10 | -| pump2kick | pump kick 2 | boolean | | true | DEVICE_DATA | 56 | 1 | 1 | -| climatezone | climate zone | uint8 (>=0<=254) | | true | DEVICE_DATA | 57 | 1 | 1 | -| collector1area | collector 1 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 58 | 1 | 1/10 | -| collector1type | collector 1 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 59 | 1 | 1 | -| collector2area | collector 2 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 60 | 1 | 1/10 | -| collector2type | collector 2 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 61 | 1 | 1 | -| cylpriority | cylinder priority | enum [cyl 1\|cyl 2] | | true | DEVICE_DATA | 62 | 1 | 1 | -| heatcntflowtemp | heat counter flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 63 | 1 | 1/10 | -| heatcntrettemp | heat counter return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 64 | 1 | 1/10 | -| heatcnt | heat counter impulses | uint8 (>=0<=254) | | false | DEVICE_DATA | 65 | 1 | 1 | -| swapflowtemp | swap flow temperature (TS14) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 66 | 1 | 1/10 | -| swaprettemp | swap return temperature (TS15) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 67 | 1 | 1/10 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -## Devices of type *switch* -### WM10 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| activated | activated | boolean | | false | DEVICE_DATA | 0 | 1 | 1 | -| flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| status | status | int8 (>=-126<=126) | | false | DEVICE_DATA | 2 | 1 | 1 | +### Logano GB212 -## Devices of type *thermostat* -### CR11 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [manual\|auto] | | false | HC | 3 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### CRF200S -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=-15999<=15999) | C | false | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [auto\|off] | | false | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [off\|on] | | false | HC | 4 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +### Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i -### Comfort RF | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=-15999<=15999) | C | false | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [auto\|off] | | false | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [off\|on] | | false | HC | 4 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| mandefrost | manual defrost | cmd [off\|on] | | true | DEVICE_DATA | 84 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 0 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 87 | 2 | 1/100 | +| nrgcool | energy cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 89 | 2 | 1/100 | +| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 91 | 2 | 1/100 | +| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 93 | 2 | 1/100 | +| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 95 | 2 | 1/100 | +| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 97 | 2 | 1/100 | +| metercool | meter cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 99 | 2 | 1/100 | +| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 2 | 2 | 1/100 | +| uptimetotal | heatpump total uptime | time (>=0<=279620) | minutes | false | DEVICE_DATA | 101 | 2 | 1/60 | +| uptimecontrol | total operating time heat | time (>=0<=279620) | minutes | false | DEVICE_DATA | 103 | 2 | 1/60 | +| uptimecompheating | operating time compressor heating | time (>=0<=279620) | minutes | false | DEVICE_DATA | 105 | 2 | 1/60 | +| uptimecompcooling | operating time compressor cooling | time (>=0<=279620) | minutes | false | DEVICE_DATA | 107 | 2 | 1/60 | +| dhw.uptimecomp | operating time compressor | time (>=0<=279620) | minutes | false | DHW | 4 | 2 | 1/60 | +| uptimecomppool | operating time compressor pool | time (>=0<=279620) | minutes | false | DEVICE_DATA | 109 | 2 | 1/60 | +| totalcompstarts | total compressor control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 111 | 2 | 1 | +| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 113 | 2 | 1 | +| coolingstarts | cooling control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 115 | 2 | 1 | +| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 6 | 2 | 1 | +| poolstarts | pool control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 117 | 2 | 1 | +| nrgconstotal | total energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 119 | 2 | 1 | +| nrgconscomptotal | total energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 121 | 2 | 1 | +| nrgconscompheating | energy consumption compressor heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 123 | 2 | 1 | +| dhw.nrgconscomp | energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DHW | 8 | 2 | 1 | +| nrgconscompcooling | energy consumption compressor cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 125 | 2 | 1 | +| nrgconscomppool | energy consumption compressor pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 127 | 2 | 1 | +| auxelecheatnrgconstotal | total aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 129 | 2 | 1 | +| auxelecheatnrgconsheating | aux elec. heater energy consumption heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 131 | 2 | 1 | +| dhw.auxelecheatnrgcons | aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DHW | 10 | 2 | 1 | +| auxelecheatnrgconspool | aux elec. heater energy consumption pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 133 | 2 | 1 | +| nrgsupptotal | total energy supplied | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 135 | 2 | 1 | +| nrgsuppheating | total energy supplied heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 137 | 2 | 1 | +| dhw.nrgsupp | total energy warm supplied | uint24 (>=0<=16777214) | kWh | false | DHW | 12 | 2 | 1 | +| nrgsuppcooling | total energy supplied cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 139 | 2 | 1 | +| nrgsupppool | total energy supplied pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 141 | 2 | 1 | +| hppower | compressor power output | uint16 (>=0<=3199) | kW | false | DEVICE_DATA | 143 | 1 | 1/10 | +| hpmaxpower | compressor max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 144 | 1 | 1 | +| pvmaxcomp | pv compressor max power | uint8 (>=0<=25) | kW | true | DEVICE_DATA | 145 | 1 | 1/10 | +| powerreduction | power reduction | uint8 (>=30<=60) | % | true | DEVICE_DATA | 146 | 1 | 10 | +| hpsetdiffpress | set differential pressure | uint8 (>=150<=750) | mbar | true | DEVICE_DATA | 147 | 1 | 50 | +| hpcompon | hp compressor | boolean | | false | DEVICE_DATA | 148 | 1 | 1 | +| hpactivity | compressor activity | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 149 | 1 | 1 | +| hpbrinepumpspd | brine pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 150 | 1 | 1 | +| hpswitchvalve | switch valve | boolean | | false | DEVICE_DATA | 151 | 1 | 1 | +| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 152 | 1 | 1 | +| hptargetspd | compressor target speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 153 | 1 | 1 | +| hpcircspd | circulation pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 154 | 1 | 1 | +| recvalve | receiver valve VR0 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 155 | 1 | 1 | +| expvalve | expansion valve VR1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 156 | 1 | 1 | +| hpbrinein | brine in/evaporator | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 157 | 1 | 1/10 | +| hpbrineout | brine out/condenser | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 158 | 1 | 1/10 | +| hptc0 | heat carrier return (TC0) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 159 | 1 | 1/10 | +| hptc1 | heat carrier forward (TC1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 160 | 1 | 1/10 | +| hptc3 | condenser temperature (TC3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 161 | 1 | 1/10 | +| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 162 | 1 | 1/10 | +| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 163 | 1 | 1/10 | +| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 164 | 1 | 1/10 | +| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 165 | 1 | 1/10 | +| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 166 | 1 | 1/10 | +| hptr7 | refrigerant temperature gas side (condenser input) (TR7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 167 | 1 | 1/10 | +| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 168 | 1 | 1/10 | +| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 169 | 1 | 1/10 | +| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 170 | 1 | 1/10 | +| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 171 | 1 | 1/10 | +| hptw1 | reservoir temp (TW1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 172 | 1 | 1/10 | +| poolsettemp | pool set temperature | uint8 (>=0<=127) | C | true | DEVICE_DATA | 173 | 1 | 1/2 | +| hpin1 | input 1 state | boolean | | false | DEVICE_DATA | 174 | 1 | 1 | +| hpin1opt | input 1 options | string | | true | DEVICE_DATA | 175 | 8 | 1 | +| hpin2 | input 2 state | boolean | | false | DEVICE_DATA | 183 | 1 | 1 | +| hpin2opt | input 2 options | string | | true | DEVICE_DATA | 184 | 8 | 1 | +| hpin3 | input 3 state | boolean | | false | DEVICE_DATA | 192 | 1 | 1 | +| hpin3opt | input 3 options | string | | true | DEVICE_DATA | 193 | 8 | 1 | +| hpin4 | input 4 state | boolean | | false | DEVICE_DATA | 201 | 1 | 1 | +| hpin4opt | input 4 options | string | | true | DEVICE_DATA | 202 | 8 | 1 | +| maxheatcomp | heat limit compressor | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 210 | 1 | 1 | +| maxheatheat | heat limit heating | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 211 | 1 | 1 | +| dhw.maxheat | heat limit | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DHW | 14 | 1 | 1 | +| auxheatersource | aux heater source | enum [not installed\|electric heater\|exclusive\|parallel\|hybrid] | | true | DEVICE_DATA | 212 | 1 | 1 | +| pvcooling | cooling only with PV | boolean | | true | DEVICE_DATA | 213 | 1 | 1 | +| auxheateronly | aux heater only | boolean | | true | DEVICE_DATA | 214 | 1 | 1 | +| auxheateroff | disable aux heater | boolean | | true | DEVICE_DATA | 215 | 1 | 1 | +| auxheaterstatus | aux heater status | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 216 | 1 | 1 | +| auxheaterlevel | aux heater level | uint8 (>=0<=100) | % | false | DEVICE_DATA | 217 | 1 | 1 | +| auxheaterdelay | aux heater on delay | uint16 (>=10<=1000) | K*min | true | DEVICE_DATA | 218 | 1 | 10 | +| auxmaxlimit | aux heater max limit | uint8 (>=0<=10) | K | true | DEVICE_DATA | 219 | 1 | 1/10 | +| auxlimitstart | aux heater limit start | uint8 (>=0<=10) | K | true | DEVICE_DATA | 220 | 1 | 1/10 | +| auxheatrmode | aux heater mode | enum [eco\|comfort] | | true | DEVICE_DATA | 221 | 1 | 1 | +| hphystheat | on/off hyst heat | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 222 | 1 | 5 | +| hphystcool | on/off hyst cool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 223 | 1 | 5 | +| hphystpool | on/off hyst pool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 224 | 1 | 5 | +| silentmode | silent mode | enum [off\|auto\|on] | | true | DEVICE_DATA | 225 | 1 | 1 | +| silentfrom | silent mode from | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 226 | 1 | 15 | +| silentto | silent mode to | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 227 | 1 | 15 | +| mintempsilent | min outside temp for silent mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 228 | 1 | 1 | +| tempparmode | outside temp parallel mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 229 | 1 | 1 | +| auxheatmix | aux heater mixing valve | int8 (>=-100<=100) | % | false | DEVICE_DATA | 230 | 1 | 1 | +| tempdiffheat | temp diff TC3/TC0 heat | uint8 (>=2<=10) | K | true | DEVICE_DATA | 231 | 1 | 1/10 | +| tempdiffcool | temp diff TC3/TC0 cool | uint8 (>=2<=10) | K | true | DEVICE_DATA | 232 | 1 | 1/10 | +| vpcooling | valve/pump cooling | boolean | | true | DEVICE_DATA | 233 | 1 | 1 | +| heatcable | heating cable | boolean | | true | DEVICE_DATA | 234 | 1 | 1 | +| vc0valve | VC0 valve | boolean | | true | DEVICE_DATA | 235 | 1 | 1 | +| primepump | primary heatpump | boolean | | true | DEVICE_DATA | 236 | 1 | 1 | +| primepumpmod | primary heatpump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 237 | 1 | 1 | +| hp3way | 3-way valve | boolean | | true | DEVICE_DATA | 238 | 1 | 1 | +| elheatstep1 | el. heater step 1 | boolean | | true | DEVICE_DATA | 239 | 1 | 1 | +| elheatstep2 | el. heater step 2 | boolean | | true | DEVICE_DATA | 240 | 1 | 1 | +| elheatstep3 | el. heater step 3 | boolean | | true | DEVICE_DATA | 241 | 1 | 1 | +| hpea0 | condensate reservoir heating (EA0) | boolean | | false | DEVICE_DATA | 242 | 1 | 1 | +| hppumpmode | primary heatpump mode | enum [auto\|continuous] | | true | DEVICE_DATA | 243 | 1 | 1 | +| fan | fan | uint8 (>=20<=100) | % | true | DEVICE_DATA | 244 | 1 | 1 | +| fanspd | fan speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 245 | 1 | 1 | +| shutdown | shutdown | cmd [off\|on] | | true | DEVICE_DATA | 246 | 1 | 1 | +| hpcurrpower | compressor current power | uint16 (>=0<=31999) | W | false | DEVICE_DATA | 247 | 1 | 1 | +| hppowerlimit | power limit | uint16 (>=0<=31999) | W | true | DEVICE_DATA | 248 | 1 | 1 | +| dhw.alternatingop | alternating operation | boolean | | true | DHW | 15 | 1 | 1 | +| dhw.altopprioheat | prioritise heating during dhw | uint8 (>=20<=120) | minutes | true | DHW | 16 | 1 | 1 | +| dhw.altopprio | prioritise dhw during heating | uint8 (>=30<=120) | minutes | true | DHW | 17 | 1 | 1 | +| dhw.comfoff | comfort switch off | uint8 (>=15<=65) | C | true | DHW | 18 | 1 | 1 | +| dhw.ecooff | eco switch off | uint8 (>=15<=65) | C | true | DHW | 19 | 1 | 1 | +| dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | +| dhw.comfdiff | comfort diff | uint8 (>=4<=15) | K | true | DHW | 21 | 1 | 1 | +| dhw.ecodiff | eco diff | uint8 (>=4<=15) | K | true | DHW | 22 | 1 | 1 | +| dhw.ecoplusdiff | eco+ diff | uint8 (>=4<=15) | K | true | DHW | 23 | 1 | 1 | +| dhw.comfstop | comfort stop temp | uint8 (>=0<=254) | C | true | DHW | 24 | 1 | 1 | +| dhw.ecostop | eco stop temp | uint8 (>=0<=254) | C | true | DHW | 25 | 1 | 1 | +| dhw.ecoplusstop | eco+ stop temp | uint8 (>=0<=254) | C | true | DHW | 26 | 1 | 1 | +| dhw.hpcircpump | circulation pump available during dhw | boolean | | true | DHW | 27 | 1 | 1 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | -### Comfort+2RF -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=-15999<=15999) | C | false | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [auto\|off] | | false | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [off\|on] | | false | HC | 4 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +### Geo 5xx -### ES72, RC20 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| mandefrost | manual defrost | cmd [off\|on] | | true | DEVICE_DATA | 84 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 0 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 87 | 2 | 1/100 | +| nrgcool | energy cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 89 | 2 | 1/100 | +| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 91 | 2 | 1/100 | +| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 93 | 2 | 1/100 | +| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 95 | 2 | 1/100 | +| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 97 | 2 | 1/100 | +| metercool | meter cooling | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 99 | 2 | 1/100 | +| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 2 | 2 | 1/100 | +| uptimetotal | heatpump total uptime | time (>=0<=279620) | minutes | false | DEVICE_DATA | 101 | 2 | 1/60 | +| uptimecontrol | total operating time heat | time (>=0<=279620) | minutes | false | DEVICE_DATA | 103 | 2 | 1/60 | +| uptimecompheating | operating time compressor heating | time (>=0<=279620) | minutes | false | DEVICE_DATA | 105 | 2 | 1/60 | +| uptimecompcooling | operating time compressor cooling | time (>=0<=279620) | minutes | false | DEVICE_DATA | 107 | 2 | 1/60 | +| dhw.uptimecomp | operating time compressor | time (>=0<=279620) | minutes | false | DHW | 4 | 2 | 1/60 | +| uptimecomppool | operating time compressor pool | time (>=0<=279620) | minutes | false | DEVICE_DATA | 109 | 2 | 1/60 | +| totalcompstarts | total compressor control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 111 | 2 | 1 | +| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 113 | 2 | 1 | +| coolingstarts | cooling control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 115 | 2 | 1 | +| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 6 | 2 | 1 | +| poolstarts | pool control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 117 | 2 | 1 | +| nrgconstotal | total energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 119 | 2 | 1 | +| nrgconscomptotal | total energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 121 | 2 | 1 | +| nrgconscompheating | energy consumption compressor heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 123 | 2 | 1 | +| dhw.nrgconscomp | energy consumption compressor | uint24 (>=0<=16777214) | kWh | false | DHW | 8 | 2 | 1 | +| nrgconscompcooling | energy consumption compressor cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 125 | 2 | 1 | +| nrgconscomppool | energy consumption compressor pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 127 | 2 | 1 | +| auxelecheatnrgconstotal | total aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 129 | 2 | 1 | +| auxelecheatnrgconsheating | aux elec. heater energy consumption heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 131 | 2 | 1 | +| dhw.auxelecheatnrgcons | aux elec. heater energy consumption | uint24 (>=0<=16777214) | kWh | false | DHW | 10 | 2 | 1 | +| auxelecheatnrgconspool | aux elec. heater energy consumption pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 133 | 2 | 1 | +| nrgsupptotal | total energy supplied | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 135 | 2 | 1 | +| nrgsuppheating | total energy supplied heating | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 137 | 2 | 1 | +| dhw.nrgsupp | total energy warm supplied | uint24 (>=0<=16777214) | kWh | false | DHW | 12 | 2 | 1 | +| nrgsuppcooling | total energy supplied cooling | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 139 | 2 | 1 | +| nrgsupppool | total energy supplied pool | uint24 (>=0<=16777214) | kWh | false | DEVICE_DATA | 141 | 2 | 1 | +| hppower | compressor power output | uint16 (>=0<=3199) | kW | false | DEVICE_DATA | 143 | 1 | 1/10 | +| hpmaxpower | compressor max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 144 | 1 | 1 | +| pvmaxcomp | pv compressor max power | uint8 (>=0<=25) | kW | true | DEVICE_DATA | 145 | 1 | 1/10 | +| powerreduction | power reduction | uint8 (>=30<=60) | % | true | DEVICE_DATA | 146 | 1 | 10 | +| hpsetdiffpress | set differential pressure | uint8 (>=150<=750) | mbar | true | DEVICE_DATA | 147 | 1 | 50 | +| hpcompon | hp compressor | boolean | | false | DEVICE_DATA | 148 | 1 | 1 | +| hpactivity | compressor activity | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 149 | 1 | 1 | +| hpbrinepumpspd | brine pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 150 | 1 | 1 | +| hpswitchvalve | switch valve | boolean | | false | DEVICE_DATA | 151 | 1 | 1 | +| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 152 | 1 | 1 | +| hptargetspd | compressor target speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 153 | 1 | 1 | +| hpcircspd | circulation pump speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 154 | 1 | 1 | +| recvalve | receiver valve VR0 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 155 | 1 | 1 | +| expvalve | expansion valve VR1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 156 | 1 | 1 | +| hpbrinein | brine in/evaporator | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 157 | 1 | 1/10 | +| hpbrineout | brine out/condenser | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 158 | 1 | 1/10 | +| hptc0 | heat carrier return (TC0) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 159 | 1 | 1/10 | +| hptc1 | heat carrier forward (TC1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 160 | 1 | 1/10 | +| hptc3 | condenser temperature (TC3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 161 | 1 | 1/10 | +| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 162 | 1 | 1/10 | +| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 163 | 1 | 1/10 | +| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 164 | 1 | 1/10 | +| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 165 | 1 | 1/10 | +| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 166 | 1 | 1/10 | +| hptr7 | refrigerant temperature gas side (condenser input) (TR7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 167 | 1 | 1/10 | +| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 168 | 1 | 1/10 | +| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 169 | 1 | 1/10 | +| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 170 | 1 | 1/10 | +| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 171 | 1 | 1/10 | +| hptw1 | reservoir temp (TW1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 172 | 1 | 1/10 | +| poolsettemp | pool set temperature | uint8 (>=0<=127) | C | true | DEVICE_DATA | 173 | 1 | 1/2 | +| hpin1 | input 1 state | boolean | | false | DEVICE_DATA | 174 | 1 | 1 | +| hpin1opt | input 1 options | string | | true | DEVICE_DATA | 175 | 8 | 1 | +| hpin2 | input 2 state | boolean | | false | DEVICE_DATA | 183 | 1 | 1 | +| hpin2opt | input 2 options | string | | true | DEVICE_DATA | 184 | 8 | 1 | +| hpin3 | input 3 state | boolean | | false | DEVICE_DATA | 192 | 1 | 1 | +| hpin3opt | input 3 options | string | | true | DEVICE_DATA | 193 | 8 | 1 | +| hpin4 | input 4 state | boolean | | false | DEVICE_DATA | 201 | 1 | 1 | +| hpin4opt | input 4 options | string | | true | DEVICE_DATA | 202 | 8 | 1 | +| maxheatcomp | heat limit compressor | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 210 | 1 | 1 | +| maxheatheat | heat limit heating | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DEVICE_DATA | 211 | 1 | 1 | +| dhw.maxheat | heat limit | enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW] | | true | DHW | 14 | 1 | 1 | +| auxheatersource | aux heater source | enum [not installed\|electric heater\|exclusive\|parallel\|hybrid] | | true | DEVICE_DATA | 212 | 1 | 1 | +| pvcooling | cooling only with PV | boolean | | true | DEVICE_DATA | 213 | 1 | 1 | +| auxheateronly | aux heater only | boolean | | true | DEVICE_DATA | 214 | 1 | 1 | +| auxheateroff | disable aux heater | boolean | | true | DEVICE_DATA | 215 | 1 | 1 | +| auxheaterstatus | aux heater status | enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm] | | false | DEVICE_DATA | 216 | 1 | 1 | +| auxheaterlevel | aux heater level | uint8 (>=0<=100) | % | false | DEVICE_DATA | 217 | 1 | 1 | +| auxheaterdelay | aux heater on delay | uint16 (>=10<=1000) | K*min | true | DEVICE_DATA | 218 | 1 | 10 | +| auxmaxlimit | aux heater max limit | uint8 (>=0<=10) | K | true | DEVICE_DATA | 219 | 1 | 1/10 | +| auxlimitstart | aux heater limit start | uint8 (>=0<=10) | K | true | DEVICE_DATA | 220 | 1 | 1/10 | +| auxheatrmode | aux heater mode | enum [eco\|comfort] | | true | DEVICE_DATA | 221 | 1 | 1 | +| hphystheat | on/off hyst heat | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 222 | 1 | 5 | +| hphystcool | on/off hyst cool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 223 | 1 | 5 | +| hphystpool | on/off hyst pool | uint16 (>=50<=1500) | K*min | true | DEVICE_DATA | 224 | 1 | 5 | +| silentmode | silent mode | enum [off\|auto\|on] | | true | DEVICE_DATA | 225 | 1 | 1 | +| silentfrom | silent mode from | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 226 | 1 | 15 | +| silentto | silent mode to | uint8 (>=0<=3810) | minutes | true | DEVICE_DATA | 227 | 1 | 15 | +| mintempsilent | min outside temp for silent mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 228 | 1 | 1 | +| tempparmode | outside temp parallel mode | int8 (>=-126<=126) | C | true | DEVICE_DATA | 229 | 1 | 1 | +| auxheatmix | aux heater mixing valve | int8 (>=-100<=100) | % | false | DEVICE_DATA | 230 | 1 | 1 | +| tempdiffheat | temp diff TC3/TC0 heat | uint8 (>=2<=10) | K | true | DEVICE_DATA | 231 | 1 | 1/10 | +| tempdiffcool | temp diff TC3/TC0 cool | uint8 (>=2<=10) | K | true | DEVICE_DATA | 232 | 1 | 1/10 | +| vpcooling | valve/pump cooling | boolean | | true | DEVICE_DATA | 233 | 1 | 1 | +| heatcable | heating cable | boolean | | true | DEVICE_DATA | 234 | 1 | 1 | +| vc0valve | VC0 valve | boolean | | true | DEVICE_DATA | 235 | 1 | 1 | +| primepump | primary heatpump | boolean | | true | DEVICE_DATA | 236 | 1 | 1 | +| primepumpmod | primary heatpump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 237 | 1 | 1 | +| hp3way | 3-way valve | boolean | | true | DEVICE_DATA | 238 | 1 | 1 | +| elheatstep1 | el. heater step 1 | boolean | | true | DEVICE_DATA | 239 | 1 | 1 | +| elheatstep2 | el. heater step 2 | boolean | | true | DEVICE_DATA | 240 | 1 | 1 | +| elheatstep3 | el. heater step 3 | boolean | | true | DEVICE_DATA | 241 | 1 | 1 | +| hpea0 | condensate reservoir heating (EA0) | boolean | | false | DEVICE_DATA | 242 | 1 | 1 | +| hppumpmode | primary heatpump mode | enum [auto\|continuous] | | true | DEVICE_DATA | 243 | 1 | 1 | +| fan | fan | uint8 (>=20<=100) | % | true | DEVICE_DATA | 244 | 1 | 1 | +| fanspd | fan speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 245 | 1 | 1 | +| shutdown | shutdown | cmd [off\|on] | | true | DEVICE_DATA | 246 | 1 | 1 | +| hpcurrpower | compressor current power | uint16 (>=0<=31999) | W | false | DEVICE_DATA | 247 | 1 | 1 | +| hppowerlimit | power limit | uint16 (>=0<=31999) | W | true | DEVICE_DATA | 248 | 1 | 1 | +| dhw.alternatingop | alternating operation | boolean | | true | DHW | 15 | 1 | 1 | +| dhw.altopprioheat | prioritise heating during dhw | uint8 (>=20<=120) | minutes | true | DHW | 16 | 1 | 1 | +| dhw.altopprio | prioritise dhw during heating | uint8 (>=30<=120) | minutes | true | DHW | 17 | 1 | 1 | +| dhw.comfoff | comfort switch off | uint8 (>=15<=65) | C | true | DHW | 18 | 1 | 1 | +| dhw.ecooff | eco switch off | uint8 (>=15<=65) | C | true | DHW | 19 | 1 | 1 | +| dhw.ecoplusoff | eco+ switch off | uint8 (>=48<=63) | C | true | DHW | 20 | 1 | 1 | +| dhw.comfdiff | comfort diff | uint8 (>=4<=15) | K | true | DHW | 21 | 1 | 1 | +| dhw.ecodiff | eco diff | uint8 (>=4<=15) | K | true | DHW | 22 | 1 | 1 | +| dhw.ecoplusdiff | eco+ diff | uint8 (>=4<=15) | K | true | DHW | 23 | 1 | 1 | +| dhw.comfstop | comfort stop temp | uint8 (>=0<=254) | C | true | DHW | 24 | 1 | 1 | +| dhw.ecostop | eco stop temp | uint8 (>=0<=254) | C | true | DHW | 25 | 1 | 1 | +| dhw.ecoplusstop | eco+ stop temp | uint8 (>=0<=254) | C | true | DHW | 26 | 1 | 1 | +| dhw.hpcircpump | circulation pump available during dhw | boolean | | true | DHW | 27 | 1 | 1 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | -### ES73 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| display | display | enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | -| language | language | enum [german\|dutch\|french\|italian] | | false | DEVICE_DATA | 66 | 1 | 1 | -| clockoffset | clock offset | int8 (>=-126<=126) | seconds | true | DEVICE_DATA | 67 | 1 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | -| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 57 | 1 | 1/2 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | -| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 58 | 1 | 1/2 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.holidaymode | holiday mode | boolean | | false | HC | 59 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | -| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 60 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | -| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | -| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | -| hc1.holidays | holiday dates | string | | true | HC | 61 | 13 | 1 | -| hc1.vacations | vacation dates | string | | true | HC | 74 | 13 | 1 | -| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | -| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 87 | 1 | 1 | -| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 88 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | -| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 89 | 1 | 1 | -| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 90 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 91 | 8 | 1 | -| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 99 | 8 | 1 | -| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 3 | 1 | 1 | -| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 12 | 1 | 1 | -| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 14 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 15 | 1 | 1 | -| dhw.onetimekey | one time key function | boolean | | true | DHW | 16 | 1 | 1 | -| dhw.switchtimeWW | program switchtime warm water | string | | true | DHW | 17 | 11 | 1 | -| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 28 | 8 | 1 | -| dhw.holidays | holiday dates | string | | true | DHW | 36 | 13 | 1 | -| dhw.vacations | vacation dates | string | | true | DHW | 49 | 13 | 1 | +### Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2 -### ES79 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-5<=5) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| minexttemp | minimal external temperature | int8 (>=-30<=0) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | -| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 57 | 1 | 1/2 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | -| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 58 | 1 | 1/2 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.holidaymode | holiday mode | boolean | | false | HC | 59 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | -| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 60 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | -| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | -| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | -| hc1.holidays | holiday dates | string | | true | HC | 61 | 13 | 1 | -| hc1.vacations | vacation dates | string | | true | HC | 74 | 13 | 1 | -| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | -| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 87 | 1 | 1 | -| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 88 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | -| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 89 | 1 | 1 | -| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 90 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 91 | 8 | 1 | -| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 99 | 8 | 1 | -| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 3 | 1 | 1 | -| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 12 | 1 | 1 | -| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 14 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=60<=80) | C | true | DHW | 15 | 1 | 1 | -| dhw.onetimekey | one time key function | boolean | | true | DHW | 16 | 1 | 1 | -| dhw.switchtimeWW | program switchtime warm water | string | | true | DHW | 17 | 11 | 1 | -| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 28 | 8 | 1 | -| dhw.holidays | holiday dates | string | | true | DHW | 36 | 13 | 1 | -| dhw.vacations | vacation dates | string | | true | DHW | 49 | 13 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### EasyControl, CT200 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=-319<=319) | C | false | HC | 0 | 1 | 1/100 | -| hc1.currtemp | current room temperature | int16 (>=-319<=319) | C | false | HC | 1 | 1 | 1/100 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +### Logamax U122, Cerapur -### FB10 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### FB100 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +### Ecomline Excellent -### FR10 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### FR100 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +### Logamax Plus, GB192, Condens GC9000, Greenstar ErP -### FR110 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### FR120 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +### Cascade MC400 -### FR50 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### FW100 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +### EasyControl Adapter -### FW120 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | -### FW200 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +### Greenstar HIU, Logamax kompakt WS170 -### FW500 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | -| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 198 | 1 | 1/2 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | -| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | -| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | -| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 199 | 1 | 1 | -| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 59 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 200 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | -| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | +| netflowtemp | heat network flow temp | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 276 | 1 | 1/10 | +| heatvalve | heating valve | uint8 (>=0<=100) | % | false | DEVICE_DATA | 277 | 1 | 1 | +| dhw.dhwvalve | valve | uint8 (>=0<=100) | % | false | DHW | 75 | 1 | 1 | +| keepwarmtemp | keep warm temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 278 | 1 | 1 | +| setreturntemp | set temp return | uint8 (>=0<=254) | C | true | DEVICE_DATA | 279 | 1 | 1 | +| heating | heating | boolean | | false | DEVICE_DATA | 280 | 1 | 1 | +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | + +### Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| reset | reset | cmd [-\|maintenance\|error\|history\|message] | | true | DEVICE_DATA | 0 | 1 | 1 | +| chimneysweeper | chimney sweeper | cmd [off\|on] | | true | DEVICE_DATA | 1 | 1 | 1 | +| heatingoff | force heating off | boolean | | true | DEVICE_DATA | 2 | 1 | 1 | +| heatingactive | heating active | boolean | | false | DEVICE_DATA | 3 | 1 | 1 | +| tapwateractive | tapwater active | boolean | | false | DEVICE_DATA | 4 | 1 | 1 | +| selflowtemp | selected flow temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 6 | 1 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| curflowtemp | current flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| rettemp | return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| switchtemp | mixing switch temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| syspress | system pressure | uint8 (>=0<=25) | bar | false | DEVICE_DATA | 11 | 1 | 1/10 | +| boiltemp | actual boiler temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| headertemp | low loss header | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| exhausttemp | exhaust temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 249 | 1 | 1/10 | +| burngas | gas | boolean | | false | DEVICE_DATA | 250 | 1 | 1 | +| burngas2 | gas stage 2 | boolean | | false | DEVICE_DATA | 251 | 1 | 1 | +| flamecurr | flame current | uint16 (>=0<=3199) | µA | false | DEVICE_DATA | 252 | 1 | 1/10 | +| fanwork | fan | boolean | | false | DEVICE_DATA | 253 | 1 | 1 | +| ignwork | ignition | boolean | | false | DEVICE_DATA | 254 | 1 | 1 | +| oilpreheat | oil preheating | boolean | | false | DEVICE_DATA | 255 | 1 | 1 | +| burnminpower | burner min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 256 | 1 | 1 | +| burnmaxpower | burner max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 257 | 1 | 1 | +| burnminperiod | burner min period | uint8 (>=0<=120) | minutes | true | DEVICE_DATA | 258 | 1 | 1 | +| absburnpow | burner current power (absolute) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 259 | 1 | 1 | +| heatblock | heating block | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 260 | 1 | 1/10 | +| boilhyston | hysteresis on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 261 | 1 | 1 | +| boilhystoff | hysteresis off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 262 | 1 | 1 | +| boil2hyston | hysteresis stage 2 on temperature | int8 (>=-20<=0) | C | true | DEVICE_DATA | 263 | 1 | 1 | +| boil2hystoff | hysteresis stage 2 off temperature | int8 (>=0<=20) | C | true | DEVICE_DATA | 264 | 1 | 1 | +| curveon | heatingcurve on | boolean | | true | DEVICE_DATA | 265 | 1 | 1 | +| curvebase | heatingcurve base | uint8 (>=20<=90) | C | true | DEVICE_DATA | 266 | 1 | 1 | +| curveend | heatingcurve end | uint8 (>=20<=90) | C | true | DEVICE_DATA | 267 | 1 | 1 | +| summertemp | summer temperature | uint8 (>=0<=45) | C | true | DEVICE_DATA | 268 | 1 | 1 | +| nofrostmode | nofrost mode | boolean | | true | DEVICE_DATA | 269 | 1 | 1 | +| nofrosttemp | nofrost temperature | uint8 (>=0<=10) | C | true | DEVICE_DATA | 270 | 1 | 1 | +| heatingactivated | heating activated | boolean | | true | DEVICE_DATA | 14 | 1 | 1 | +| heatingtemp | heating temperature | uint8 (>=0<=90) | C | true | DEVICE_DATA | 15 | 1 | 1 | +| heatingpump | heating pump | boolean | | false | DEVICE_DATA | 16 | 1 | 1 | +| pumpmodmax | boiler pump max power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 17 | 1 | 1 | +| pumpmodmin | boiler pump min power | uint8 (>=0<=100) | % | true | DEVICE_DATA | 18 | 1 | 1 | +| pumpmode | boiler pump mode | enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4] | | true | DEVICE_DATA | 19 | 1 | 1 | +| pumpcharacter | boiler pump characteristic | enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar] | | true | DEVICE_DATA | 20 | 1 | 1 | +| pumpdelay | pump delay | uint8 (>=0<=60) | minutes | true | DEVICE_DATA | 21 | 1 | 1 | +| pumpontemp | pump logic temperature | uint8 (>=0<=60) | C | true | DEVICE_DATA | 22 | 1 | 1 | +| selburnpow | burner selected max power | uint8 (>=0<=254) | % | true | DEVICE_DATA | 23 | 1 | 1 | +| curburnpow | burner current power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 24 | 1 | 1 | +| burnstarts | burner starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 25 | 2 | 1 | +| burnworkmin | total burner operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 27 | 2 | 1 | +| burn2workmin | burner stage 2 operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 29 | 2 | 1 | +| heatworkmin | total heat operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 31 | 2 | 1 | +| heatstarts | burner starts heating | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 33 | 2 | 1 | +| ubauptime | total UBA operating time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 35 | 2 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 37 | 28 | 1 | +| servicecode | service code | string | | false | DEVICE_DATA | 65 | 2 | 1 | +| servicecodenumber | service code number | uint16 (>=0<=31999) | | false | DEVICE_DATA | 67 | 1 | 1 | +| maintenancemessage | maintenance message | string | | false | DEVICE_DATA | 68 | 2 | 1 | +| maintenance | maintenance scheduled | enum [off\|time\|date\|manual] | | true | DEVICE_DATA | 70 | 1 | 1 | +| maintenancetime | time to next maintenance | uint16 (>=0<=31999) | hours | true | DEVICE_DATA | 71 | 1 | 1 | +| maintenancedate | next maintenance date | string | | true | DEVICE_DATA | 72 | 6 | 1 | +| emergencyops | emergency operation | boolean | | true | DEVICE_DATA | 78 | 1 | 1 | +| emergencytemp | emergency temperature | uint8 (>=15<=70) | C | true | DEVICE_DATA | 79 | 1 | 1 | +| pc0flow | Flow PC0 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 80 | 1 | 1 | +| pc1flow | Flow PC1 | int16 (>=-31999<=31999) | l/h | false | DEVICE_DATA | 81 | 1 | 1 | +| pc1on | PC1 | boolean | | false | DEVICE_DATA | 82 | 1 | 1 | +| pc1rate | PC1 rate | uint8 (>=0<=100) | % | false | DEVICE_DATA | 83 | 1 | 1 | +| meterheat | meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 97 | 2 | 1/10 | +| dhw.meter | meter | uint24 (>=0<=1677721) | kWh | false | DHW | 2 | 2 | 1/10 | +| gasmeterheat | gas meter heating | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 271 | 2 | 1/10 | +| dhw.gasmeter | gas meter | uint24 (>=0<=1677721) | kWh | false | DHW | 71 | 2 | 1/10 | +| nrgheat2 | energy heating 2 | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 273 | 2 | 1/10 | +| dhw.nrg2 | energy 2 | uint24 (>=0<=1677721) | kWh | false | DHW | 73 | 2 | 1/10 | +| dhw.tapactivated | turn on/off | boolean | | true | DHW | 28 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | false | DHW | 29 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 30 | 1 | 1 | +| dhw.seltemplow | selected lower temperature | uint8 (>=0<=254) | C | true | DHW | 31 | 1 | 1 | +| dhw.tempecoplus | selected eco+ temperature | uint8 (>=0<=254) | C | true | DHW | 32 | 1 | 1 | +| dhw.seltempoff | selected temperature for off | uint8 (>=0<=254) | C | false | DHW | 33 | 1 | 1 | +| dhw.seltempsingle | single charge temperature | uint8 (>=0<=254) | C | true | DHW | 34 | 1 | 1 | +| dhw.solartemp | solar boiler temperature | uint16 (>=0<=3199) | C | false | DHW | 35 | 1 | 1/10 | +| dhw.type | type | enum [off\|flow\|buffered flow\|buffer\|layered buffer] | | false | DHW | 36 | 1 | 1 | +| dhw.comfort | comfort | enum [hot\|eco\|intelligent] | | true | DHW | 37 | 1 | 1 | +| dhw.comfort1 | comfort mode | enum [high comfort\|eco] | | true | DHW | 38 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=100) | C | true | DHW | 39 | 1 | 1 | +| dhw.chargeoptimization | charge optimization | boolean | | true | DHW | 40 | 1 | 1 | +| dhw.maxpower | max power | uint8 (>=0<=254) | % | true | DHW | 41 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=80) | C | true | DHW | 42 | 1 | 1 | +| dhw.circpump | circulation pump available | boolean | | true | DHW | 43 | 1 | 1 | +| dhw.chargetype | charging type | enum [chargepump\|3-way valve] | | false | DHW | 44 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 45 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 46 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=60<=80) | C | true | DHW | 47 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 48 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 49 | 1 | 1 | +| dhw.curtemp | current intern temperature | uint16 (>=0<=3199) | C | false | DHW | 50 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 51 | 1 | 1/10 | +| dhw.curflow | current tap water flow | uint8 (>=0<=25) | l/min | false | DHW | 52 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 53 | 1 | 1/10 | +| dhw.storagetemp2 | storage extern temperature | uint16 (>=0<=3199) | C | false | DHW | 54 | 1 | 1/10 | +| dhw.activated | activated | boolean | | true | DHW | 55 | 1 | 1 | +| dhw.onetime | one time charging | boolean | | true | DHW | 56 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 57 | 1 | 1 | +| dhw.charging | charging | boolean | | false | DHW | 58 | 1 | 1 | +| dhw.recharging | recharging | boolean | | false | DHW | 59 | 1 | 1 | +| dhw.tempok | temperature ok | boolean | | false | DHW | 60 | 1 | 1 | +| dhw.active | active | boolean | | false | DHW | 61 | 1 | 1 | +| dhw.3wayvalve | 3-way valve active | boolean | | false | DHW | 62 | 1 | 1 | +| dhw.chargepump | charge pump | boolean | | false | DHW | 63 | 1 | 1 | +| dhw.mixertemp | mixer temperature | uint16 (>=0<=3199) | C | false | DHW | 64 | 1 | 1/10 | +| dhw.cylmiddletemp | cylinder middle temperature (TS3) | uint16 (>=0<=3199) | C | false | DHW | 65 | 1 | 1/10 | +| dhw.dhwprio | dhw priority | boolean | | true | DHW | 66 | 1 | 1 | +| dhw.starts | starts | uint24 (>=0<=16777214) | | false | DHW | 67 | 2 | 1 | +| dhw.workm | active time | time (>=0<=16777214) | minutes | false | DHW | 69 | 2 | 1 | +| nompower | nominal Power | uint8 (>=0<=254) | kW | true | DEVICE_DATA | 275 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 85 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=10000000) | kWh | true | DEVICE_DATA | 87 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=10000000) | kWh | true | DHW | 0 | 2 | 1/100 | + +## Devices of type \_thermostat ### Logamatic TC100, Moduline Easy -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=-319<=319) | C | false | HC | 0 | 1 | 1/100 | -| hc1.currtemp | current room temperature | int16 (>=-319<=319) | C | false | HC | 1 | 1 | 1/100 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -### Moduline 200 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| heatingpid | heating PID | enum [fast\|medium\|slow] | | true | DEVICE_DATA | 74 | 1 | 1 | -| backlight | key backlight | boolean | | true | DEVICE_DATA | 71 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|night\|day] | | true | HC | 3 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.reducehours | duration for nighttemp | uint8 (>=0<=254) | hours | true | HC | 196 | 1 | 1 | -| hc1.reduceminutes | remaining time for nightmode | uint16 (>=0<=31999) | minutes | false | HC | 197 | 1 | 1 | -| dhw.mode | operating mode | enum [on\|off\|auto] | | true | DHW | 0 | 1 | 1 | +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=-319<=319) | C | false | HC | 0 | 1 | 1/100 | +| hc1.currtemp | current room temperature | int16 (>=-319<=319) | C | false | HC | 1 | 1 | 1/100 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -### Moduline 400 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| clockoffset | clock offset | int8 (>=-126<=126) | seconds | true | DEVICE_DATA | 67 | 1 | 1 | -| autodst | automatic change daylight saving time | boolean | | true | DEVICE_DATA | 70 | 1 | 1 | -| language | language | enum [german\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | -| backlight | key backlight | boolean | | true | DEVICE_DATA | 71 | 1 | 1 | -| brightness | screen brightness | int8 (>=-15<=15) | | true | DEVICE_DATA | 72 | 1 | 1 | -| mixingvalves | mixing valves | uint8 (>=0<=2) | | true | DEVICE_DATA | 73 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| heatingpid | heating PID | enum [fast\|medium\|slow] | | true | DEVICE_DATA | 74 | 1 | 1 | -| preheating | preheating in the clock program | boolean | | true | DEVICE_DATA | 75 | 1 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.pause | pause time | uint8 (>=0<=254) | hours | true | HC | 87 | 1 | 1 | -| hc1.party | party time | uint8 (>=0<=254) | hours | true | HC | 88 | 1 | 1 | -| hc1.vacations1 | vacation dates 1 | string | | true | HC | 119 | 11 | 1 | -| hc1.vacations2 | vacation dates 2 | string | | true | HC | 130 | 11 | 1 | -| hc1.vacations3 | vacation dates 3 | string | | true | HC | 141 | 11 | 1 | -| hc1.vacations4 | vacation dates 4 | string | | true | HC | 152 | 11 | 1 | -| hc1.vacations5 | vacation dates 5 | string | | true | HC | 163 | 11 | 1 | -| hc1.vacations6 | vacation dates 6 | string | | true | HC | 174 | 11 | 1 | -| hc1.vacations7 | vacation dates 7 | string | | true | HC | 185 | 11 | 1 | -| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | -| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 91 | 8 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | -| hc1.holidaytemp | holiday temperature | uint8 (>=0<=127) | C | true | HC | 58 | 1 | 1/2 | -| hc1.nighttemp | night temperature T1 | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.daytemp2 | day temperature T2 | uint8 (>=0<=127) | C | true | HC | 108 | 1 | 1/2 | -| hc1.daytemp3 | day temperature T3 | uint8 (>=0<=127) | C | true | HC | 109 | 1 | 1/2 | -| hc1.daytemp4 | day temperature T4 | uint8 (>=0<=127) | C | true | HC | 110 | 1 | 1/2 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.offtemp | temperature when mode is off | uint8 (>=0<=127) | C | true | HC | 107 | 1 | 1/2 | -| dhw.mode | operating mode | enum [on\|off\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.whenmodeoff | when thermostat mode off | boolean | | true | DHW | 62 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 14 | 1 | 1 | +### EasyControl, CT200 -### RC10 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | - -### RC10, Moduline 100 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| heatingpid | heating PID | enum [fast\|medium\|slow] | | true | DEVICE_DATA | 74 | 1 | 1 | -| backlight | key backlight | boolean | | true | DEVICE_DATA | 71 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [nofrost\|night\|day] | | true | HC | 3 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.reducehours | duration for nighttemp | uint8 (>=0<=254) | hours | true | HC | 196 | 1 | 1 | -| hc1.reduceminutes | remaining time for nightmode | uint16 (>=0<=31999) | minutes | false | HC | 197 | 1 | 1 | -| dhw.mode | operating mode | enum [on\|off\|auto] | | true | DHW | 0 | 1 | 1 | -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | - -### RC100, CR10, Moduline 1000/1010 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [manual\|auto] | | false | HC | 3 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | - -### RC100H, CR10H -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | - -### RC20, Moduline 300 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.offtemp | temperature when mode is off | uint8 (>=0<=127) | C | true | HC | 107 | 1 | 1/2 | -| hc1.daytemp2 | day temperature T2 | uint8 (>=0<=127) | C | true | HC | 108 | 1 | 1/2 | -| hc1.daytemp3 | day temperature T3 | uint8 (>=0<=127) | C | true | HC | 109 | 1 | 1/2 | -| hc1.daytemp4 | day temperature T4 | uint8 (>=0<=127) | C | true | HC | 110 | 1 | 1/2 | -| hc1.nighttemp | night temperature T1 | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.switchtime | program switchtime | string | | true | HC | 111 | 8 | 1 | - -### RC200, CW100, CR120, CR50 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | -| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | -| vacations | vacation dates | string | | true | DEVICE_DATA | 76 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | -| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | -| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | -| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | -| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | -| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | -| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | -| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | -| hc1.controlmode | control mode | enum [optimized\|simple\|n/a\|room\|power] | | true | HC | 25 | 1 | 1 | -| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | -| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | -| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | -| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | -| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | -| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | -| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | -| hc1.control | control device | enum [RC310\|RC200\|RC100\|RC100H\|TC100] | | true | HC | 41 | 1 | 1 | -| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | -| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | -| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | -| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | -| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | -| hc1.currsolarinfl | curent solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | -| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 1 | 1 | 1 | -| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 3 | 1 | 1 | -| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 4 | 1 | 15 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | -| dhw.extra | extra | boolean | | false | DHW | 6 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 9 | 1 | 15 | -| dhw.dailyheating | daily heating | boolean | | true | DHW | 10 | 1 | 1 | -| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 11 | 1 | 15 | - -### RC20RF -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.offtemp | temperature when mode is off | uint8 (>=0<=127) | C | true | HC | 107 | 1 | 1/2 | -| hc1.daytemp2 | day temperature T2 | uint8 (>=0<=127) | C | true | HC | 108 | 1 | 1/2 | -| hc1.daytemp3 | day temperature T3 | uint8 (>=0<=127) | C | true | HC | 109 | 1 | 1/2 | -| hc1.daytemp4 | day temperature T4 | uint8 (>=0<=127) | C | true | HC | 110 | 1 | 1/2 | -| hc1.nighttemp | night temperature T1 | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.switchtime | program switchtime | string | | true | HC | 111 | 8 | 1 | - -### RC25 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 57 | 1 | 1/2 | -| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | - -### RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | -| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | -| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | -| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | -| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | -| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | -| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | -| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | -| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | -| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | -| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | -| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | -| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | -| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | -| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | -| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | -| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | -| hc1.control | control device | enum [RC310\|RC200\|RC100\|RC100H\|TC100] | | true | HC | 41 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | -| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | -| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | -| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | -| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | -| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | -| hc1.currsolarinfl | curent solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | -| dhw.mode | operating mode | enum [off\|normal\|comfort\|auto\|own prog] | | true | DHW | 0 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 1 | 1 | 1 | -| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 3 | 1 | 1 | -| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 4 | 1 | 15 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | -| dhw.extra | extra | boolean | | false | DHW | 6 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 9 | 1 | 15 | -| dhw.dailyheating | daily heating | boolean | | true | DHW | 10 | 1 | 1 | -| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 11 | 1 | 15 | - -### RC30 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| display | display | enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | -| language | language | enum [german\|dutch\|french\|italian] | | false | DEVICE_DATA | 66 | 1 | 1 | -| clockoffset | clock offset | int8 (>=-126<=126) | seconds | true | DEVICE_DATA | 67 | 1 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | -| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 57 | 1 | 1/2 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | -| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 58 | 1 | 1/2 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.holidaymode | holiday mode | boolean | | false | HC | 59 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | -| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 60 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | -| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | -| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | -| hc1.holidays | holiday dates | string | | true | HC | 61 | 13 | 1 | -| hc1.vacations | vacation dates | string | | true | HC | 74 | 13 | 1 | -| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | -| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 87 | 1 | 1 | -| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 88 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | -| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 89 | 1 | 1 | -| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 90 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 91 | 8 | 1 | -| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 99 | 8 | 1 | -| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 3 | 1 | 1 | -| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 12 | 1 | 1 | -| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 14 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 15 | 1 | 1 | -| dhw.onetimekey | one time key function | boolean | | true | DHW | 16 | 1 | 1 | -| dhw.switchtimeWW | program switchtime warm water | string | | true | DHW | 17 | 11 | 1 | -| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 28 | 8 | 1 | -| dhw.holidays | holiday dates | string | | true | DHW | 36 | 13 | 1 | -| dhw.vacations | vacation dates | string | | true | DHW | 49 | 13 | 1 | - -### RC35 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-5<=5) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| minexttemp | minimal external temperature | int8 (>=-30<=0) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | -| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | -| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 56 | 1 | 1/2 | -| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 57 | 1 | 1/2 | -| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | -| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 58 | 1 | 1/2 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.holidaymode | holiday mode | boolean | | false | HC | 59 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | -| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | -| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 60 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | -| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | -| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | -| hc1.holidays | holiday dates | string | | true | HC | 61 | 13 | 1 | -| hc1.vacations | vacation dates | string | | true | HC | 74 | 13 | 1 | -| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | -| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 87 | 1 | 1 | -| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 88 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | -| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 89 | 1 | 1 | -| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 90 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 91 | 8 | 1 | -| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 99 | 8 | 1 | -| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 3 | 1 | 1 | -| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 12 | 1 | 1 | -| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 14 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=60<=80) | C | true | DHW | 15 | 1 | 1 | -| dhw.onetimekey | one time key function | boolean | | true | DHW | 16 | 1 | 1 | -| dhw.switchtimeWW | program switchtime warm water | string | | true | DHW | 17 | 11 | 1 | -| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 28 | 8 | 1 | -| dhw.holidays | holiday dates | string | | true | DHW | 36 | 13 | 1 | -| dhw.vacations | vacation dates | string | | true | DHW | 49 | 13 | 1 | - -### RFM20 Remote -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | - -### RT800, RC220 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | - -### Rego 2000/3000 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | -| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | -| vacations | vacation dates | string | | true | DEVICE_DATA | 76 | 13 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | -| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | -| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | -| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | -| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | -| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | -| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | -| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | -| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | -| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | -| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | -| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | -| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | -| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | -| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | -| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | -| hc1.control | control device | enum [RC310\|RC200\|RC100\|RC100H\|TC100] | | true | HC | 41 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | -| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | -| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | -| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | -| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | -| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | -| hc1.currsolarinfl | curent solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | -| dhw.mode | operating mode | enum [normal\|comfort\|eco+] | | true | DHW | 0 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 1 | 1 | 1 | -| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 3 | 1 | 1 | -| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 4 | 1 | 15 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | -| dhw.extra | extra | boolean | | false | DHW | 6 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 9 | 1 | 15 | -| dhw.dailyheating | daily heating | boolean | | true | DHW | 10 | 1 | 1 | -| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 11 | 1 | 15 | - -### Rego 3000, UI800, Logamatic BC400 -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | -| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | -| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | -| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | -| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | -| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | -| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | -| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | -| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | -| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | -| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | -| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | -| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | -| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | -| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | -| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | -| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | -| hc1.control | control device | enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single] | | true | HC | 41 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | -| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | -| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | -| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | -| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | -| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | -| hc1.currsolarinfl | curent solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | -| dhw.mode | operating mode | enum [off\|eco+\|eco\|comfort\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 1 | 1 | 1 | -| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 3 | 1 | 1 | -| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 4 | 1 | 15 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | -| dhw.extra | extra | boolean | | false | DHW | 6 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 9 | 1 | 15 | -| dhw.dailyheating | daily heating | boolean | | true | DHW | 10 | 1 | 1 | -| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 11 | 1 | 15 | - -### TR120RF, CR20RF -| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | -|-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=-319<=319) | C | false | HC | 0 | 1 | 1/100 | +| hc1.currtemp | current room temperature | int16 (>=-319<=319) | C | false | HC | 1 | 1 | 1/100 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | ### UI800, BC400 + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | -| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | -| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | -| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | -| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | -| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | -| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | -| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | -| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | -| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | -| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | -| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | -| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | -| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | -| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | -| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | -| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | -| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | -| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | -| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | -| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | -| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | -| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | -| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | -| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | -| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | -| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | -| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | -| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | -| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | -| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | -| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | -| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | -| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | -| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | -| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | -| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | -| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | -| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | -| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | -| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | -| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | -| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | -| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | -| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | -| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | -| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | -| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | -| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | -| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | -| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | -| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | -| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | -| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | -| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | -| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | -| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | -| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | -| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | -| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | -| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | -| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | -| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | -| hc1.control | control device | enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single] | | true | HC | 41 | 1 | 1 | -| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | -| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | -| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | -| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | -| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | -| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | -| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | -| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | -| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | -| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | -| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | -| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | -| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | -| hc1.currsolarinfl | curent solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | -| dhw.mode | operating mode | enum [off\|eco+\|eco\|comfort\|auto] | | true | DHW | 0 | 1 | 1 | -| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 1 | 1 | 1 | -| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 3 | 1 | 1 | -| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 4 | 1 | 15 | -| dhw.charge | charge | boolean | | true | DHW | 5 | 1 | 1 | -| dhw.extra | extra | boolean | | false | DHW | 6 | 1 | 1 | -| dhw.disinfecting | disinfecting | boolean | | true | DHW | 7 | 1 | 1 | -| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 8 | 1 | 1 | -| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 9 | 1 | 15 | -| dhw.dailyheating | daily heating | boolean | | true | DHW | 10 | 1 | 1 | -| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 11 | 1 | 15 | +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | +| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | +| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | +| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | +| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | +| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | +| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | +| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | +| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | +| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | +| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | +| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | +| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | +| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | +| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | +| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | +| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | +| hc1.control | control device | enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single] | | true | HC | 41 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | +| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | +| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | +| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | +| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | +| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | +| hc1.heatingpid | heating PID | enum [fast\|medium\|slow] | | true | HC | 56 | 1 | 1 | +| hc1.pumpopt | pump optimization | boolean | | true | HC | 57 | 1 | 1 | +| hc1.inttimefloor | integral time floor | uint8 (>=160<=320) | minutes | true | HC | 58 | 1 | 10 | +| hc1.inttime | integral time | uint8 (>=3<=80) | minutes | true | HC | 59 | 1 | 1 | +| dhw.mode | operating mode | enum [off\|eco+\|eco\|comfort\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.modetype | mode type | enum [off\|eco\|comfort\|eco+] | | false | DHW | 1 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | +| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 3 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 4 | 1 | 1 | +| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 5 | 1 | 15 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | +| dhw.extra | extra | boolean | | false | DHW | 7 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 10 | 1 | 15 | +| dhw.dailyheating | daily heating | boolean | | true | DHW | 11 | 1 | 1 | +| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 12 | 1 | 15 | + +### CR11 -## Devices of type *ventilation* -### Logavent HRV176 | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| outfresh | outdoor fresh air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | -| infresh | indoor fresh air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | -| outexhaust | outdoor exhaust air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | -| inexhaust | indoor exhaust air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | -| ventinspeed | in blower speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 4 | 1 | 1 | -| ventoutspeed | out blower speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | -| ventmode | ventilation mode | enum [auto\|off\|L1\|L2\|L3\|L4\|demand\|sleep\|intense\|bypass\|party\|fireplace] | | true | DEVICE_DATA | 6 | 1 | 1 | -| airquality | air quality (voc) | uint16 (>=0<=31999) | | false | DEVICE_DATA | 7 | 1 | 1 | -| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | -| bypass | bypass | boolean | | true | DEVICE_DATA | 9 | 1 | 1 | +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual] | | true | HC | 3 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | + +### RC10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | + +### RC30 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|dutch\|french\|italian] | | false | DEVICE_DATA | 66 | 1 | 1 | +| clockoffset | clock offset | int8 (>=-126<=126) | seconds | true | DEVICE_DATA | 67 | 1 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 61 | 1 | 1/2 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | +| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 62 | 1 | 1/2 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.holidaymode | holiday mode | boolean | | false | HC | 63 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | +| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 64 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | +| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | +| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | +| hc1.holidays | holiday dates | string | | true | HC | 65 | 13 | 1 | +| hc1.vacations | vacation dates | string | | true | HC | 78 | 13 | 1 | +| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | +| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 91 | 1 | 1 | +| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 92 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | +| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 93 | 1 | 1 | +| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 94 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 95 | 8 | 1 | +| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 103 | 8 | 1 | +| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 4 | 1 | 1 | +| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | +| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 14 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 15 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 16 | 1 | 1 | +| dhw.onetimekey | one time key function | boolean | | true | DHW | 17 | 1 | 1 | +| dhw.switchtime | program switchtime | string | | true | DHW | 18 | 8 | 1 | +| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 26 | 8 | 1 | +| dhw.holidays | holiday dates | string | | true | DHW | 34 | 13 | 1 | +| dhw.vacations | vacation dates | string | | true | DHW | 47 | 13 | 1 | + +### RC20, Moduline 300 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.offtemp | temperature when mode is off | uint8 (>=0<=127) | C | true | HC | 111 | 1 | 1/2 | +| hc1.daytemp2 | day temperature T2 | uint8 (>=0<=127) | C | true | HC | 112 | 1 | 1/2 | +| hc1.daytemp3 | day temperature T3 | uint8 (>=0<=127) | C | true | HC | 113 | 1 | 1/2 | +| hc1.daytemp4 | day temperature T4 | uint8 (>=0<=127) | C | true | HC | 114 | 1 | 1/2 | +| hc1.nighttemp | night temperature T1 | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.switchtime | program switchtime | string | | true | HC | 115 | 8 | 1 | + +### Moduline 400 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| clockoffset | clock offset | int8 (>=-126<=126) | seconds | true | DEVICE_DATA | 67 | 1 | 1 | +| autodst | automatic change daylight saving time | boolean | | true | DEVICE_DATA | 70 | 1 | 1 | +| language | language | enum [german\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| backlight | key backlight | boolean | | true | DEVICE_DATA | 71 | 1 | 1 | +| brightness | screen brightness | int8 (>=-15<=15) | | true | DEVICE_DATA | 72 | 1 | 1 | +| mixingvalves | mixing valves | uint8 (>=0<=2) | | true | DEVICE_DATA | 73 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| heatingpid | heating PID | enum [fast\|medium\|slow] | | true | DEVICE_DATA | 74 | 1 | 1 | +| preheating | preheating in the clock program | boolean | | true | DEVICE_DATA | 75 | 1 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.pause | pause time | uint8 (>=0<=254) | hours | true | HC | 91 | 1 | 1 | +| hc1.party | party time | uint8 (>=0<=254) | hours | true | HC | 92 | 1 | 1 | +| hc1.vacations1 | vacation dates 1 | string | | true | HC | 123 | 11 | 1 | +| hc1.vacations2 | vacation dates 2 | string | | true | HC | 134 | 11 | 1 | +| hc1.vacations3 | vacation dates 3 | string | | true | HC | 145 | 11 | 1 | +| hc1.vacations4 | vacation dates 4 | string | | true | HC | 156 | 11 | 1 | +| hc1.vacations5 | vacation dates 5 | string | | true | HC | 167 | 11 | 1 | +| hc1.vacations6 | vacation dates 6 | string | | true | HC | 178 | 11 | 1 | +| hc1.vacations7 | vacation dates 7 | string | | true | HC | 189 | 11 | 1 | +| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | +| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 95 | 8 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | +| hc1.holidaytemp | holiday temperature | uint8 (>=0<=127) | C | true | HC | 62 | 1 | 1/2 | +| hc1.nighttemp | night temperature T1 | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.daytemp2 | day temperature T2 | uint8 (>=0<=127) | C | true | HC | 112 | 1 | 1/2 | +| hc1.daytemp3 | day temperature T3 | uint8 (>=0<=127) | C | true | HC | 113 | 1 | 1/2 | +| hc1.daytemp4 | day temperature T4 | uint8 (>=0<=127) | C | true | HC | 114 | 1 | 1/2 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.offtemp | temperature when mode is off | uint8 (>=0<=127) | C | true | HC | 111 | 1 | 1/2 | +| dhw.mode | operating mode | enum [on\|off\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.whenmodeoff | when thermostat mode off | boolean | | true | DHW | 60 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 15 | 1 | 1 | + +### RC10, Moduline 100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| heatingpid | heating PID | enum [fast\|medium\|slow] | | true | DEVICE_DATA | 74 | 1 | 1 | +| backlight | key backlight | boolean | | true | DEVICE_DATA | 71 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|night\|day] | | true | HC | 3 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.reducehours | duration for nighttemp | uint8 (>=0<=254) | hours | true | HC | 200 | 1 | 1 | +| hc1.reduceminutes | remaining time for nightmode | uint16 (>=0<=31999) | minutes | false | HC | 201 | 1 | 1 | +| dhw.mode | operating mode | enum [on\|off\|auto] | | true | DHW | 0 | 1 | 1 | +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | + +### Moduline 200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| heatingpid | heating PID | enum [fast\|medium\|slow] | | true | DEVICE_DATA | 74 | 1 | 1 | +| backlight | key backlight | boolean | | true | DEVICE_DATA | 71 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|night\|day] | | true | HC | 3 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.reducehours | duration for nighttemp | uint8 (>=0<=254) | hours | true | HC | 200 | 1 | 1 | +| hc1.reduceminutes | remaining time for nightmode | uint16 (>=0<=31999) | minutes | false | HC | 201 | 1 | 1 | +| dhw.mode | operating mode | enum [on\|off\|auto] | | true | DHW | 0 | 1 | 1 | + +### RC35 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-5<=5) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| minexttemp | minimal external temperature | int8 (>=-30<=0) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 61 | 1 | 1/2 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | +| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 62 | 1 | 1/2 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.holidaymode | holiday mode | boolean | | false | HC | 63 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | +| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 64 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | +| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | +| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | +| hc1.holidays | holiday dates | string | | true | HC | 65 | 13 | 1 | +| hc1.vacations | vacation dates | string | | true | HC | 78 | 13 | 1 | +| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | +| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 91 | 1 | 1 | +| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 92 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | +| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 93 | 1 | 1 | +| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 94 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 95 | 8 | 1 | +| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 103 | 8 | 1 | +| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 4 | 1 | 1 | +| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | +| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 14 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 15 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=60<=80) | C | true | DHW | 16 | 1 | 1 | +| dhw.onetimekey | one time key function | boolean | | true | DHW | 17 | 1 | 1 | +| dhw.switchtime | program switchtime | string | | true | DHW | 18 | 8 | 1 | +| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 26 | 8 | 1 | +| dhw.holidays | holiday dates | string | | true | DHW | 34 | 13 | 1 | +| dhw.vacations | vacation dates | string | | true | DHW | 47 | 13 | 1 | + +### RC20RF + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.offtemp | temperature when mode is off | uint8 (>=0<=127) | C | true | HC | 111 | 1 | 1/2 | +| hc1.daytemp2 | day temperature T2 | uint8 (>=0<=127) | C | true | HC | 112 | 1 | 1/2 | +| hc1.daytemp3 | day temperature T3 | uint8 (>=0<=127) | C | true | HC | 113 | 1 | 1/2 | +| hc1.daytemp4 | day temperature T4 | uint8 (>=0<=127) | C | true | HC | 114 | 1 | 1/2 | +| hc1.nighttemp | night temperature T1 | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.switchtime | program switchtime | string | | true | HC | 115 | 8 | 1 | + +### RFM20 Remote + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | + +### RC25 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | + +### RC200, CW100, CR120, CR50 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | +| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| vacations | vacation dates | string | | true | DEVICE_DATA | 76 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | +| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | +| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | +| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | +| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | +| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | +| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | +| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | +| hc1.controlmode | control mode | enum [optimized\|simple\|n/a\|room\|power] | | true | HC | 25 | 1 | 1 | +| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | +| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | +| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | +| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | +| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | +| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | +| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | +| hc1.control | control device | enum [RC310\|RC200\|RC100\|RC100H\|TC100] | | true | HC | 41 | 1 | 1 | +| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | +| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | +| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | +| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | +| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | +| hc1.heatingpid | heating PID | enum [fast\|medium\|slow] | | true | HC | 56 | 1 | 1 | +| hc1.pumpopt | pump optimization | boolean | | true | HC | 57 | 1 | 1 | +| hc1.inttimefloor | integral time floor | uint8 (>=160<=320) | minutes | true | HC | 58 | 1 | 10 | +| hc1.inttime | integral time | uint8 (>=3<=80) | minutes | true | HC | 59 | 1 | 1 | +| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.modetype | mode type | enum [off\|eco\|comfort\|eco+] | | false | DHW | 1 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | +| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 3 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 4 | 1 | 1 | +| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 5 | 1 | 15 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | +| dhw.extra | extra | boolean | | false | DHW | 7 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 10 | 1 | 15 | +| dhw.dailyheating | daily heating | boolean | | true | DHW | 11 | 1 | 1 | +| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 12 | 1 | 15 | + +### RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | +| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | +| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | +| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | +| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | +| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | +| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | +| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | +| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | +| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | +| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | +| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | +| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | +| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | +| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | +| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | +| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | +| hc1.control | control device | enum [RC310\|RC200\|RC100\|RC100H\|TC100] | | true | HC | 41 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | +| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | +| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | +| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | +| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | +| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | +| hc1.heatingpid | heating PID | enum [fast\|medium\|slow] | | true | HC | 56 | 1 | 1 | +| hc1.pumpopt | pump optimization | boolean | | true | HC | 57 | 1 | 1 | +| hc1.inttimefloor | integral time floor | uint8 (>=160<=320) | minutes | true | HC | 58 | 1 | 10 | +| hc1.inttime | integral time | uint8 (>=3<=80) | minutes | true | HC | 59 | 1 | 1 | +| dhw.mode | operating mode | enum [off\|normal\|comfort\|auto\|own prog] | | true | DHW | 0 | 1 | 1 | +| dhw.modetype | mode type | enum [off\|eco\|comfort\|eco+] | | false | DHW | 1 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | +| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 3 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 4 | 1 | 1 | +| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 5 | 1 | 15 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | +| dhw.extra | extra | boolean | | false | DHW | 7 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 10 | 1 | 15 | +| dhw.dailyheating | daily heating | boolean | | true | DHW | 11 | 1 | 1 | +| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 12 | 1 | 15 | + +### RC100, CR10, Moduline 1000/1010 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual] | | true | HC | 3 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | + +### Rego 2000/3000 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | +| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| vacations | vacation dates | string | | true | DEVICE_DATA | 76 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | +| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | +| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | +| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | +| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | +| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | +| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | +| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | +| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | +| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | +| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | +| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | +| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | +| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | +| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | +| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | +| hc1.control | control device | enum [RC310\|RC200\|RC100\|RC100H\|TC100] | | true | HC | 41 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | +| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | +| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | +| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | +| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | +| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | +| hc1.heatingpid | heating PID | enum [fast\|medium\|slow] | | true | HC | 56 | 1 | 1 | +| hc1.pumpopt | pump optimization | boolean | | true | HC | 57 | 1 | 1 | +| hc1.inttimefloor | integral time floor | uint8 (>=160<=320) | minutes | true | HC | 58 | 1 | 10 | +| hc1.inttime | integral time | uint8 (>=3<=80) | minutes | true | HC | 59 | 1 | 1 | +| dhw.mode | operating mode | enum [normal\|comfort\|eco+] | | true | DHW | 0 | 1 | 1 | +| dhw.modetype | mode type | enum [off\|eco\|comfort\|eco+] | | false | DHW | 1 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | +| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 3 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 4 | 1 | 1 | +| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 5 | 1 | 15 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | +| dhw.extra | extra | boolean | | false | DHW | 7 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 10 | 1 | 15 | +| dhw.dailyheating | daily heating | boolean | | true | DHW | 11 | 1 | 1 | +| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 12 | 1 | 15 | + +### Comfort RF + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=-15999<=15999) | C | false | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [auto\|off] | | false | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [off\|on] | | false | HC | 4 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | + +### CRF200S + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=-15999<=15999) | C | false | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [auto\|off] | | false | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [off\|on] | | false | HC | 4 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | + +### Comfort+2RF + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=-15999<=15999) | C | false | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [auto\|off] | | false | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [off\|on] | | false | HC | 4 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | + +### Rego 3000, UI800, Logamatic BC400 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| floordry | floor drying | enum [off\|start\|heat\|hold\|cool\|end] | | false | DEVICE_DATA | 47 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 48 | 1 | 1/10 | +| floordrytemp | floor drying temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 49 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| solar | solar | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| pvenabledhw | enable raise dhw | boolean | | true | DEVICE_DATA | 61 | 1 | 1 | +| pvraiseheat | raise heating with PV | int8 (>=0<=5) | K | true | DEVICE_DATA | 62 | 1 | 1 | +| pvlowercool | lower cooling with PV | int8 (>=-5<=0) | K | true | DEVICE_DATA | 63 | 1 | 1 | +| absent | absent | boolean | | true | DEVICE_DATA | 64 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [off\|manual\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [eco\|comfort] | | false | HC | 4 | 1 | 1 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.manualtemp | manual temperature | uint8 (>=0<=127) | C | true | HC | 6 | 1 | 1/2 | +| hc1.comforttemp | comfort temperature | uint8 (>=0<=127) | C | true | HC | 7 | 1 | 1/2 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=0<=254) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-126<=126) | C | true | HC | 10 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=254) | C | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=25) | | true | HC | 14 | 1 | 1/10 | +| hc1.curroominfl | current room influence | int16 (>=-3199<=3199) | C | false | HC | 15 | 1 | 1/10 | +| hc1.nofrostmode | nofrost mode | enum [room\|outdoor\|room outdoor] | | true | HC | 16 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-126<=126) | C | true | HC | 17 | 1 | 1 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summersetmode | set summer mode | enum [summer\|auto\|winter] | | true | HC | 20 | 1 | 1 | +| hc1.hpoperatingmode | heatpump operating mode | enum [off\|auto\|heating\|cooling] | | true | HC | 21 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.hpoperatingstate | heatpump operating state | enum [heating\|off\|cooling] | | false | HC | 23 | 1 | 1 | +| hc1.vacationmode | vacation mode | boolean | | false | HC | 24 | 1 | 1 | +| hc1.controlmode | control mode | enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant] | | true | HC | 25 | 1 | 1 | +| hc1.program | program | enum [prog 1\|prog 2] | | true | HC | 26 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | int8 (>=-1<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.cooltemp | cooling temperature | int8 (>=-1<=30) | C | true | HC | 28 | 1 | 1/2 | +| hc1.fastheatup | fast heatup | uint8 (>=0<=100) | % | true | HC | 29 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [outdoor\|room\|reduce] | | true | HC | 31 | 1 | 1 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-126<=126) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-126<=126) | C | true | HC | 33 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.hpcooling | hp cooling | boolean | | true | HC | 35 | 1 | 1 | +| hc1.coolingon | cooling on | boolean | | false | HC | 36 | 1 | 1 | +| hc1.hpmode | HP Mode | enum [heating\|cooling\|heating & cooling] | | true | HC | 37 | 1 | 1 | +| hc1.dewoffset | dew point offset | uint8 (>=2<=10) | K | true | HC | 38 | 1 | 1 | +| hc1.roomtempdiff | room temp difference | uint8 (>=0<=254) | K | true | HC | 39 | 1 | 1 | +| hc1.hpminflowtemp | HP min. flow temp. | uint8 (>=0<=254) | C | true | HC | 40 | 1 | 1 | +| hc1.control | control device | enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single] | | true | HC | 41 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.remotehum | room humidity from remote | cmd [] (>=-1<=101) | % | true | HC | 43 | 1 | 1 | +| hc1.heatondelay | heat-on delay | uint8 (>=1<=48) | hours | true | HC | 44 | 1 | 1 | +| hc1.heatoffdelay | heat-off delay | uint8 (>=1<=48) | hours | true | HC | 45 | 1 | 1 | +| hc1.instantstart | instant start | uint8 (>=1<=10) | K | true | HC | 46 | 1 | 1 | +| hc1.boost | boost mode | boolean | | true | HC | 47 | 1 | 1 | +| hc1.boosttime | boost time | uint8 (>=0<=254) | hours | true | HC | 48 | 1 | 1 | +| hc1.coolstart | cooling starttemp | uint8 (>=20<=35) | C | true | HC | 49 | 1 | 1 | +| hc1.coolondelay | cooling on delay | uint8 (>=1<=48) | hours | true | HC | 50 | 1 | 1 | +| hc1.cooloffdelay | cooling off delay | uint8 (>=1<=48) | hours | true | HC | 51 | 1 | 1 | +| hc1.switchprogmode | switch program mode | enum [level\|absolute] | | true | HC | 52 | 1 | 1 | +| hc1.redthreshold | reduction threshold | int8 (>=12<=22) | C | true | HC | 53 | 1 | 1/2 | +| hc1.solarinfl | solar influence | uint8 (>=-5<=4294967295) | C | true | HC | 54 | 1 | 1 | +| hc1.currsolarinfl | current solar influence | uint8 (>=0<=25) | C | false | HC | 55 | 1 | 1/10 | +| hc1.heatingpid | heating PID | enum [fast\|medium\|slow] | | true | HC | 56 | 1 | 1 | +| hc1.pumpopt | pump optimization | boolean | | true | HC | 57 | 1 | 1 | +| hc1.inttimefloor | integral time floor | uint8 (>=160<=320) | minutes | true | HC | 58 | 1 | 10 | +| hc1.inttime | integral time | uint8 (>=3<=80) | minutes | true | HC | 59 | 1 | 1 | +| dhw.mode | operating mode | enum [off\|eco+\|eco\|comfort\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.modetype | mode type | enum [off\|eco\|comfort\|eco+] | | false | DHW | 1 | 1 | 1 | +| dhw.settemp | set temperature | uint8 (>=0<=254) | C | true | DHW | 2 | 1 | 1 | +| dhw.settemplow | set low temperature | uint8 (>=0<=254) | C | true | DHW | 3 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 4 | 1 | 1 | +| dhw.chargeduration | charge duration | uint8 (>=0<=3810) | minutes | true | DHW | 5 | 1 | 15 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | +| dhw.extra | extra | boolean | | false | DHW | 7 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecttime | disinfection time | uint8 (>=0<=1431) | minutes | true | DHW | 10 | 1 | 15 | +| dhw.dailyheating | daily heating | boolean | | true | DHW | 11 | 1 | 1 | +| dhw.dailyheattime | daily heating time | uint8 (>=0<=1431) | minutes | true | DHW | 12 | 1 | 15 | + +### ES72, RC20 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=0<=127) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=0<=127) | C | true | HC | 61 | 1 | 1/2 | +| hc1.program | program | enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors] | | true | HC | 26 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=0<=254) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=0<=254) | C | true | HC | 12 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=127) | C | true | HC | 27 | 1 | 1/2 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=10<=30) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | + +### ES73 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|dutch\|french\|italian] | | false | DEVICE_DATA | 66 | 1 | 1 | +| clockoffset | clock offset | int8 (>=-126<=126) | seconds | true | DEVICE_DATA | 67 | 1 | 1 | +| intoffset | internal temperature offset | int8 (>=-12<=12) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| minexttemp | minimal external temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 61 | 1 | 1/2 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | +| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 62 | 1 | 1/2 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.holidaymode | holiday mode | boolean | | false | HC | 63 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | +| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 64 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | +| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | +| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | +| hc1.holidays | holiday dates | string | | true | HC | 65 | 13 | 1 | +| hc1.vacations | vacation dates | string | | true | HC | 78 | 13 | 1 | +| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | +| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 91 | 1 | 1 | +| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 92 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | +| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 93 | 1 | 1 | +| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 94 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 95 | 8 | 1 | +| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 103 | 8 | 1 | +| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 4 | 1 | 1 | +| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | +| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 14 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 15 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 16 | 1 | 1 | +| dhw.onetimekey | one time key function | boolean | | true | DHW | 17 | 1 | 1 | +| dhw.switchtime | program switchtime | string | | true | DHW | 18 | 8 | 1 | +| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 26 | 8 | 1 | +| dhw.holidays | holiday dates | string | | true | DHW | 34 | 13 | 1 | +| dhw.vacations | vacation dates | string | | true | DHW | 47 | 13 | 1 | + +### ES79 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| intoffset | internal temperature offset | int8 (>=-5<=5) | C | true | DEVICE_DATA | 46 | 1 | 1/10 | +| minexttemp | minimal external temperature | int8 (>=-30<=0) | C | true | DEVICE_DATA | 51 | 1 | 1 | +| inttemp1 | temperature sensor 1 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| inttemp2 | temperature sensor 2 | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| damping | damping outdoor temperature | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| dampedoutdoortemp | damped outdoor temperature | int8 (>=-126<=126) | C | false | DEVICE_DATA | 48 | 1 | 1 | +| building | building type | enum [light\|medium\|heavy] | | true | DEVICE_DATA | 50 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [night\|day\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [night\|day] | | false | HC | 4 | 1 | 1 | +| hc1.daytemp | day temperature | uint8 (>=10<=30) | C | true | HC | 60 | 1 | 1/2 | +| hc1.nighttemp | night temperature | uint8 (>=10<=30) | C | true | HC | 61 | 1 | 1/2 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.offsettemp | offset temperature | int8 (>=-5<=5) | C | true | HC | 10 | 1 | 1/2 | +| hc1.holidaytemp | holiday temperature | uint8 (>=5<=30) | C | true | HC | 62 | 1 | 1/2 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1 | +| hc1.summermode | summer mode | enum [winter\|summer] | | false | HC | 22 | 1 | 1 | +| hc1.holidaymode | holiday mode | boolean | | false | HC | 63 | 1 | 1 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-20<=10) | C | true | HC | 17 | 1 | 1 | +| hc1.nofrostmode | nofrost mode | enum [off\|outdoor\|room] | | true | HC | 16 | 1 | 1 | +| hc1.roominfluence | room influence | uint8 (>=0<=10) | C | true | HC | 13 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | C | true | HC | 64 | 1 | 1 | +| hc1.heatingtype | heating type | enum [off\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.reducemode | reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 31 | 1 | 1 | +| hc1.controlmode | control mode | enum [outdoor\|room] | | true | HC | 25 | 1 | 1 | +| hc1.control | control device | enum [off\|RC20\|RC3x] | | true | HC | 41 | 1 | 1 | +| hc1.holidays | holiday dates | string | | true | HC | 65 | 13 | 1 | +| hc1.vacations | vacation dates | string | | true | HC | 78 | 13 | 1 | +| hc1.program | program | enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2] | | true | HC | 26 | 1 | 1 | +| hc1.pause | pause time | uint8 (>=0<=99) | hours | true | HC | 91 | 1 | 1 | +| hc1.party | party time | uint8 (>=0<=99) | hours | true | HC | 92 | 1 | 1 | +| hc1.tempautotemp | temporary set temperature automode | uint8 (>=0<=30) | C | true | HC | 27 | 1 | 1/2 | +| hc1.noreducetemp | no reduce below temperature | int8 (>=-31<=10) | C | true | HC | 32 | 1 | 1 | +| hc1.reducetemp | off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 33 | 1 | 1 | +| hc1.vacreducetemp | vacations off/reduce switch temperature | int8 (>=-20<=10) | C | true | HC | 93 | 1 | 1 | +| hc1.vacreducemode | vacations reduce mode | enum [nofrost\|reduce\|room\|outdoor] | | true | HC | 94 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 34 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.switchtime1 | own1 program switchtime | string | | true | HC | 95 | 8 | 1 | +| hc1.switchtime2 | own2 program switchtime | string | | true | HC | 103 | 8 | 1 | +| dhw.mode | operating mode | enum [off\|on\|auto] | | true | DHW | 0 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto] | | true | DHW | 4 | 1 | 1 | +| dhw.progmode | program | enum [std prog\|own prog] | | true | DHW | 13 | 1 | 1 | +| dhw.circprog | circulation program | enum [std prog\|own prog] | | true | DHW | 14 | 1 | 1 | +| dhw.disinfecting | disinfecting | boolean | | true | DHW | 8 | 1 | 1 | +| dhw.disinfectday | disinfection day | enum [mo\|tu\|we\|th\|fr\|sa\|su\|all] | | true | DHW | 9 | 1 | 1 | +| dhw.disinfecthour | disinfection hour | uint8 (>=0<=23) | | true | DHW | 15 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=60<=80) | C | true | DHW | 16 | 1 | 1 | +| dhw.onetimekey | one time key function | boolean | | true | DHW | 17 | 1 | 1 | +| dhw.switchtime | program switchtime | string | | true | DHW | 18 | 8 | 1 | +| dhw.circswitchtime | circulation program switchtime | string | | true | DHW | 26 | 8 | 1 | +| dhw.holidays | holiday dates | string | | true | DHW | 34 | 13 | 1 | +| dhw.vacations | vacation dates | string | | true | DHW | 47 | 13 | 1 | + +### FW100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [dhw temperature\|date\|external temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|italian\|french\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FW200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [dhw temperature\|date\|external temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|italian\|french\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FR100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FR110 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FB10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [dhw temperature\|date\|external temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|italian\|french\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FB100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [dhw temperature\|date\|external temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|italian\|french\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FR10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FW500 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [dhw temperature\|date\|external temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|italian\|french\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FR50 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FR120 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### FW120 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | true | DEVICE_DATA | 33 | 13 | 1 | +| display | display | enum [dhw temperature\|date\|external temperature] | | true | DEVICE_DATA | 65 | 1 | 1 | +| language | language | enum [german\|italian\|french\|dutch] | | true | DEVICE_DATA | 66 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix] | | true | DEVICE_DATA | 54 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-20<=20) | C | true | DEVICE_DATA | 55 | 1 | 1 | +| energycostratio | energy cost ratio | uint8 (>=0<=20) | | true | DEVICE_DATA | 56 | 1 | 1/10 | +| fossilefactor | fossile energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 57 | 1 | 1/10 | +| electricfactor | electric energy factor | uint8 (>=0<=5) | | true | DEVICE_DATA | 58 | 1 | 1/10 | +| delayboiler | delay boiler support | uint8 (>=5<=120) | minutes | true | DEVICE_DATA | 59 | 1 | 1 | +| tempdiffboiler | temp diff boiler support | uint8 (>=1<=99) | C | true | DEVICE_DATA | 60 | 1 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/10 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | +| hc1.mode | operating mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 3 | 1 | 1 | +| hc1.modetype | mode type | enum [nofrost\|eco\|heat] | | false | HC | 4 | 1 | 1 | +| hc1.heattemp | heat temperature | uint8 (>=0<=127) | C | true | HC | 202 | 1 | 1/2 | +| hc1.ecotemp | eco temperature | uint8 (>=0<=127) | C | true | HC | 5 | 1 | 1/2 | +| hc1.nofrosttemp | nofrost temperature | int8 (>=-63<=63) | C | true | HC | 17 | 1 | 1/2 | +| hc1.control | control device | enum [off\|FB10\|FB100] | | true | HC | 41 | 1 | 1 | +| hc1.program | program | enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f] | | true | HC | 26 | 1 | 1 | +| hc1.remotetemp | room temperature from remote | cmd [] (>=-1<=101) | C | true | HC | 42 | 1 | 1/10 | +| hc1.targetflowtemp | target flow temperature | uint8 (>=0<=254) | C | false | HC | 18 | 1 | 1 | +| hc1.summertemp | summer temperature | uint8 (>=9<=25) | C | true | HC | 8 | 1 | 1/2 | +| hc1.roomsensor | room sensor | enum [extern\|intern\|auto] | | true | HC | 203 | 1 | 1 | +| hc1.holidaymode | holiday mode | enum [nofrost\|eco\|heat\|auto] | | true | HC | 63 | 1 | 1 | +| hc1.switchonoptimization | switch-on optimization | boolean | | true | HC | 30 | 1 | 1 | +| hc1.heatup | heatup | enum [slow\|medium\|fast] | | true | HC | 204 | 1 | 1 | +| hc1.minflowtemp | min flow temperature | uint8 (>=5<=70) | C | true | HC | 11 | 1 | 1 | +| hc1.maxflowtemp | max flow temperature | uint8 (>=30<=90) | C | true | HC | 12 | 1 | 1 | +| hc1.designtemp | design temperature | uint8 (>=30<=90) | C | true | HC | 9 | 1 | 1 | +| hc1.roominfluence | room influence | enum [off\|intern\|extern\|auto] | | true | HC | 13 | 1 | 1 | +| hc1.roominflfactor | room influence factor | uint8 (>=0<=100) | % | true | HC | 14 | 1 | 10 | +| hc1.heatingtype | heating type | enum [off\|heatingcurve\|radiator\|convector\|floor] | | true | HC | 19 | 1 | 1 | +| hc1.controlmode | control mode | enum [off\|unmixed\|unmixed IPM\|mixed IPM] | | true | HC | 25 | 1 | 1 | +| dhw.charge | charge | boolean | | true | DHW | 6 | 1 | 1 | + +### RT800, RC220 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | + +### RC100H, CR10H + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | + +### RC120RF, TR120RF, CR20RF + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| errorcode | error code | string | | false | DEVICE_DATA | 0 | 8 | 1 | +| lastcode | last error code | string | | false | DEVICE_DATA | 8 | 25 | 1 | +| datetime | date/time | string | | false | DEVICE_DATA | 33 | 13 | 1 | +| hc1.seltemp | selected room temperature | int16 (>=0<=30) | C | true | HC | 0 | 1 | 1/2 | +| hc1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | HC | 1 | 1 | 1/10 | +| hc1.haclimate | mqtt discovery current room temperature | enum [selTemp\|roomTemp] (>=5<=30) | | false | HC | 2 | 1 | 1 | + +## Devices of type \_mixer + +### XCUMixer + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.flow | Durchfluss | uint16 (>=0<=31999) | l/h | false | HC | 5 | 1 | 1 | +| hc1.setdiffpress | set differential pressure | uint8 (>=0<=12700) | mbar | true | HC | 6 | 1 | 50 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 8 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 9 | 1 | 1 | + +### MM10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | int8 (>=-100<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | -## Devices of type *water* ### IPM + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | -| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 2 | 1 | 1/10 | -| dhw.hydrTemp | hydraulic header temperature | uint16 (>=0<=3199) | C | false | DHW | 3 | 1 | 1/10 | -| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=254) | C | true | DHW | 5 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 6 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 7 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.flowtempvf | flow temperature in header (T0/Vf) | uint16 (>=0<=3199) | C | false | HC | 10 | 1 | 1/10 | ### IPM2 + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | -| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | -| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 2 | 1 | 1/10 | -| dhw.hydrTemp | hydraulic header temperature | uint16 (>=0<=3199) | C | false | DHW | 3 | 1 | 1/10 | -| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | -| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=254) | C | true | DHW | 5 | 1 | 1 | -| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 6 | 1 | 1 | -| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 7 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.flowtempvf | flow temperature in header (T0/Vf) | uint16 (>=0<=3199) | C | false | HC | 10 | 1 | 1/10 | + +### MM50 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.flow | Durchfluss | uint16 (>=0<=31999) | l/h | false | HC | 5 | 1 | 1 | +| hc1.setdiffpress | set differential pressure | uint8 (>=0<=12700) | mbar | true | HC | 6 | 1 | 50 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 8 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 9 | 1 | 1 | ### MM100 + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | -| dhw.tempstatus | temperature switch in assigned dhw (MC1) | int8 (>=-126<=126) | | false | DHW | 11 | 1 | 1 | -| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | -| dhw.difftemp | start differential temperature | int8 (>=-126<=126) | C | true | DHW | 13 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | -| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | -| dhw.requiredtemp | required temperature | uint8 (>=0<=254) | C | true | DHW | 15 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.flow | Durchfluss | uint16 (>=0<=31999) | l/h | false | HC | 5 | 1 | 1 | +| hc1.setdiffpress | set differential pressure | uint8 (>=0<=12700) | mbar | true | HC | 6 | 1 | 50 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 8 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 9 | 1 | 1 | ### MM200 + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | -| dhw.tempstatus | temperature switch in assigned dhw (MC1) | int8 (>=-126<=126) | | false | DHW | 11 | 1 | 1 | -| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | -| dhw.difftemp | start differential temperature | int8 (>=-126<=126) | C | true | DHW | 13 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | -| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | -| dhw.requiredtemp | required temperature | uint8 (>=0<=254) | C | true | DHW | 15 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.flow | Durchfluss | uint16 (>=0<=31999) | l/h | false | HC | 5 | 1 | 1 | +| hc1.setdiffpress | set differential pressure | uint8 (>=0<=12700) | mbar | true | HC | 6 | 1 | 50 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 8 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 9 | 1 | 1 | + +### MZ100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.flow | Durchfluss | uint16 (>=0<=31999) | l/h | false | HC | 5 | 1 | 1 | +| hc1.setdiffpress | set differential pressure | uint8 (>=0<=12700) | mbar | true | HC | 6 | 1 | 50 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 8 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 9 | 1 | 1 | + +### HM210 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| hc1.flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | HC | 0 | 1 | 1/10 | +| hc1.valvestatus | mixing valve actuator (VC1) | uint8 (>=0<=100) | % | false | HC | 1 | 1 | 1 | +| hc1.flowsettemp | setpoint flow temperature | uint8 (>=0<=254) | C | true | HC | 2 | 1 | 1 | +| hc1.pumpstatus | pump status (PC1) | boolean | | true | HC | 3 | 1 | 1 | +| hc1.activated | activated | boolean | | true | HC | 4 | 1 | 1 | +| hc1.flow | Durchfluss | uint16 (>=0<=31999) | l/h | false | HC | 5 | 1 | 1 | +| hc1.setdiffpress | set differential pressure | uint8 (>=0<=12700) | mbar | true | HC | 6 | 1 | 50 | +| hc1.valvesettime | time to set valve | uint8 (>=10<=600) | seconds | true | HC | 7 | 1 | 10 | +| hc1.flowtempoffset | flow temperature offset for mixer | uint8 (>=0<=20) | K | true | HC | 8 | 1 | 1 | +| hc1.dhwprio | dhw priority | boolean | | true | HC | 9 | 1 | 1 | + +## Devices of type \_solar + +### SM10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | +| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | +| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | +| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | +| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | +| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 1 | +| turnondiff | pump turn on difference | uint8 (>=0<=254) | C | true | DEVICE_DATA | 10 | 1 | 1 | +| turnoffdiff | pump turn off difference | uint8 (>=0<=254) | C | true | DEVICE_DATA | 11 | 1 | 1 | +| solarpower | actual solar power | int16 (>=-31999<=31999) | W | false | DEVICE_DATA | 12 | 1 | 1 | +| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | +| maxflow | maximum solar flow | uint8 (>=0<=25) | l/min | true | DEVICE_DATA | 15 | 1 | 1/10 | +| dhw.mintemp | minimum temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | +| solarenabled | solarmodule enabled | boolean | | true | DEVICE_DATA | 16 | 1 | 1 | + +### ISM1 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | +| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | +| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | +| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | +| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | +| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | +| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | +| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | + +### ISM2 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | +| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | +| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | +| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | +| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | +| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | +| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | +| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | + +### SM50 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | +| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | +| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | +| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | +| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | +| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 5 | +| turnondiff | pump turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 10 | 1 | 1/10 | +| turnoffdiff | pump turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 11 | 1 | 1/10 | +| collector2temp | collector 2 temperature (TS7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 20 | 1 | 1/10 | +| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | +| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | +| ts8 | (TS8) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 21 | 1 | 1/10 | +| ts16 | (TS16) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 22 | 1 | 1/10 | +| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | +| heatassistpower | heat assistance valve power (M1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | +| solarpump2 | pump 2 (PS4) | boolean | | false | DEVICE_DATA | 24 | 1 | 1 | +| solarpump2mod | pump 2 modulation (PS4) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 25 | 1 | 1 | +| cyl2bottomtemp | second cylinder bottom temperature (TS5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 26 | 1 | 1/10 | +| cyl3bottomtemp | third cylinder bottom temperature (TS11) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 27 | 1 | 1/10 | +| cyltoptemp | cylinder top temperature (TS10) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 28 | 1 | 1/10 | +| heatexchangertemp | heat exchanger temperature (TS6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 29 | 1 | 1/10 | +| cylpumpmod | cylinder pump modulation (PS5) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 30 | 1 | 1 | +| valvestatus | valve status | boolean | | false | DEVICE_DATA | 31 | 1 | 1 | +| vs1status | valve status VS1 | boolean | | false | DEVICE_DATA | 32 | 1 | 1 | +| vs3status | valve status VS3 | boolean | | false | DEVICE_DATA | 33 | 1 | 1 | +| transferpump | transfer pump | boolean | | false | DEVICE_DATA | 34 | 1 | 1 | +| transferpumpmod | transfer pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 35 | 1 | 1 | +| collectormaxtemp | maximum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 36 | 1 | 1 | +| collectormintemp | minimum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 37 | 1 | 1 | +| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | +| energytoday | total energy today | uint24 (>=0<=16777214) | Wh | false | DEVICE_DATA | 38 | 2 | 1 | +| energytotal | total energy | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 40 | 2 | 1/10 | +| pump2worktime | pump 2 working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 42 | 2 | 1 | +| m1worktime | differential control working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 44 | 2 | 1 | +| heattransfersystem | heattransfer system | boolean | | true | DEVICE_DATA | 46 | 1 | 1 | +| externalcyl | external cylinder | boolean | | true | DEVICE_DATA | 47 | 1 | 1 | +| thermaldisinfect | thermal disinfection | boolean | | true | DEVICE_DATA | 48 | 1 | 1 | +| heatmetering | heatmetering | boolean | | true | DEVICE_DATA | 49 | 1 | 1 | +| activated | activated | boolean | | true | DEVICE_DATA | 50 | 1 | 1 | +| solarpumpmode | solar pump mode | enum [constant\|pwm\|analog] | | true | DEVICE_DATA | 51 | 1 | 1 | +| solarpumpkick | solar pump kick | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| plainwatermode | plain water mode | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| doublematchflow | doublematchflow | boolean | | true | DEVICE_DATA | 54 | 1 | 1 | +| pump2minmod | minimum pump 2 modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 55 | 1 | 1 | +| turnondiff2 | pump 2 turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 56 | 1 | 1/10 | +| turnoffdiff2 | pump 2 turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 57 | 1 | 1/10 | +| pump2kick | pump kick 2 | boolean | | true | DEVICE_DATA | 58 | 1 | 1 | +| climatezone | climate zone | uint8 (>=0<=254) | | true | DEVICE_DATA | 59 | 1 | 1 | +| collector1area | collector 1 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 60 | 1 | 1/10 | +| collector1type | collector 1 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 61 | 1 | 1 | +| collector2area | collector 2 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 62 | 1 | 1/10 | +| collector2type | collector 2 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 63 | 1 | 1 | +| cylpriority | cylinder priority | enum [cyl 1\|cyl 2] | | true | DEVICE_DATA | 64 | 1 | 1 | +| heatcntflowtemp | heat counter flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 65 | 1 | 1/10 | +| heatcntrettemp | heat counter return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 66 | 1 | 1/10 | +| heatcnt | heat counter impulses | uint8 (>=0<=254) | | false | DEVICE_DATA | 67 | 1 | 1 | +| swapflowtemp | swap flow temperature (TS14) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| swaprettemp | swap return temperature (TS15) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| heatassiston | heat assistance on | int8 (>=-12<=12) | K | true | DEVICE_DATA | 70 | 1 | 1/10 | +| heatassistoff | heat assistance off | int8 (>=-12<=12) | K | true | DEVICE_DATA | 71 | 1 | 1/10 | ### SM100, MS100 + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 16 | 1 | 1/10 | -| dhw.coldtemp | cold water | uint16 (>=0<=3199) | C | false | DHW | 17 | 1 | 1/10 | -| dhw.temp5 | temperature 5 | uint16 (>=0<=3199) | C | false | DHW | 18 | 1 | 1/10 | -| dhw.rettemp | return temperature | uint16 (>=0<=3199) | C | false | DHW | 19 | 1 | 1/10 | -| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | -| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | -| dhw.hottemp | extra hot temperature | uint8 (>=0<=254) | C | true | DHW | 20 | 1 | 1 | -| dhw.dailytemp | daily temperature | uint8 (>=0<=254) | C | true | DHW | 21 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 10 | 1 | 1 | -| dhw.circtc | circulation time controled | boolean | | true | DHW | 22 | 1 | 1 | -| dhw.keepwarm | keep warm | boolean | | true | DHW | 23 | 1 | 1 | -| dhw.status2 | status 2 | enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold] | | false | DHW | 24 | 1 | 1 | -| dhw.pumpmod | pump modulation | uint8 (>=0<=100) | % | false | DHW | 25 | 1 | 1 | -| dhw.flow | flow rate | uint16 (>=0<=3199) | l/min | false | DHW | 26 | 1 | 1/10 | -| dhw.valvereturn | return valve | uint8 (>=0<=100) | % | true | DHW | 27 | 1 | 1 | -| dhw.deltatret | temp. diff. return valve | uint8 (>=0<=254) | K | true | DHW | 28 | 1 | 1 | -| dhw.errordisp | error display | enum [off\|normal\|inverted] | | true | DHW | 29 | 1 | 1 | +| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | +| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | +| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | +| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | +| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | +| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 5 | +| turnondiff | pump turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 10 | 1 | 1/10 | +| turnoffdiff | pump turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 11 | 1 | 1/10 | +| collector2temp | collector 2 temperature (TS7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 20 | 1 | 1/10 | +| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | +| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | +| ts8 | (TS8) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 21 | 1 | 1/10 | +| ts16 | (TS16) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 22 | 1 | 1/10 | +| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | +| heatassistpower | heat assistance valve power (M1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | +| solarpump2 | pump 2 (PS4) | boolean | | false | DEVICE_DATA | 24 | 1 | 1 | +| solarpump2mod | pump 2 modulation (PS4) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 25 | 1 | 1 | +| cyl2bottomtemp | second cylinder bottom temperature (TS5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 26 | 1 | 1/10 | +| cyl3bottomtemp | third cylinder bottom temperature (TS11) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 27 | 1 | 1/10 | +| cyltoptemp | cylinder top temperature (TS10) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 28 | 1 | 1/10 | +| heatexchangertemp | heat exchanger temperature (TS6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 29 | 1 | 1/10 | +| cylpumpmod | cylinder pump modulation (PS5) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 30 | 1 | 1 | +| valvestatus | valve status | boolean | | false | DEVICE_DATA | 31 | 1 | 1 | +| vs1status | valve status VS1 | boolean | | false | DEVICE_DATA | 32 | 1 | 1 | +| vs3status | valve status VS3 | boolean | | false | DEVICE_DATA | 33 | 1 | 1 | +| transferpump | transfer pump | boolean | | false | DEVICE_DATA | 34 | 1 | 1 | +| transferpumpmod | transfer pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 35 | 1 | 1 | +| collectormaxtemp | maximum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 36 | 1 | 1 | +| collectormintemp | minimum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 37 | 1 | 1 | +| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | +| energytoday | total energy today | uint24 (>=0<=16777214) | Wh | false | DEVICE_DATA | 38 | 2 | 1 | +| energytotal | total energy | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 40 | 2 | 1/10 | +| pump2worktime | pump 2 working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 42 | 2 | 1 | +| m1worktime | differential control working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 44 | 2 | 1 | +| heattransfersystem | heattransfer system | boolean | | true | DEVICE_DATA | 46 | 1 | 1 | +| externalcyl | external cylinder | boolean | | true | DEVICE_DATA | 47 | 1 | 1 | +| thermaldisinfect | thermal disinfection | boolean | | true | DEVICE_DATA | 48 | 1 | 1 | +| heatmetering | heatmetering | boolean | | true | DEVICE_DATA | 49 | 1 | 1 | +| activated | activated | boolean | | true | DEVICE_DATA | 50 | 1 | 1 | +| solarpumpmode | solar pump mode | enum [constant\|pwm\|analog] | | true | DEVICE_DATA | 51 | 1 | 1 | +| solarpumpkick | solar pump kick | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| plainwatermode | plain water mode | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| doublematchflow | doublematchflow | boolean | | true | DEVICE_DATA | 54 | 1 | 1 | +| pump2minmod | minimum pump 2 modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 55 | 1 | 1 | +| turnondiff2 | pump 2 turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 56 | 1 | 1/10 | +| turnoffdiff2 | pump 2 turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 57 | 1 | 1/10 | +| pump2kick | pump kick 2 | boolean | | true | DEVICE_DATA | 58 | 1 | 1 | +| climatezone | climate zone | uint8 (>=0<=254) | | true | DEVICE_DATA | 59 | 1 | 1 | +| collector1area | collector 1 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 60 | 1 | 1/10 | +| collector1type | collector 1 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 61 | 1 | 1 | +| collector2area | collector 2 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 62 | 1 | 1/10 | +| collector2type | collector 2 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 63 | 1 | 1 | +| cylpriority | cylinder priority | enum [cyl 1\|cyl 2] | | true | DEVICE_DATA | 64 | 1 | 1 | +| heatcntflowtemp | heat counter flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 65 | 1 | 1/10 | +| heatcntrettemp | heat counter return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 66 | 1 | 1/10 | +| heatcnt | heat counter impulses | uint8 (>=0<=254) | | false | DEVICE_DATA | 67 | 1 | 1 | +| swapflowtemp | swap flow temperature (TS14) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| swaprettemp | swap return temperature (TS15) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| heatassiston | heat assistance on | int8 (>=-12<=12) | K | true | DEVICE_DATA | 70 | 1 | 1/10 | +| heatassistoff | heat assistance off | int8 (>=-12<=12) | K | true | DEVICE_DATA | 71 | 1 | 1/10 | ### SM200, MS200 + | shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | |-|-|-|-|-|-|-|-|-| -| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | -| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 16 | 1 | 1/10 | -| dhw.coldtemp | cold water | uint16 (>=0<=3199) | C | false | DHW | 17 | 1 | 1/10 | -| dhw.temp5 | temperature 5 | uint16 (>=0<=3199) | C | false | DHW | 18 | 1 | 1/10 | -| dhw.rettemp | return temperature | uint16 (>=0<=3199) | C | false | DHW | 19 | 1 | 1/10 | -| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | -| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | -| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | -| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | -| dhw.hottemp | extra hot temperature | uint8 (>=0<=254) | C | true | DHW | 20 | 1 | 1 | -| dhw.dailytemp | daily temperature | uint8 (>=0<=254) | C | true | DHW | 21 | 1 | 1 | -| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | -| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | -| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 10 | 1 | 1 | -| dhw.circtc | circulation time controled | boolean | | true | DHW | 22 | 1 | 1 | -| dhw.keepwarm | keep warm | boolean | | true | DHW | 23 | 1 | 1 | -| dhw.status2 | status 2 | enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold] | | false | DHW | 24 | 1 | 1 | -| dhw.pumpmod | pump modulation | uint8 (>=0<=100) | % | false | DHW | 25 | 1 | 1 | -| dhw.flow | flow rate | uint16 (>=0<=3199) | l/min | false | DHW | 26 | 1 | 1/10 | -| dhw.valvereturn | return valve | uint8 (>=0<=100) | % | true | DHW | 27 | 1 | 1 | -| dhw.deltatret | temp. diff. return valve | uint8 (>=0<=254) | K | true | DHW | 28 | 1 | 1 | -| dhw.errordisp | error display | enum [off\|normal\|inverted] | | true | DHW | 29 | 1 | 1 | +| collectortemp | collector temperature (TS1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| cylbottomtemp | cylinder bottom temperature (TS2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| solarpump | pump (PS1) | boolean | | false | DEVICE_DATA | 2 | 1 | 1 | +| pumpworktime | pump working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 3 | 2 | 1 | +| cylmaxtemp | maximum cylinder temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 5 | 1 | 1 | +| collectorshutdown | collector shutdown | boolean | | false | DEVICE_DATA | 6 | 1 | 1 | +| cylheated | cyl heated | boolean | | false | DEVICE_DATA | 7 | 1 | 1 | +| solarpumpmod | pump modulation (PS1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | +| pumpminmod | minimum pump modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 9 | 1 | 5 | +| turnondiff | pump turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 10 | 1 | 1/10 | +| turnoffdiff | pump turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 11 | 1 | 1/10 | +| collector2temp | collector 2 temperature (TS7) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 20 | 1 | 1/10 | +| cylmiddletemp | cylinder middle temperature (TS3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 17 | 1 | 1/10 | +| retheatassist | return temperature heat assistance (TS4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 18 | 1 | 1/10 | +| ts8 | (TS8) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 21 | 1 | 1/10 | +| ts16 | (TS16) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 22 | 1 | 1/10 | +| heatassistvalve | heat assistance valve (M1) | boolean | | false | DEVICE_DATA | 19 | 1 | 1 | +| heatassistpower | heat assistance valve power (M1) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 23 | 1 | 1 | +| solarpump2 | pump 2 (PS4) | boolean | | false | DEVICE_DATA | 24 | 1 | 1 | +| solarpump2mod | pump 2 modulation (PS4) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 25 | 1 | 1 | +| cyl2bottomtemp | second cylinder bottom temperature (TS5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 26 | 1 | 1/10 | +| cyl3bottomtemp | third cylinder bottom temperature (TS11) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 27 | 1 | 1/10 | +| cyltoptemp | cylinder top temperature (TS10) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 28 | 1 | 1/10 | +| heatexchangertemp | heat exchanger temperature (TS6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 29 | 1 | 1/10 | +| cylpumpmod | cylinder pump modulation (PS5) | uint8 (>=0<=100) | % | false | DEVICE_DATA | 30 | 1 | 1 | +| valvestatus | valve status | boolean | | false | DEVICE_DATA | 31 | 1 | 1 | +| vs1status | valve status VS1 | boolean | | false | DEVICE_DATA | 32 | 1 | 1 | +| vs3status | valve status VS3 | boolean | | false | DEVICE_DATA | 33 | 1 | 1 | +| transferpump | transfer pump | boolean | | false | DEVICE_DATA | 34 | 1 | 1 | +| transferpumpmod | transfer pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 35 | 1 | 1 | +| collectormaxtemp | maximum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 36 | 1 | 1 | +| collectormintemp | minimum collector temperature | uint8 (>=0<=254) | C | true | DEVICE_DATA | 37 | 1 | 1 | +| energylasthour | energy last hour | uint24 (>=0<=1677721) | Wh | false | DEVICE_DATA | 13 | 2 | 1/10 | +| energytoday | total energy today | uint24 (>=0<=16777214) | Wh | false | DEVICE_DATA | 38 | 2 | 1 | +| energytotal | total energy | uint24 (>=0<=1677721) | kWh | false | DEVICE_DATA | 40 | 2 | 1/10 | +| pump2worktime | pump 2 working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 42 | 2 | 1 | +| m1worktime | differential control working time | time (>=0<=16777214) | minutes | false | DEVICE_DATA | 44 | 2 | 1 | +| heattransfersystem | heattransfer system | boolean | | true | DEVICE_DATA | 46 | 1 | 1 | +| externalcyl | external cylinder | boolean | | true | DEVICE_DATA | 47 | 1 | 1 | +| thermaldisinfect | thermal disinfection | boolean | | true | DEVICE_DATA | 48 | 1 | 1 | +| heatmetering | heatmetering | boolean | | true | DEVICE_DATA | 49 | 1 | 1 | +| activated | activated | boolean | | true | DEVICE_DATA | 50 | 1 | 1 | +| solarpumpmode | solar pump mode | enum [constant\|pwm\|analog] | | true | DEVICE_DATA | 51 | 1 | 1 | +| solarpumpkick | solar pump kick | boolean | | true | DEVICE_DATA | 52 | 1 | 1 | +| plainwatermode | plain water mode | boolean | | true | DEVICE_DATA | 53 | 1 | 1 | +| doublematchflow | doublematchflow | boolean | | true | DEVICE_DATA | 54 | 1 | 1 | +| pump2minmod | minimum pump 2 modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 55 | 1 | 1 | +| turnondiff2 | pump 2 turn on difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 56 | 1 | 1/10 | +| turnoffdiff2 | pump 2 turn off difference | uint8 (>=0<=25) | C | true | DEVICE_DATA | 57 | 1 | 1/10 | +| pump2kick | pump kick 2 | boolean | | true | DEVICE_DATA | 58 | 1 | 1 | +| climatezone | climate zone | uint8 (>=0<=254) | | true | DEVICE_DATA | 59 | 1 | 1 | +| collector1area | collector 1 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 60 | 1 | 1/10 | +| collector1type | collector 1 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 61 | 1 | 1 | +| collector2area | collector 2 area | uint16 (>=0<=3199) | m² | true | DEVICE_DATA | 62 | 1 | 1/10 | +| collector2type | collector 2 type | enum [flat\|vacuum] | | true | DEVICE_DATA | 63 | 1 | 1 | +| cylpriority | cylinder priority | enum [cyl 1\|cyl 2] | | true | DEVICE_DATA | 64 | 1 | 1 | +| heatcntflowtemp | heat counter flow temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 65 | 1 | 1/10 | +| heatcntrettemp | heat counter return temperature | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 66 | 1 | 1/10 | +| heatcnt | heat counter impulses | uint8 (>=0<=254) | | false | DEVICE_DATA | 67 | 1 | 1 | +| swapflowtemp | swap flow temperature (TS14) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 68 | 1 | 1/10 | +| swaprettemp | swap return temperature (TS15) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 69 | 1 | 1/10 | +| heatassiston | heat assistance on | int8 (>=-12<=12) | K | true | DEVICE_DATA | 70 | 1 | 1/10 | +| heatassistoff | heat assistance off | int8 (>=-12<=12) | K | true | DEVICE_DATA | 71 | 1 | 1/10 | + +## Devices of type \_heatpump + +### HP Module + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 0 | 1 | 1 | +| dewtemperature | dew point temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 1 | 1 | 1 | +| curflowtemp | current flow temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | +| rettemp | return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | +| sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 4 | 1 | 1/10 | +| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 5 | 1 | 1/10 | +| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | +| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | +| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 14 | 1 | 1 | +| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 15 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only] | | true | DEVICE_DATA | 16 | 1 | 1 | +| lownoisemode | low noise mode | enum [off\|reduced output\|switch off hp\|perm. reduced] | | true | DEVICE_DATA | 17 | 1 | 1 | +| lownoisestart | low noise starttime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 18 | 1 | 1 | +| lownoisestop | low noise stoptime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 19 | 1 | 1 | +| dhw.hybriddhw | hybrid DHW | enum [eco\|high comfort] | | true | DHW | 0 | 1 | 1 | +| energypricegas | energy price gas | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 20 | 1 | 1 | +| energypriceel | energy price electric | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 21 | 1 | 1 | +| energyfeedpv | feed in PV | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 22 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 23 | 1 | 1 | +| airpurgemode | air purge mode | boolean | | true | DEVICE_DATA | 24 | 1 | 1 | +| heatpumpoutput | heatpump output | uint8 (>=0<=100) | % | true | DEVICE_DATA | 25 | 1 | 1 | +| coolingcircuit | cooling circuit | boolean | | true | DEVICE_DATA | 26 | 1 | 1 | +| compstartmod | compressor start modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 27 | 1 | 1 | +| heatdrainpan | heat drain pan | boolean | | true | DEVICE_DATA | 28 | 1 | 1 | +| heatcable | heating cable | boolean | | true | DEVICE_DATA | 29 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 30 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 1 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 32 | 2 | 1/100 | +| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 34 | 2 | 1/100 | +| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 36 | 2 | 1/100 | +| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 38 | 2 | 1/100 | +| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 40 | 2 | 1/100 | +| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 3 | 2 | 1/100 | +| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 42 | 2 | 1 | +| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 5 | 2 | 1 | +| fuelheat | fuel consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 44 | 2 | 1/10 | +| dhw.fueldhw | fuel consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 7 | 2 | 1/10 | +| elheat | el. consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 46 | 2 | 1/10 | +| dhw.eldhw | el. consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 9 | 2 | 1/10 | +| elgenheat | el. generation heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 48 | 2 | 1/10 | +| dhw.elgendhw | el generation | uint32 (>=0<=1677721) | kWh | false | DHW | 11 | 2 | 1/10 | + +### Hybrid Manager HM200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 0 | 1 | 1 | +| dewtemperature | dew point temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 1 | 1 | 1 | +| curflowtemp | current flow temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | +| rettemp | return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | +| sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 4 | 1 | 1/10 | +| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 5 | 1 | 1/10 | +| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | +| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | +| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 14 | 1 | 1 | +| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 15 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only] | | true | DEVICE_DATA | 16 | 1 | 1 | +| lownoisemode | low noise mode | enum [off\|reduced output\|switch off hp\|perm. reduced] | | true | DEVICE_DATA | 17 | 1 | 1 | +| lownoisestart | low noise starttime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 18 | 1 | 1 | +| lownoisestop | low noise stoptime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 19 | 1 | 1 | +| dhw.hybriddhw | hybrid DHW | enum [eco\|high comfort] | | true | DHW | 0 | 1 | 1 | +| energypricegas | energy price gas | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 20 | 1 | 1 | +| energypriceel | energy price electric | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 21 | 1 | 1 | +| energyfeedpv | feed in PV | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 22 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 23 | 1 | 1 | +| airpurgemode | air purge mode | boolean | | true | DEVICE_DATA | 24 | 1 | 1 | +| heatpumpoutput | heatpump output | uint8 (>=0<=100) | % | true | DEVICE_DATA | 25 | 1 | 1 | +| coolingcircuit | cooling circuit | boolean | | true | DEVICE_DATA | 26 | 1 | 1 | +| compstartmod | compressor start modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 27 | 1 | 1 | +| heatdrainpan | heat drain pan | boolean | | true | DEVICE_DATA | 28 | 1 | 1 | +| heatcable | heating cable | boolean | | true | DEVICE_DATA | 29 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 30 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 1 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 32 | 2 | 1/100 | +| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 34 | 2 | 1/100 | +| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 36 | 2 | 1/100 | +| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 38 | 2 | 1/100 | +| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 40 | 2 | 1/100 | +| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 3 | 2 | 1/100 | +| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 42 | 2 | 1 | +| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 5 | 2 | 1 | +| fuelheat | fuel consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 44 | 2 | 1/10 | +| dhw.fueldhw | fuel consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 7 | 2 | 1/10 | +| elheat | el. consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 46 | 2 | 1/10 | +| dhw.eldhw | el. consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 9 | 2 | 1/10 | +| elgenheat | el. generation heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 48 | 2 | 1/10 | +| dhw.elgendhw | el generation | uint32 (>=0<=1677721) | kWh | false | DHW | 11 | 2 | 1/10 | + +### CSH5800iG + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 0 | 1 | 1 | +| dewtemperature | dew point temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 1 | 1 | 1 | +| curflowtemp | current flow temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | +| rettemp | return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | +| sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 4 | 1 | 1/10 | +| hpta4 | drain pan temp (TA4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 5 | 1 | 1/10 | +| hptr1 | compressor temperature (TR1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 6 | 1 | 1/10 | +| hptr3 | refrigerant temperature liquid side (condenser output) (TR3) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 7 | 1 | 1/10 | +| hptr4 | evaporator inlet temperature (TR4) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 8 | 1 | 1/10 | +| hptr5 | compressor inlet temperature (TR5) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 9 | 1 | 1/10 | +| hptr6 | compressor outlet temperature (TR6) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 10 | 1 | 1/10 | +| hptl2 | air inlet temperature (TL2) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 11 | 1 | 1/10 | +| hppl1 | low pressure side temperature (PL1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 12 | 1 | 1/10 | +| hpph1 | high pressure side temperature (PH1) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| heatingpumpmod | heating pump modulation | uint8 (>=0<=100) | % | false | DEVICE_DATA | 14 | 1 | 1 | +| hpcompspd | compressor speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 15 | 1 | 1 | +| hybridstrategy | hybrid control strategy | enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only] | | true | DEVICE_DATA | 16 | 1 | 1 | +| lownoisemode | low noise mode | enum [off\|reduced output\|switch off hp\|perm. reduced] | | true | DEVICE_DATA | 17 | 1 | 1 | +| lownoisestart | low noise starttime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 18 | 1 | 1 | +| lownoisestop | low noise stoptime | uint8 (>=0<=23) | hours | true | DEVICE_DATA | 19 | 1 | 1 | +| dhw.hybriddhw | hybrid DHW | enum [eco\|high comfort] | | true | DHW | 0 | 1 | 1 | +| energypricegas | energy price gas | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 20 | 1 | 1 | +| energypriceel | energy price electric | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 21 | 1 | 1 | +| energyfeedpv | feed in PV | uint8 (>=0<=254) | ct/kWh | true | DEVICE_DATA | 22 | 1 | 1 | +| switchovertemp | outside switchover temperature | int8 (>=-126<=126) | C | true | DEVICE_DATA | 23 | 1 | 1 | +| airpurgemode | air purge mode | boolean | | true | DEVICE_DATA | 24 | 1 | 1 | +| heatpumpoutput | heatpump output | uint8 (>=0<=100) | % | true | DEVICE_DATA | 25 | 1 | 1 | +| coolingcircuit | cooling circuit | boolean | | true | DEVICE_DATA | 26 | 1 | 1 | +| compstartmod | compressor start modulation | uint8 (>=0<=100) | % | true | DEVICE_DATA | 27 | 1 | 1 | +| heatdrainpan | heat drain pan | boolean | | true | DEVICE_DATA | 28 | 1 | 1 | +| heatcable | heating cable | boolean | | true | DEVICE_DATA | 29 | 1 | 1 | +| nrgtotal | total energy | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 30 | 2 | 1/100 | +| dhw.nrg | energy | uint24 (>=0<=167772) | kWh | false | DHW | 1 | 2 | 1/100 | +| nrgheat | energy heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 32 | 2 | 1/100 | +| metertotal | meter total | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 34 | 2 | 1/100 | +| metercomp | meter compressor | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 36 | 2 | 1/100 | +| metereheat | meter e-heater | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 38 | 2 | 1/100 | +| meterheat | meter heating | uint24 (>=0<=167772) | kWh | false | DEVICE_DATA | 40 | 2 | 1/100 | +| dhw.meter | meter | uint24 (>=0<=167772) | kWh | false | DHW | 3 | 2 | 1/100 | +| heatingstarts | heating control starts | uint24 (>=0<=16777214) | | false | DEVICE_DATA | 42 | 2 | 1 | +| dhw.startshp | starts hp | uint24 (>=0<=16777214) | | false | DHW | 5 | 2 | 1 | +| fuelheat | fuel consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 44 | 2 | 1/10 | +| dhw.fueldhw | fuel consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 7 | 2 | 1/10 | +| elheat | el. consumption heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 46 | 2 | 1/10 | +| dhw.eldhw | el. consumption | uint32 (>=0<=1677721) | kWh | false | DHW | 9 | 2 | 1/10 | +| elgenheat | el. generation heating | uint32 (>=0<=1677721) | kWh | false | DEVICE_DATA | 48 | 2 | 1/10 | +| dhw.elgendhw | el generation | uint32 (>=0<=1677721) | kWh | false | DHW | 11 | 2 | 1/10 | + +## Devices of type \_switch + +### WM10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| activated | activated | boolean | | false | DEVICE_DATA | 0 | 1 | 1 | +| flowtemphc | flow temperature (TC1) | uint16 (>=0<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| status | status | int8 (>=-126<=126) | | false | DEVICE_DATA | 2 | 1 | 1 | + +## Devices of type \_controller + +### Rego 3000 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| datetime | date/time | string | | false | DEVICE_DATA | 0 | 13 | 1 | + +## Devices of type \_connect + +### MX400 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| datetime | date/time | string | | false | DEVICE_DATA | 0 | 13 | 1 | +| outdoortemp | outside temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 13 | 1 | 1/10 | +| src1.currtemp | current room temperature | int16 (>=-3199<=3199) | C | false | SRC | 0 | 1 | 1/10 | +| src1.airhumidity | relative air humidity | int8 (>=-100<=100) | % | false | SRC | 1 | 1 | 1 | +| src1.dewtemperature | dew point temperature | int16 (>=-3199<=3199) | C | false | SRC | 2 | 1 | 1/10 | +| src1.seltemp | selected room temperature | uint8 (>=5<=30) | C | true | SRC | 3 | 1 | 1/2 | +| src1.mode | operating mode | enum [off\|manual\|auto] | | true | SRC | 4 | 1 | 1 | +| src1.name | name | string | | true | SRC | 5 | 26 | 1 | +| src1.childlock | child lock | boolean | | true | SRC | 31 | 1 | 1 | +| src1.icon | icon | enum [none\|mdi:chef-hat\|mdi:sofa-single-outline\|mdi:bowl-mix-outline\|mdi:bed-single-outline\|mdi:bed-double-outline\|mdi:teddy-bear\|mdi:shower\|mdi:laptop\|mdi:door\|mdi:palette-outline\|mdi:washing-machine\|mdi:bookshelf] | | true | SRC | 32 | 1 | 1 | + +## Devices of type \_alert + +### EM10 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| setflowtemp | set flow temperature | uint8 (>=0<=254) | C | false | DEVICE_DATA | 0 | 1 | 1 | +| setburnpow | burner set power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 1 | 1 | 1 | + +## Devices of type \_extension + +### EM10, EM100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| flowtempvf | flow temperature in header (T0/Vf) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| input | input | uint8 (>=0<=25) | V | false | DEVICE_DATA | 1 | 1 | 1/10 | +| outpow | output IO1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 2 | 1 | 1 | +| setpower | request power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 3 | 1 | 1 | +| setpoint | set temp. | uint8 (>=0<=254) | C | false | DEVICE_DATA | 4 | 1 | 1 | +| minv | min volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 5 | 1 | 1/10 | +| maxv | max volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 6 | 1 | 1/10 | +| mint | min temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 7 | 1 | 1 | +| maxt | max temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 8 | 1 | 1 | +| mode | operating mode | uint8 (>=0<=254) | | false | DEVICE_DATA | 9 | 1 | 1 | + +### T1RF + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| flowtempvf | flow temperature in header (T0/Vf) | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| input | input | uint8 (>=0<=25) | V | false | DEVICE_DATA | 1 | 1 | 1/10 | +| outpow | output IO1 | uint8 (>=0<=100) | % | false | DEVICE_DATA | 2 | 1 | 1 | +| setpower | request power | uint8 (>=0<=100) | % | false | DEVICE_DATA | 3 | 1 | 1 | +| setpoint | set temp. | uint8 (>=0<=254) | C | false | DEVICE_DATA | 4 | 1 | 1 | +| minv | min volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 5 | 1 | 1/10 | +| maxv | max volt. | uint8 (>=0<=25) | V | true | DEVICE_DATA | 6 | 1 | 1/10 | +| mint | min temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 7 | 1 | 1 | +| maxt | max temp. | uint8 (>=0<=254) | C | true | DEVICE_DATA | 8 | 1 | 1 | +| mode | operating mode | uint8 (>=0<=254) | | false | DEVICE_DATA | 9 | 1 | 1 | + +## Devices of type \_heatsource + +### AM200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| ahs1.sysflowtemp | system flow temperature | int16 (>=-3199<=3199) | C | false | AHS | 0 | 1 | 1/10 | +| ahs1.sysrettemp | system return temperature | int16 (>=-3199<=3199) | C | false | AHS | 1 | 1 | 1/10 | +| ahs1.altflowtemp | alternative hs flow temperature | int16 (>=-3199<=3199) | C | false | AHS | 2 | 1 | 1/10 | +| ahs1.altrettemp | alternative hs return temperature | int16 (>=-3199<=3199) | C | false | AHS | 3 | 1 | 1/10 | +| ahs1.cyltoptemp | cylinder top temperature | int16 (>=-3199<=3199) | C | false | AHS | 4 | 1 | 1/10 | +| ahs1.cylcentertemp | cylinder center temperature | int16 (>=-3199<=3199) | C | false | AHS | 5 | 1 | 1/10 | +| ahs1.cylbottomtemp | cylinder bottom temperature | int16 (>=-3199<=3199) | C | false | AHS | 6 | 1 | 1/10 | +| ahs1.fluegastemp | flue gas temperature | int16 (>=-3199<=3199) | C | false | AHS | 7 | 1 | 1/10 | +| ahs1.valvebuffer | buffer valve | uint8 (>=0<=100) | % | false | AHS | 8 | 1 | 1 | +| ahs1.valvereturn | return valve | uint8 (>=0<=100) | % | false | AHS | 9 | 1 | 1 | +| ahs1.apumpmod | alternative hs pump modulation | uint8 (>=0<=100) | % | false | AHS | 10 | 1 | 1 | +| ahs1.vr2config | vr2 configuration | enum [off\|bypass] | | true | AHS | 11 | 1 | 1 | +| ahs1.ahsactivated | alternate heat source activation | boolean | | true | AHS | 12 | 1 | 1 | +| ahs1.apumpconfig | primary pump config | boolean | | true | AHS | 13 | 1 | 1 | +| ahs1.apumpsignal | output for pr1 pump | enum [off\|pwm\|pwm inverse] | | true | AHS | 14 | 1 | 1 | +| ahs1.apumpmin | min output pump pr1 | uint8 (>=12<=50) | % | true | AHS | 15 | 1 | 1 | +| ahs1.temprise | ahs return temp rise | boolean | | true | AHS | 16 | 1 | 1 | +| ahs1.setreturntemp | set temp return | uint8 (>=40<=75) | C | true | AHS | 17 | 1 | 1 | +| ahs1.mixruntime | mixer run time | uint16 (>=0<=600) | seconds | true | AHS | 18 | 1 | 1 | +| ahs1.setflowtemp | set flow temperature | uint8 (>=40<=75) | C | true | AHS | 19 | 1 | 1 | +| ahs1.bufbypass | buffer bypass config | enum [no\|mixer\|valve] | | true | AHS | 20 | 1 | 1 | +| ahs1.bufmixruntime | bypass mixer run time | uint16 (>=0<=600) | seconds | true | AHS | 21 | 1 | 1 | +| ahs1.bufconfig | dhw buffer config | enum [off\|monovalent\|bivalent] | | true | AHS | 22 | 1 | 1 | +| ahs1.blockmode | config htg. blocking mode | enum [off\|auto\|blocking] | | true | AHS | 23 | 1 | 1 | +| ahs1.blockterm | config of block terminal | enum [n_o\|n_c] | | true | AHS | 24 | 1 | 1 | +| ahs1.blockhyst | hyst. for boiler block | int8 (>=0<=50) | C | true | AHS | 25 | 1 | 1 | +| ahs1.releasewait | boiler release wait time | uint8 (>=0<=240) | minutes | true | AHS | 26 | 1 | 1 | +| ahs1.burner | burner | boolean | | false | AHS | 27 | 1 | 1 | +| ahs1.apump | alternative hs pump | boolean | | false | AHS | 28 | 1 | 1 | +| ahs1.heatrequest | heat request | uint8 (>=0<=100) | % | false | AHS | 29 | 1 | 1 | +| ahs1.blockremain | remaining blocktime | uint8 (>=0<=254) | minutes | false | AHS | 30 | 1 | 1 | +| ahs1.blockremaindhw | remaining blocktime dhw | uint8 (>=0<=254) | minutes | false | AHS | 31 | 1 | 1 | + +## Devices of type \_ventilation + +### HRV176, HRV156, 5000c, MV200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| outfresh | outdoor fresh air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 0 | 1 | 1/10 | +| infresh | indoor fresh air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 1 | 1 | 1/10 | +| outexhaust | outdoor exhaust air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 2 | 1 | 1/10 | +| inexhaust | indoor exhaust air | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | 3 | 1 | 1/10 | +| ventinspeed | in blower speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 4 | 1 | 1 | +| ventoutspeed | out blower speed | uint8 (>=0<=100) | % | false | DEVICE_DATA | 5 | 1 | 1 | +| ventmode | ventilation mode | enum [auto\|off\|L1\|L2\|L3\|L4\|demand\|sleep\|intense\|bypass\|party\|fireplace] | | true | DEVICE_DATA | 6 | 1 | 1 | +| airquality | air quality (voc) | uint16 (>=0<=31999) | | false | DEVICE_DATA | 7 | 1 | 1 | +| airhumidity | relative air humidity | uint8 (>=0<=100) | % | false | DEVICE_DATA | 8 | 1 | 1 | +| bypass | bypass | boolean | | true | DEVICE_DATA | 9 | 1 | 1 | + +## Devices of type \_water + +### IPM + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | +| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 2 | 1 | 1/10 | +| dhw.hydrTemp | hydraulic header temperature | uint16 (>=0<=3199) | C | false | DHW | 3 | 1 | 1/10 | +| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=254) | C | true | DHW | 5 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 6 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 7 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | + +### IPM2 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | +| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | +| dhw.curtemp2 | current extern temperature | uint16 (>=0<=3199) | C | false | DHW | 2 | 1 | 1/10 | +| dhw.hydrTemp | hydraulic header temperature | uint16 (>=0<=3199) | C | false | DHW | 3 | 1 | 1/10 | +| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | +| dhw.flowtempoffset | flow temperature offset | uint8 (>=0<=254) | C | true | DHW | 5 | 1 | 1 | +| dhw.hyston | hysteresis on temperature | int8 (>=-126<=126) | C | true | DHW | 6 | 1 | 1 | +| dhw.hystoff | hysteresis off temperature | int8 (>=-126<=126) | C | true | DHW | 7 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | + +### MM100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | +| dhw.tempstatus | temperature switch in assigned dhw (MC1) | int8 (>=-126<=126) | | false | DHW | 11 | 1 | 1 | +| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | +| dhw.difftemp | start differential temperature | int8 (>=-126<=126) | C | true | DHW | 13 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | +| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | +| dhw.requiredtemp | required temperature | uint8 (>=0<=254) | C | true | DHW | 15 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | + +### MM200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | +| dhw.tempstatus | temperature switch in assigned dhw (MC1) | int8 (>=-126<=126) | | false | DHW | 11 | 1 | 1 | +| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | +| dhw.difftemp | start differential temperature | int8 (>=-126<=126) | C | true | DHW | 13 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | +| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | +| dhw.requiredtemp | required temperature | uint8 (>=0<=254) | C | true | DHW | 15 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|on\|auto\|own prog] | | true | DHW | 10 | 1 | 1 | + +### SM100, MS100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 16 | 1 | 1/10 | +| dhw.coldtemp | cold water | uint16 (>=0<=3199) | C | false | DHW | 17 | 1 | 1/10 | +| dhw.temp5 | temperature 5 | uint16 (>=0<=3199) | C | false | DHW | 18 | 1 | 1/10 | +| dhw.rettemp | return temperature | uint16 (>=0<=3199) | C | false | DHW | 19 | 1 | 1/10 | +| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | +| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | +| dhw.hottemp | extra hot temperature | uint8 (>=0<=254) | C | true | DHW | 20 | 1 | 1 | +| dhw.dailytemp | daily temperature | uint8 (>=0<=254) | C | true | DHW | 21 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 10 | 1 | 1 | +| dhw.circtc | circulation time controlled | boolean | | true | DHW | 22 | 1 | 1 | +| dhw.keepwarm | keep warm | boolean | | true | DHW | 23 | 1 | 1 | +| dhw.status2 | status 2 | enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold] | | false | DHW | 24 | 1 | 1 | +| dhw.pumpmod | pump modulation | uint8 (>=0<=100) | % | false | DHW | 25 | 1 | 1 | +| dhw.flow | flow rate | uint16 (>=0<=3199) | l/min | false | DHW | 26 | 1 | 1/10 | +| dhw.valvereturn | return valve | uint8 (>=0<=100) | % | true | DHW | 27 | 1 | 1 | +| dhw.deltatret | temp. diff. return valve | uint8 (>=0<=254) | K | true | DHW | 28 | 1 | 1 | +| dhw.errordisp | error display | enum [off\|normal\|inverted] | | true | DHW | 29 | 1 | 1 | + +### SM200, MS200 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| dhw.temp | current temperature | uint16 (>=0<=3199) | C | false | DHW | 1 | 1 | 1/10 | +| dhw.storagetemp1 | storage intern temperature | uint16 (>=0<=3199) | C | false | DHW | 16 | 1 | 1/10 | +| dhw.coldtemp | cold water | uint16 (>=0<=3199) | C | false | DHW | 17 | 1 | 1/10 | +| dhw.temp5 | temperature 5 | uint16 (>=0<=3199) | C | false | DHW | 18 | 1 | 1/10 | +| dhw.rettemp | return temperature | uint16 (>=0<=3199) | C | false | DHW | 19 | 1 | 1/10 | +| dhw.pump | pump | boolean | | false | DHW | 4 | 1 | 1 | +| dhw.maxtemp | maximum temperature | uint8 (>=0<=254) | C | true | DHW | 12 | 1 | 1 | +| dhw.seltemp | selected temperature | uint8 (>=0<=254) | C | true | DHW | 0 | 1 | 1 | +| dhw.redtemp | reduced temperature | uint8 (>=0<=254) | C | true | DHW | 14 | 1 | 1 | +| dhw.hottemp | extra hot temperature | uint8 (>=0<=254) | C | true | DHW | 20 | 1 | 1 | +| dhw.dailytemp | daily temperature | uint8 (>=0<=254) | C | true | DHW | 21 | 1 | 1 | +| dhw.disinfectiontemp | disinfection temperature | uint8 (>=0<=254) | C | true | DHW | 8 | 1 | 1 | +| dhw.circ | circulation active | boolean | | true | DHW | 9 | 1 | 1 | +| dhw.circmode | circulation pump mode | enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous] | | true | DHW | 10 | 1 | 1 | +| dhw.circtc | circulation time controlled | boolean | | true | DHW | 22 | 1 | 1 | +| dhw.keepwarm | keep warm | boolean | | true | DHW | 23 | 1 | 1 | +| dhw.status2 | status 2 | enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold] | | false | DHW | 24 | 1 | 1 | +| dhw.pumpmod | pump modulation | uint8 (>=0<=100) | % | false | DHW | 25 | 1 | 1 | +| dhw.flow | flow rate | uint16 (>=0<=3199) | l/min | false | DHW | 26 | 1 | 1/10 | +| dhw.valvereturn | return valve | uint8 (>=0<=100) | % | true | DHW | 27 | 1 | 1 | +| dhw.deltatret | temp. diff. return valve | uint8 (>=0<=254) | K | true | DHW | 28 | 1 | 1 | +| dhw.errordisp | error display | enum [off\|normal\|inverted] | | true | DHW | 29 | 1 | 1 | + +## Devices of type \_pool + +### MP100 + +| shortname | fullname | type | uom | writeable | tag type | register offset | register count | scale factor | +|-|-|-|-|-|-|-|-|-| +| pooltemp | pool temperature | int16 (>=-3199<=3199) | C | false | DEVICE_DATA | -1 | 1 | 1/10 | +| poolshuntstatus | pool shunt status opening/closing | enum [stopped\|opening\|closing\|open\|close] | | false | DEVICE_DATA | -1 | 1 | 1 | +| poolshunt | pool shunt open/close (0% = pool / 100% = heat) | uint8 (>=0<=100) | % | false | DEVICE_DATA | -1 | 1 | 1 | diff --git a/docs/dump_entities.csv b/docs/dump_entities.csv index c2674c065..c61153681 100644 --- a/docs/dump_entities.csv +++ b/docs/dump_entities.csv @@ -1,5439 +1,5903 @@ -device name,device type,product id,shortname,fullname,type [options...] \| (min/max),uom,writeable,discovery entityid v3.4,discovery entityid,modbus unit identifier,modbus block,modbus scale factor,modbus offset,modbus count -"CS*800i, Logatherm WLW*",boiler,8,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"CS*800i, Logatherm WLW*",boiler,8,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"CS*800i, Logatherm WLW*",boiler,8,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"CS*800i, Logatherm WLW*",boiler,8,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"CS*800i, Logatherm WLW*",boiler,8,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"CS*800i, Logatherm WLW*",boiler,8,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"CS*800i, Logatherm WLW*",boiler,8,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"CS*800i, Logatherm WLW*",boiler,8,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"CS*800i, Logatherm WLW*",boiler,8,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"CS*800i, Logatherm WLW*",boiler,8,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"CS*800i, Logatherm WLW*",boiler,8,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"CS*800i, Logatherm WLW*",boiler,8,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"CS*800i, Logatherm WLW*",boiler,8,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"CS*800i, Logatherm WLW*",boiler,8,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"CS*800i, Logatherm WLW*",boiler,8,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"CS*800i, Logatherm WLW*",boiler,8,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"CS*800i, Logatherm WLW*",boiler,8,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"CS*800i, Logatherm WLW*",boiler,8,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"CS*800i, Logatherm WLW*",boiler,8,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"CS*800i, Logatherm WLW*",boiler,8,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"CS*800i, Logatherm WLW*",boiler,8,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"CS*800i, Logatherm WLW*",boiler,8,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"CS*800i, Logatherm WLW*",boiler,8,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"CS*800i, Logatherm WLW*",boiler,8,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"CS*800i, Logatherm WLW*",boiler,8,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"CS*800i, Logatherm WLW*",boiler,8,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"CS*800i, Logatherm WLW*",boiler,8,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"CS*800i, Logatherm WLW*",boiler,8,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"CS*800i, Logatherm WLW*",boiler,8,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"CS*800i, Logatherm WLW*",boiler,8,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"CS*800i, Logatherm WLW*",boiler,8,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"CS*800i, Logatherm WLW*",boiler,8,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"CS*800i, Logatherm WLW*",boiler,8,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"CS*800i, Logatherm WLW*",boiler,8,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"CS*800i, Logatherm WLW*",boiler,8,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"CS*800i, Logatherm WLW*",boiler,8,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"CS*800i, Logatherm WLW*",boiler,8,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"CS*800i, Logatherm WLW*",boiler,8,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"CS*800i, Logatherm WLW*",boiler,8,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"CS*800i, Logatherm WLW*",boiler,8,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"CS*800i, Logatherm WLW*",boiler,8,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"CS*800i, Logatherm WLW*",boiler,8,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"CS*800i, Logatherm WLW*",boiler,8,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"CS*800i, Logatherm WLW*",boiler,8,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_energy,sensor.boiler_dhw_nrg,5,9,1/100,0,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_heating,sensor.boiler_nrgheat,5,0,1/100,85,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgcool,energy cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_cooling,sensor.boiler_nrgcool,5,0,1/100,87,2 -"CS*800i, Logatherm WLW*",boiler,8,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_total,sensor.boiler_metertotal,5,0,1/100,89,2 -"CS*800i, Logatherm WLW*",boiler,8,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_compressor,sensor.boiler_metercomp,5,0,1/100,91,2 -"CS*800i, Logatherm WLW*",boiler,8,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_e-heater,sensor.boiler_metereheat,5,0,1/100,93,2 -"CS*800i, Logatherm WLW*",boiler,8,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/100,95,2 -"CS*800i, Logatherm WLW*",boiler,8,metercool,meter cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_cooling,sensor.boiler_metercool,5,0,1/100,97,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/100,2,2 -"CS*800i, Logatherm WLW*",boiler,8,uptimetotal,heatpump total uptime,time (>=0<=279620),minutes,false,sensor.boiler_heatpump_total_uptime,sensor.boiler_uptimetotal,5,0,1/60,99,2 -"CS*800i, Logatherm WLW*",boiler,8,uptimecontrol,total operating time heat,time (>=0<=279620),minutes,false,sensor.boiler_total_operating_time_heat,sensor.boiler_uptimecontrol,5,0,1/60,101,2 -"CS*800i, Logatherm WLW*",boiler,8,uptimecompheating,operating time compressor heating,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_heating,sensor.boiler_uptimecompheating,5,0,1/60,103,2 -"CS*800i, Logatherm WLW*",boiler,8,uptimecompcooling,operating time compressor cooling,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_cooling,sensor.boiler_uptimecompcooling,5,0,1/60,105,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.uptimecomp,operating time compressor,time (>=0<=279620),minutes,false,sensor.boiler_dhw_operating_time_compressor,sensor.boiler_dhw_uptimecomp,5,9,1/60,4,2 -"CS*800i, Logatherm WLW*",boiler,8,uptimecomppool,operating time compressor pool,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_pool,sensor.boiler_uptimecomppool,5,0,1/60,107,2 -"CS*800i, Logatherm WLW*",boiler,8,totalcompstarts,total compressor control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_total_compressor_control_starts,sensor.boiler_totalcompstarts,5,0,1,109,2 -"CS*800i, Logatherm WLW*",boiler,8,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_heating_control_starts,sensor.boiler_heatingstarts,5,0,1,111,2 -"CS*800i, Logatherm WLW*",boiler,8,coolingstarts,cooling control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_cooling_control_starts,sensor.boiler_coolingstarts,5,0,1,113,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts_hp,sensor.boiler_dhw_startshp,5,9,1,6,2 -"CS*800i, Logatherm WLW*",boiler,8,poolstarts,pool control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_pool_control_starts,sensor.boiler_poolstarts,5,0,1,115,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgconstotal,total energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption,sensor.boiler_nrgconstotal,5,0,1,117,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgconscomptotal,total energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption_compressor,sensor.boiler_nrgconscomptotal,5,0,1,119,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgconscompheating,energy consumption compressor heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_heating,sensor.boiler_nrgconscompheating,5,0,1,121,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.nrgconscomp,energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_energy_consumption_compressor,sensor.boiler_dhw_nrgconscomp,5,9,1,8,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgconscompcooling,energy consumption compressor cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_cooling,sensor.boiler_nrgconscompcooling,5,0,1,123,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgconscomppool,energy consumption compressor pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_pool,sensor.boiler_nrgconscomppool,5,0,1,125,2 -"CS*800i, Logatherm WLW*",boiler,8,auxelecheatnrgconstotal,total aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_aux_elec._heater_energy_consumption,sensor.boiler_auxelecheatnrgconstotal,5,0,1,127,2 -"CS*800i, Logatherm WLW*",boiler,8,auxelecheatnrgconsheating,aux elec. heater energy consumption heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_heating,sensor.boiler_auxelecheatnrgconsheating,5,0,1,129,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.auxelecheatnrgcons,aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_aux_elec._heater_energy_consumption,sensor.boiler_dhw_auxelecheatnrgcons,5,9,1,10,2 -"CS*800i, Logatherm WLW*",boiler,8,auxelecheatnrgconspool,aux elec. heater energy consumption pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_pool,sensor.boiler_auxelecheatnrgconspool,5,0,1,131,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgsupptotal,total energy supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied,sensor.boiler_nrgsupptotal,5,0,1,133,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgsuppheating,total energy supplied heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_heating,sensor.boiler_nrgsuppheating,5,0,1,135,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.nrgsupp,total energy warm supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_total_energy_warm_supplied,sensor.boiler_dhw_nrgsupp,5,9,1,12,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgsuppcooling,total energy supplied cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_cooling,sensor.boiler_nrgsuppcooling,5,0,1,137,2 -"CS*800i, Logatherm WLW*",boiler,8,nrgsupppool,total energy supplied pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_pool,sensor.boiler_nrgsupppool,5,0,1,139,2 -"CS*800i, Logatherm WLW*",boiler,8,hppower,compressor power output,uint16 (>=0<=3199),kW,false,sensor.boiler_compressor_power_output,sensor.boiler_hppower,5,0,1/10,141,1 -"CS*800i, Logatherm WLW*",boiler,8,hpmaxpower,compressor max power,uint8 (>=0<=100),%,true,number.boiler_compressor_max_power,number.boiler_hpmaxpower,5,0,1,142,1 -"CS*800i, Logatherm WLW*",boiler,8,pvmaxcomp,pv compressor max power,uint8 (>=0<=25),kW,true,number.boiler_pv_compressor_max_power,number.boiler_pvmaxcomp,5,0,1/10,143,1 -"CS*800i, Logatherm WLW*",boiler,8,powerreduction,power reduction,uint8 (>=30<=60),%,true,number.boiler_power_reduction,number.boiler_powerreduction,5,0,10,144,1 -"CS*800i, Logatherm WLW*",boiler,8,hpsetdiffpress,set differential pressure,uint8 (>=150<=750),mbar,true,number.boiler_set_differential_pressure,number.boiler_hpsetdiffpress,5,0,50,145,1 -"CS*800i, Logatherm WLW*",boiler,8,hpcompon,hp compressor,boolean, ,false,binary_sensor.boiler_hp_compressor,binary_sensor.boiler_hpcompon,5,0,1,146,1 -"CS*800i, Logatherm WLW*",boiler,8,hpactivity,compressor activity,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_compressor_activity,sensor.boiler_hpactivity,5,0,1,147,1 -"CS*800i, Logatherm WLW*",boiler,8,hpbrinepumpspd,brine pump speed,uint8 (>=0<=100),%,false,sensor.boiler_brine_pump_speed,sensor.boiler_hpbrinepumpspd,5,0,1,148,1 -"CS*800i, Logatherm WLW*",boiler,8,hpswitchvalve,switch valve,boolean, ,false,binary_sensor.boiler_switch_valve,binary_sensor.boiler_hpswitchvalve,5,0,1,149,1 -"CS*800i, Logatherm WLW*",boiler,8,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_speed,sensor.boiler_hpcompspd,5,0,1,150,1 -"CS*800i, Logatherm WLW*",boiler,8,hpcircspd,circulation pump speed,uint8 (>=0<=100),%,false,sensor.boiler_circulation_pump_speed,sensor.boiler_hpcircspd,5,0,1,151,1 -"CS*800i, Logatherm WLW*",boiler,8,hpbrinein,brine in/evaporator,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_in/evaporator,sensor.boiler_hpbrinein,5,0,1/10,152,1 -"CS*800i, Logatherm WLW*",boiler,8,hpbrineout,brine out/condenser,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_out/condenser,sensor.boiler_hpbrineout,5,0,1/10,153,1 -"CS*800i, Logatherm WLW*",boiler,8,hptc0,heat carrier return (TC0),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_return_(TC0),sensor.boiler_hptc0,5,0,1/10,154,1 -"CS*800i, Logatherm WLW*",boiler,8,hptc1,heat carrier forward (TC1),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_forward_(TC1),sensor.boiler_hptc1,5,0,1/10,155,1 -"CS*800i, Logatherm WLW*",boiler,8,hptc3,condenser temperature (TC3),int16 (>=-3199<=3199),C,false,sensor.boiler_condenser_temperature_(TC3),sensor.boiler_hptc3,5,0,1/10,156,1 -"CS*800i, Logatherm WLW*",boiler,8,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_temperature_(TR1),sensor.boiler_hptr1,5,0,1/10,157,1 -"CS*800i, Logatherm WLW*",boiler,8,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.boiler_hptr3,5,0,1/10,158,1 -"CS*800i, Logatherm WLW*",boiler,8,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.boiler_evaporator_inlet_temperature_(TR4),sensor.boiler_hptr4,5,0,1/10,159,1 -"CS*800i, Logatherm WLW*",boiler,8,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_inlet_temperature_(TR5),sensor.boiler_hptr5,5,0,1/10,160,1 -"CS*800i, Logatherm WLW*",boiler,8,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_outlet_temperature_(TR6),sensor.boiler_hptr6,5,0,1/10,161,1 -"CS*800i, Logatherm WLW*",boiler,8,hptr7,refrigerant temperature gas side (condenser input) (TR7),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_gas_side_(condenser_input)_(TR7),sensor.boiler_hptr7,5,0,1/10,162,1 -"CS*800i, Logatherm WLW*",boiler,8,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.boiler_air_inlet_temperature_(TL2),sensor.boiler_hptl2,5,0,1/10,163,1 -"CS*800i, Logatherm WLW*",boiler,8,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.boiler_low_pressure_side_temperature_(PL1),sensor.boiler_hppl1,5,0,1/10,164,1 -"CS*800i, Logatherm WLW*",boiler,8,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.boiler_high_pressure_side_temperature_(PH1),sensor.boiler_hpph1,5,0,1/10,165,1 -"CS*800i, Logatherm WLW*",boiler,8,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.boiler_drain_pan_temp_(TA4),sensor.boiler_hpta4,5,0,1/10,166,1 -"CS*800i, Logatherm WLW*",boiler,8,hptw1,reservoir temp (TW1),int16 (>=-3199<=3199),C,false,sensor.boiler_reservoir_temp_(TW1),sensor.boiler_hptw1,5,0,1/10,167,1 -"CS*800i, Logatherm WLW*",boiler,8,poolsettemp,pool set temperature,uint8 (>=0<=127),C,true,number.boiler_pool_set_temperature,number.boiler_poolsettemp,5,0,1/2,168,1 -"CS*800i, Logatherm WLW*",boiler,8,hp4way,4-way valve (VR4),enum [cooling & defrost\|heating & dhw], ,false,sensor.boiler_4-way_valve_(VR4),sensor.boiler_hp4way,5,0,1,169,1 -"CS*800i, Logatherm WLW*",boiler,8,hpin1,input 1 state,boolean, ,false,binary_sensor.boiler_input_1_state,binary_sensor.boiler_hpin1,5,0,1,170,1 -"CS*800i, Logatherm WLW*",boiler,8,hpin1opt,input 1 options,string, ,true,sensor.boiler_input_1_options,sensor.boiler_hpin1opt,5,0,1,171,8 -"CS*800i, Logatherm WLW*",boiler,8,hpin2,input 2 state,boolean, ,false,binary_sensor.boiler_input_2_state,binary_sensor.boiler_hpin2,5,0,1,179,1 -"CS*800i, Logatherm WLW*",boiler,8,hpin2opt,input 2 options,string, ,true,sensor.boiler_input_2_options,sensor.boiler_hpin2opt,5,0,1,180,8 -"CS*800i, Logatherm WLW*",boiler,8,hpin3,input 3 state,boolean, ,false,binary_sensor.boiler_input_3_state,binary_sensor.boiler_hpin3,5,0,1,188,1 -"CS*800i, Logatherm WLW*",boiler,8,hpin3opt,input 3 options,string, ,true,sensor.boiler_input_3_options,sensor.boiler_hpin3opt,5,0,1,189,8 -"CS*800i, Logatherm WLW*",boiler,8,hpin4,input 4 state,boolean, ,false,binary_sensor.boiler_input_4_state,binary_sensor.boiler_hpin4,5,0,1,197,1 -"CS*800i, Logatherm WLW*",boiler,8,hpin4opt,input 4 options,string, ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,5,0,1,198,8 -"CS*800i, Logatherm WLW*",boiler,8,maxheatcomp,heat limit compressor,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,5,0,1,206,1 -"CS*800i, Logatherm WLW*",boiler,8,maxheatheat,heat limit heating,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,5,0,1,207,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.maxheat,heat limit,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,5,9,1,14,1 -"CS*800i, Logatherm WLW*",boiler,8,mandefrost,manual defrost,boolean, ,true,switch.boiler_manual_defrost,switch.boiler_mandefrost,5,0,1,208,1 -"CS*800i, Logatherm WLW*",boiler,8,pvcooling,cooling only with PV,boolean, ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,5,0,1,209,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheateronly,aux heater only,boolean, ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,5,0,1,210,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheateroff,disable aux heater,boolean, ,true,switch.boiler_disable_aux_heater,switch.boiler_auxheateroff,5,0,1,211,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheaterstatus,aux heater status,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_aux_heater_status,sensor.boiler_auxheaterstatus,5,0,1,212,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheaterlevel,aux heater level,uint8 (>=0<=100),%,false,sensor.boiler_aux_heater_level,sensor.boiler_auxheaterlevel,5,0,1,213,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheaterdelay,aux heater on delay,uint16 (>=10<=1000),K*min,true,number.boiler_aux_heater_on_delay,number.boiler_auxheaterdelay,5,0,10,214,1 -"CS*800i, Logatherm WLW*",boiler,8,auxmaxlimit,aux heater max limit,uint8 (>=0<=10),K,true,number.boiler_aux_heater_max_limit,number.boiler_auxmaxlimit,5,0,1/10,215,1 -"CS*800i, Logatherm WLW*",boiler,8,auxlimitstart,aux heater limit start,uint8 (>=0<=10),K,true,number.boiler_aux_heater_limit_start,number.boiler_auxlimitstart,5,0,1/10,216,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheatrmode,aux heater mode,enum [eco\|comfort], ,true,select.boiler_aux_heater_mode,select.boiler_auxheatrmode,5,0,1,217,1 -"CS*800i, Logatherm WLW*",boiler,8,hphystheat,on/off hyst heat,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_heat,number.boiler_hphystheat,5,0,5,218,1 -"CS*800i, Logatherm WLW*",boiler,8,hphystcool,on/off hyst cool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_cool,number.boiler_hphystcool,5,0,5,219,1 -"CS*800i, Logatherm WLW*",boiler,8,hphystpool,on/off hyst pool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_pool,number.boiler_hphystpool,5,0,5,220,1 -"CS*800i, Logatherm WLW*",boiler,8,silentmode,silent mode,enum [off\|auto\|on], ,true,select.boiler_silent_mode,select.boiler_silentmode,5,0,1,221,1 -"CS*800i, Logatherm WLW*",boiler,8,silentfrom,silent mode from,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_from,number.boiler_silentfrom,5,0,15,222,1 -"CS*800i, Logatherm WLW*",boiler,8,silentto,silent mode to,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_to,number.boiler_silentto,5,0,15,223,1 -"CS*800i, Logatherm WLW*",boiler,8,mintempsilent,min outside temp for silent mode,int8 (>=-126<=126),C,true,number.boiler_min_outside_temp_for_silent_mode,number.boiler_mintempsilent,5,0,1,224,1 -"CS*800i, Logatherm WLW*",boiler,8,tempparmode,outside temp parallel mode,int8 (>=-126<=126),C,true,number.boiler_outside_temp_parallel_mode,number.boiler_tempparmode,5,0,1,225,1 -"CS*800i, Logatherm WLW*",boiler,8,auxheatmix,aux heater mixing valve,int8 (>=-100<=100),%,false,sensor.boiler_aux_heater_mixing_valve,sensor.boiler_auxheatmix,5,0,1,226,1 -"CS*800i, Logatherm WLW*",boiler,8,tempdiffheat,temp diff TC3/TC0 heat,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_heat,number.boiler_tempdiffheat,5,0,1/10,227,1 -"CS*800i, Logatherm WLW*",boiler,8,tempdiffcool,temp diff TC3/TC0 cool,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_cool,number.boiler_tempdiffcool,5,0,1/10,228,1 -"CS*800i, Logatherm WLW*",boiler,8,vpcooling,valve/pump cooling,boolean, ,true,switch.boiler_valve/pump_cooling,switch.boiler_vpcooling,5,0,1,229,1 -"CS*800i, Logatherm WLW*",boiler,8,heatcable,heating cable,boolean, ,true,switch.boiler_heating_cable,switch.boiler_heatcable,5,0,1,230,1 -"CS*800i, Logatherm WLW*",boiler,8,vc0valve,VC0 valve,boolean, ,true,switch.boiler_VC0_valve,switch.boiler_vc0valve,5,0,1,231,1 -"CS*800i, Logatherm WLW*",boiler,8,primepump,primary heatpump,boolean, ,true,switch.boiler_primary_heatpump,switch.boiler_primepump,5,0,1,232,1 -"CS*800i, Logatherm WLW*",boiler,8,primepumpmod,primary heatpump modulation,uint8 (>=0<=100),%,true,number.boiler_primary_heatpump_modulation,number.boiler_primepumpmod,5,0,1,233,1 -"CS*800i, Logatherm WLW*",boiler,8,hp3way,3-way valve,boolean, ,true,switch.boiler_3-way_valve,switch.boiler_hp3way,5,0,1,234,1 -"CS*800i, Logatherm WLW*",boiler,8,elheatstep1,el. heater step 1,boolean, ,true,switch.boiler_el._heater_step_1,switch.boiler_elheatstep1,5,0,1,235,1 -"CS*800i, Logatherm WLW*",boiler,8,elheatstep2,el. heater step 2,boolean, ,true,switch.boiler_el._heater_step_2,switch.boiler_elheatstep2,5,0,1,236,1 -"CS*800i, Logatherm WLW*",boiler,8,elheatstep3,el. heater step 3,boolean, ,true,switch.boiler_el._heater_step_3,switch.boiler_elheatstep3,5,0,1,237,1 -"CS*800i, Logatherm WLW*",boiler,8,hpea0,condensate reservoir heating (EA0),boolean, ,false,binary_sensor.boiler_condensate_reservoir_heating_(EA0),binary_sensor.boiler_hpea0,5,0,1,238,1 -"CS*800i, Logatherm WLW*",boiler,8,hppumpmode,primary heatpump mode,enum [auto\|continuous], ,true,select.boiler_primary_heatpump_mode,select.boiler_hppumpmode,5,0,1,239,1 -"CS*800i, Logatherm WLW*",boiler,8,fan,fan,uint8 (>=20<=100),%,true,number.boiler_fan,number.boiler_fan,5,0,1,240,1 -"CS*800i, Logatherm WLW*",boiler,8,shutdown,shutdown,cmd [off\|on], ,true,sensor.boiler_shutdown,sensor.boiler_shutdown,5,0,1,241,1 -"CS*800i, Logatherm WLW*",boiler,8,hpcurrpower,compressor current power,uint16 (>=0<=31999),W,false,sensor.boiler_compressor_current_power,sensor.boiler_hpcurrpower,5,0,1,242,1 -"CS*800i, Logatherm WLW*",boiler,8,hppowerlimit,power limit,uint16 (>=0<=31999),W,true,number.boiler_power_limit,number.boiler_hppowerlimit,5,0,1,243,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.alternatingop,alternating operation,boolean, ,true,switch.boiler_dhw_alternating_operation,switch.boiler_dhw_alternatingop,5,9,1,15,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.altopprioheat,prioritise heating during dhw,uint8 (>=20<=120),minutes,true,number.boiler_dhw_prioritise_heating_during_dhw,number.boiler_dhw_altopprioheat,5,9,1,16,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.altopprio,prioritise dhw during heating,uint8 (>=30<=120),minutes,true,number.boiler_dhw_prioritise_dhw_during_heating,number.boiler_dhw_altopprio,5,9,1,17,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,5,9,1,18,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,5,9,1,19,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,5,9,1,20,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.comfdiff,comfort diff,uint8 (>=6<=12),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,5,9,1,21,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.ecodiff,eco diff,uint8 (>=6<=12),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,5,9,1,22,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.ecoplusdiff,eco+ diff,uint8 (>=6<=12),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,5,9,1,23,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.comfstop,comfort stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,5,9,1,24,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.ecostop,eco stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,5,9,1,25,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,5,9,1,26,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.hpcircpump,circulation pump available during dhw,boolean, ,true,switch.boiler_dhw_circulation_pump_available_during_dhw,switch.boiler_dhw_hpcircpump,5,9,1,27,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"CS*800i, Logatherm WLW*",boiler,8,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"CS*800i, Logatherm WLW*",boiler,8,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"C1200W",boiler,12,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"C1200W",boiler,12,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"C1200W",boiler,12,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"C1200W",boiler,12,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"C1200W",boiler,12,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"C1200W",boiler,12,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"C1200W",boiler,12,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"C1200W",boiler,12,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"C1200W",boiler,12,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"C1200W",boiler,12,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"C1200W",boiler,12,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"C1200W",boiler,12,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"C1200W",boiler,12,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"C1200W",boiler,12,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"C1200W",boiler,12,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"C1200W",boiler,12,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"C1200W",boiler,12,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"C1200W",boiler,12,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"C1200W",boiler,12,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"C1200W",boiler,12,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"C1200W",boiler,12,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"C1200W",boiler,12,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"C1200W",boiler,12,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"C1200W",boiler,12,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"C1200W",boiler,12,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"C1200W",boiler,12,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"C1200W",boiler,12,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"C1200W",boiler,12,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"C1200W",boiler,12,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"C1200W",boiler,12,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"C1200W",boiler,12,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"C1200W",boiler,12,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"C1200W",boiler,12,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"C1200W",boiler,12,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"C1200W",boiler,12,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"C1200W",boiler,12,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"C1200W",boiler,12,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"C1200W",boiler,12,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"C1200W",boiler,12,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"C1200W",boiler,12,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"C1200W",boiler,12,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"C1200W",boiler,12,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"C1200W",boiler,12,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"C1200W",boiler,12,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"C1200W",boiler,12,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"C1200W",boiler,12,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"C1200W",boiler,12,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"C1200W",boiler,12,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"C1200W",boiler,12,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"C1200W",boiler,12,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"C1200W",boiler,12,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"C1200W",boiler,12,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"C1200W",boiler,12,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"C1200W",boiler,12,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"C1200W",boiler,12,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"C1200W",boiler,12,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"C1200W",boiler,12,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"C1200W",boiler,12,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"C1200W",boiler,12,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"C1200W",boiler,12,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"C1200W",boiler,12,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"C1200W",boiler,12,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"C1200W",boiler,12,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"C1200W",boiler,12,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"C1200W",boiler,12,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"C1200W",boiler,12,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"C1200W",boiler,12,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"C1200W",boiler,12,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"C1200W",boiler,12,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"C1200W",boiler,12,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"C1200W",boiler,12,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"C1200W",boiler,12,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"C1200W",boiler,12,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"C1200W",boiler,12,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"C1200W",boiler,12,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"C1200W",boiler,12,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"C1200W",boiler,12,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"C1200W",boiler,12,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"C1200W",boiler,12,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"C1200W",boiler,12,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"C1200W",boiler,12,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"C1200W",boiler,12,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"C1200W",boiler,12,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"C1200W",boiler,12,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"C1200W",boiler,12,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"C1200W",boiler,12,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"C1200W",boiler,12,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"C1200W",boiler,12,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"C1200W",boiler,12,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"C1200W",boiler,12,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"C1200W",boiler,12,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"C1200W",boiler,12,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"C1200W",boiler,12,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"C1200W",boiler,12,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"C1200W",boiler,12,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"C1200W",boiler,12,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"C1200W",boiler,12,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"C1200W",boiler,12,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"C1200W",boiler,12,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"C1200W",boiler,12,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"C1200W",boiler,12,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"C1200W",boiler,12,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"C1200W",boiler,12,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"C1200W",boiler,12,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"C1200W",boiler,12,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"C1200W",boiler,12,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"C1200W",boiler,12,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"C1200W",boiler,12,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"C1200W",boiler,12,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"C1200W",boiler,12,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"C1200W",boiler,12,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"C1200W",boiler,12,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"C1200W",boiler,12,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"C1200W",boiler,12,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"BK13/BK15, Smartline, GB1*2",boiler,64,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"BK13/BK15, Smartline, GB1*2",boiler,64,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"BK13/BK15, Smartline, GB1*2",boiler,64,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logano GB1*5, Logamatic MC10",boiler,72,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logano GB1*5, Logamatic MC10",boiler,72,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logano GB1*5, Logamatic MC10",boiler,72,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logano GB1*5, Logamatic MC10",boiler,72,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logano GB1*5, Logamatic MC10",boiler,72,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logano GB1*5, Logamatic MC10",boiler,72,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logano GB1*5, Logamatic MC10",boiler,72,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logano GB1*5, Logamatic MC10",boiler,72,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logano GB1*5, Logamatic MC10",boiler,72,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logano GB1*5, Logamatic MC10",boiler,72,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logano GB1*5, Logamatic MC10",boiler,72,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logano GB1*5, Logamatic MC10",boiler,72,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logano GB1*5, Logamatic MC10",boiler,72,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logano GB1*5, Logamatic MC10",boiler,72,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logano GB1*5, Logamatic MC10",boiler,72,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logano GB1*5, Logamatic MC10",boiler,72,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logano GB1*5, Logamatic MC10",boiler,72,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logano GB1*5, Logamatic MC10",boiler,72,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logano GB1*5, Logamatic MC10",boiler,72,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logano GB1*5, Logamatic MC10",boiler,72,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logano GB1*5, Logamatic MC10",boiler,72,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logano GB1*5, Logamatic MC10",boiler,72,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logano GB1*5, Logamatic MC10",boiler,72,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logano GB1*5, Logamatic MC10",boiler,72,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logano GB1*5, Logamatic MC10",boiler,72,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logano GB1*5, Logamatic MC10",boiler,72,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logano GB1*5, Logamatic MC10",boiler,72,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logano GB1*5, Logamatic MC10",boiler,72,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logano GB1*5, Logamatic MC10",boiler,72,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logano GB1*5, Logamatic MC10",boiler,72,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logano GB1*5, Logamatic MC10",boiler,72,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logano GB1*5, Logamatic MC10",boiler,72,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logano GB1*5, Logamatic MC10",boiler,72,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logano GB1*5, Logamatic MC10",boiler,72,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logano GB1*5, Logamatic MC10",boiler,72,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logano GB1*5, Logamatic MC10",boiler,72,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logano GB1*5, Logamatic MC10",boiler,72,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logano GB1*5, Logamatic MC10",boiler,72,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logano GB1*5, Logamatic MC10",boiler,72,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logano GB1*5, Logamatic MC10",boiler,72,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logano GB1*5, Logamatic MC10",boiler,72,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logano GB1*5, Logamatic MC10",boiler,72,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logano GB1*5, Logamatic MC10",boiler,72,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logano GB1*5, Logamatic MC10",boiler,72,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logano GB1*5, Logamatic MC10",boiler,72,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logano GB1*5, Logamatic MC10",boiler,72,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logano GB1*5, Logamatic MC10",boiler,72,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logano GB1*5, Logamatic MC10",boiler,72,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logano GB1*5, Logamatic MC10",boiler,72,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logano GB1*5, Logamatic MC10",boiler,72,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logano GB1*5, Logamatic MC10",boiler,72,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logano GB1*5, Logamatic MC10",boiler,72,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logano GB1*5, Logamatic MC10",boiler,72,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logano GB1*5, Logamatic MC10",boiler,72,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logano GB1*5, Logamatic MC10",boiler,72,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logano GB1*5, Logamatic MC10",boiler,72,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logano GB1*5, Logamatic MC10",boiler,72,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Cascade CM10",boiler,81,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Cascade CM10",boiler,81,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Cascade CM10",boiler,81,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Cascade CM10",boiler,81,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Cascade CM10",boiler,81,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Cascade CM10",boiler,81,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Cascade CM10",boiler,81,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Cascade CM10",boiler,81,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Cascade CM10",boiler,81,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Cascade CM10",boiler,81,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Cascade CM10",boiler,81,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Cascade CM10",boiler,81,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Cascade CM10",boiler,81,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Cascade CM10",boiler,81,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Cascade CM10",boiler,81,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Cascade CM10",boiler,81,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Cascade CM10",boiler,81,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Cascade CM10",boiler,81,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Cascade CM10",boiler,81,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Cascade CM10",boiler,81,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Cascade CM10",boiler,81,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Cascade CM10",boiler,81,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Cascade CM10",boiler,81,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Cascade CM10",boiler,81,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Cascade CM10",boiler,81,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Cascade CM10",boiler,81,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Cascade CM10",boiler,81,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Cascade CM10",boiler,81,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Cascade CM10",boiler,81,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Cascade CM10",boiler,81,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Cascade CM10",boiler,81,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Cascade CM10",boiler,81,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Cascade CM10",boiler,81,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Cascade CM10",boiler,81,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Cascade CM10",boiler,81,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Cascade CM10",boiler,81,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Cascade CM10",boiler,81,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Cascade CM10",boiler,81,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Cascade CM10",boiler,81,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Cascade CM10",boiler,81,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Cascade CM10",boiler,81,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Cascade CM10",boiler,81,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Cascade CM10",boiler,81,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Cascade CM10",boiler,81,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Cascade CM10",boiler,81,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Cascade CM10",boiler,81,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Cascade CM10",boiler,81,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Cascade CM10",boiler,81,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Cascade CM10",boiler,81,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Cascade CM10",boiler,81,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Cascade CM10",boiler,81,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Cascade CM10",boiler,81,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Cascade CM10",boiler,81,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Cascade CM10",boiler,81,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Cascade CM10",boiler,81,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Cascade CM10",boiler,81,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Cascade CM10",boiler,81,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Cascade CM10",boiler,81,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Cascade CM10",boiler,81,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Cascade CM10",boiler,81,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Cascade CM10",boiler,81,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Cascade CM10",boiler,81,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Cascade CM10",boiler,81,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Cascade CM10",boiler,81,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Cascade CM10",boiler,81,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Cascade CM10",boiler,81,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Cascade CM10",boiler,81,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Cascade CM10",boiler,81,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Cascade CM10",boiler,81,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Cascade CM10",boiler,81,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Cascade CM10",boiler,81,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Cascade CM10",boiler,81,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Cascade CM10",boiler,81,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Cascade CM10",boiler,81,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Cascade CM10",boiler,81,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Cascade CM10",boiler,81,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Cascade CM10",boiler,81,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Cascade CM10",boiler,81,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Cascade CM10",boiler,81,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Cascade CM10",boiler,81,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Cascade CM10",boiler,81,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Cascade CM10",boiler,81,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Cascade CM10",boiler,81,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Cascade CM10",boiler,81,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Cascade CM10",boiler,81,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Cascade CM10",boiler,81,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Cascade CM10",boiler,81,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Cascade CM10",boiler,81,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Cascade CM10",boiler,81,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Cascade CM10",boiler,81,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Cascade CM10",boiler,81,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Cascade CM10",boiler,81,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Cascade CM10",boiler,81,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Cascade CM10",boiler,81,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Cascade CM10",boiler,81,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Cascade CM10",boiler,81,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Cascade CM10",boiler,81,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Cascade CM10",boiler,81,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Cascade CM10",boiler,81,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Cascade CM10",boiler,81,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Cascade CM10",boiler,81,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Cascade CM10",boiler,81,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Cascade CM10",boiler,81,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Cascade CM10",boiler,81,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Cascade CM10",boiler,81,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Cascade CM10",boiler,81,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Cascade CM10",boiler,81,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Cascade CM10",boiler,81,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Cascade CM10",boiler,81,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Cascade CM10",boiler,81,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Cascade CM10",boiler,81,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Cascade CM10",boiler,81,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Cascade CM10",boiler,81,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Cascade CM10",boiler,81,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logamax Plus GB022",boiler,84,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logamax Plus GB022",boiler,84,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logamax Plus GB022",boiler,84,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logamax Plus GB022",boiler,84,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logamax Plus GB022",boiler,84,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logamax Plus GB022",boiler,84,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logamax Plus GB022",boiler,84,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logamax Plus GB022",boiler,84,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logamax Plus GB022",boiler,84,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logamax Plus GB022",boiler,84,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logamax Plus GB022",boiler,84,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logamax Plus GB022",boiler,84,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logamax Plus GB022",boiler,84,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logamax Plus GB022",boiler,84,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logamax Plus GB022",boiler,84,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logamax Plus GB022",boiler,84,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logamax Plus GB022",boiler,84,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logamax Plus GB022",boiler,84,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logamax Plus GB022",boiler,84,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logamax Plus GB022",boiler,84,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logamax Plus GB022",boiler,84,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logamax Plus GB022",boiler,84,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logamax Plus GB022",boiler,84,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logamax Plus GB022",boiler,84,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logamax Plus GB022",boiler,84,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logamax Plus GB022",boiler,84,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logamax Plus GB022",boiler,84,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logamax Plus GB022",boiler,84,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logamax Plus GB022",boiler,84,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logamax Plus GB022",boiler,84,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logamax Plus GB022",boiler,84,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logamax Plus GB022",boiler,84,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logamax Plus GB022",boiler,84,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logamax Plus GB022",boiler,84,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logamax Plus GB022",boiler,84,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logamax Plus GB022",boiler,84,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logamax Plus GB022",boiler,84,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logamax Plus GB022",boiler,84,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logamax Plus GB022",boiler,84,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logamax Plus GB022",boiler,84,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logamax Plus GB022",boiler,84,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logamax Plus GB022",boiler,84,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logamax Plus GB022",boiler,84,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logamax Plus GB022",boiler,84,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logamax Plus GB022",boiler,84,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logamax Plus GB022",boiler,84,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logamax Plus GB022",boiler,84,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logamax Plus GB022",boiler,84,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logamax Plus GB022",boiler,84,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logamax Plus GB022",boiler,84,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logamax Plus GB022",boiler,84,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logamax Plus GB022",boiler,84,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logamax Plus GB022",boiler,84,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logamax Plus GB022",boiler,84,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logamax Plus GB022",boiler,84,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logamax Plus GB022",boiler,84,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logamax Plus GB022",boiler,84,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logamax Plus GB022",boiler,84,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logamax Plus GB022",boiler,84,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logamax Plus GB022",boiler,84,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logamax Plus GB022",boiler,84,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logamax Plus GB022",boiler,84,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logamax Plus GB022",boiler,84,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logamax Plus GB022",boiler,84,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logamax Plus GB022",boiler,84,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logamax Plus GB022",boiler,84,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logamax Plus GB022",boiler,84,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logamax Plus GB022",boiler,84,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logamax Plus GB022",boiler,84,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logamax Plus GB022",boiler,84,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logamax Plus GB022",boiler,84,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logamax Plus GB022",boiler,84,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logamax Plus GB022",boiler,84,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logamax Plus GB022",boiler,84,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logamax Plus GB022",boiler,84,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logamax Plus GB022",boiler,84,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logamax Plus GB022",boiler,84,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logamax Plus GB022",boiler,84,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logamax Plus GB022",boiler,84,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logamax Plus GB022",boiler,84,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logamax Plus GB022",boiler,84,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logamax Plus GB022",boiler,84,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logamax Plus GB022",boiler,84,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logamax Plus GB022",boiler,84,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logamax Plus GB022",boiler,84,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logamax Plus GB022",boiler,84,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logamax Plus GB022",boiler,84,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logamax Plus GB022",boiler,84,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logamax Plus GB022",boiler,84,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logamax Plus GB022",boiler,84,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logamax Plus GB022",boiler,84,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logamax Plus GB022",boiler,84,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logamax Plus GB022",boiler,84,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logamax Plus GB022",boiler,84,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logamax Plus GB022",boiler,84,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logamax Plus GB022",boiler,84,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logamax Plus GB022",boiler,84,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logamax Plus GB022",boiler,84,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logamax Plus GB022",boiler,84,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logamax Plus GB022",boiler,84,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logamax Plus GB022",boiler,84,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logamax Plus GB022",boiler,84,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logamax Plus GB022",boiler,84,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logamax Plus GB022",boiler,84,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logamax Plus GB022",boiler,84,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logamax Plus GB022",boiler,84,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logamax Plus GB022",boiler,84,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logamax Plus GB022",boiler,84,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logamax Plus GB022",boiler,84,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logamax Plus GB022",boiler,84,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logamax Plus GB022",boiler,84,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logamax Plus GB022",boiler,84,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logamax Plus GB022",boiler,84,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logamax Plus GB022",boiler,84,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Topline, GB162",boiler,115,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Topline, GB162",boiler,115,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Topline, GB162",boiler,115,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Topline, GB162",boiler,115,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Topline, GB162",boiler,115,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Topline, GB162",boiler,115,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Topline, GB162",boiler,115,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Topline, GB162",boiler,115,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Topline, GB162",boiler,115,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Topline, GB162",boiler,115,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Topline, GB162",boiler,115,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Topline, GB162",boiler,115,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Topline, GB162",boiler,115,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Topline, GB162",boiler,115,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Topline, GB162",boiler,115,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Topline, GB162",boiler,115,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Topline, GB162",boiler,115,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Topline, GB162",boiler,115,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Topline, GB162",boiler,115,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Topline, GB162",boiler,115,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Topline, GB162",boiler,115,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Topline, GB162",boiler,115,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Topline, GB162",boiler,115,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Topline, GB162",boiler,115,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Topline, GB162",boiler,115,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Topline, GB162",boiler,115,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Topline, GB162",boiler,115,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Topline, GB162",boiler,115,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Topline, GB162",boiler,115,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Topline, GB162",boiler,115,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Topline, GB162",boiler,115,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Topline, GB162",boiler,115,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Topline, GB162",boiler,115,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Topline, GB162",boiler,115,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Topline, GB162",boiler,115,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Topline, GB162",boiler,115,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Topline, GB162",boiler,115,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Topline, GB162",boiler,115,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Topline, GB162",boiler,115,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Topline, GB162",boiler,115,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Topline, GB162",boiler,115,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Topline, GB162",boiler,115,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Topline, GB162",boiler,115,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Topline, GB162",boiler,115,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Topline, GB162",boiler,115,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Topline, GB162",boiler,115,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Topline, GB162",boiler,115,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Topline, GB162",boiler,115,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Topline, GB162",boiler,115,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Topline, GB162",boiler,115,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Topline, GB162",boiler,115,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Topline, GB162",boiler,115,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Topline, GB162",boiler,115,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Topline, GB162",boiler,115,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Topline, GB162",boiler,115,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Topline, GB162",boiler,115,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Topline, GB162",boiler,115,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Topline, GB162",boiler,115,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Topline, GB162",boiler,115,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Topline, GB162",boiler,115,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Topline, GB162",boiler,115,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Topline, GB162",boiler,115,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Topline, GB162",boiler,115,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Topline, GB162",boiler,115,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Topline, GB162",boiler,115,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Topline, GB162",boiler,115,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Topline, GB162",boiler,115,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Topline, GB162",boiler,115,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Topline, GB162",boiler,115,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Topline, GB162",boiler,115,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Topline, GB162",boiler,115,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Topline, GB162",boiler,115,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Topline, GB162",boiler,115,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Topline, GB162",boiler,115,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Topline, GB162",boiler,115,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Topline, GB162",boiler,115,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Topline, GB162",boiler,115,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Topline, GB162",boiler,115,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Topline, GB162",boiler,115,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Topline, GB162",boiler,115,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Topline, GB162",boiler,115,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Topline, GB162",boiler,115,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Topline, GB162",boiler,115,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Topline, GB162",boiler,115,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Topline, GB162",boiler,115,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Topline, GB162",boiler,115,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Topline, GB162",boiler,115,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Topline, GB162",boiler,115,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Topline, GB162",boiler,115,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Topline, GB162",boiler,115,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Topline, GB162",boiler,115,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Topline, GB162",boiler,115,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Topline, GB162",boiler,115,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Topline, GB162",boiler,115,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Topline, GB162",boiler,115,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Topline, GB162",boiler,115,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Topline, GB162",boiler,115,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Topline, GB162",boiler,115,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Topline, GB162",boiler,115,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Topline, GB162",boiler,115,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Topline, GB162",boiler,115,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Topline, GB162",boiler,115,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Topline, GB162",boiler,115,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Topline, GB162",boiler,115,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Topline, GB162",boiler,115,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Topline, GB162",boiler,115,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Topline, GB162",boiler,115,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Topline, GB162",boiler,115,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Topline, GB162",boiler,115,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Topline, GB162",boiler,115,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Topline, GB162",boiler,115,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Topline, GB162",boiler,115,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Topline, GB162",boiler,115,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Topline, GB162",boiler,115,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Cascade MCM10",boiler,121,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Cascade MCM10",boiler,121,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Cascade MCM10",boiler,121,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Cascade MCM10",boiler,121,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Cascade MCM10",boiler,121,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Cascade MCM10",boiler,121,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Cascade MCM10",boiler,121,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Cascade MCM10",boiler,121,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Cascade MCM10",boiler,121,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Cascade MCM10",boiler,121,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Cascade MCM10",boiler,121,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Cascade MCM10",boiler,121,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Cascade MCM10",boiler,121,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Cascade MCM10",boiler,121,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Cascade MCM10",boiler,121,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Cascade MCM10",boiler,121,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Cascade MCM10",boiler,121,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Cascade MCM10",boiler,121,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Cascade MCM10",boiler,121,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Cascade MCM10",boiler,121,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Cascade MCM10",boiler,121,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Cascade MCM10",boiler,121,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Cascade MCM10",boiler,121,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Cascade MCM10",boiler,121,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Cascade MCM10",boiler,121,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Cascade MCM10",boiler,121,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Cascade MCM10",boiler,121,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Cascade MCM10",boiler,121,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Cascade MCM10",boiler,121,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Cascade MCM10",boiler,121,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Cascade MCM10",boiler,121,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Cascade MCM10",boiler,121,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Cascade MCM10",boiler,121,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Cascade MCM10",boiler,121,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Cascade MCM10",boiler,121,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Cascade MCM10",boiler,121,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Cascade MCM10",boiler,121,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Cascade MCM10",boiler,121,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Cascade MCM10",boiler,121,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Cascade MCM10",boiler,121,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Cascade MCM10",boiler,121,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Cascade MCM10",boiler,121,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Cascade MCM10",boiler,121,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Cascade MCM10",boiler,121,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Cascade MCM10",boiler,121,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Cascade MCM10",boiler,121,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Cascade MCM10",boiler,121,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Cascade MCM10",boiler,121,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Cascade MCM10",boiler,121,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Cascade MCM10",boiler,121,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Cascade MCM10",boiler,121,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Cascade MCM10",boiler,121,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Cascade MCM10",boiler,121,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Cascade MCM10",boiler,121,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Cascade MCM10",boiler,121,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Cascade MCM10",boiler,121,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Cascade MCM10",boiler,121,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Cascade MCM10",boiler,121,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Cascade MCM10",boiler,121,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Cascade MCM10",boiler,121,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Cascade MCM10",boiler,121,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Cascade MCM10",boiler,121,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Cascade MCM10",boiler,121,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Cascade MCM10",boiler,121,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Cascade MCM10",boiler,121,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Cascade MCM10",boiler,121,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Cascade MCM10",boiler,121,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Cascade MCM10",boiler,121,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Cascade MCM10",boiler,121,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Cascade MCM10",boiler,121,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Cascade MCM10",boiler,121,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Cascade MCM10",boiler,121,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Cascade MCM10",boiler,121,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Cascade MCM10",boiler,121,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Cascade MCM10",boiler,121,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Cascade MCM10",boiler,121,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Cascade MCM10",boiler,121,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Cascade MCM10",boiler,121,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Cascade MCM10",boiler,121,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Cascade MCM10",boiler,121,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Cascade MCM10",boiler,121,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Cascade MCM10",boiler,121,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Cascade MCM10",boiler,121,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Cascade MCM10",boiler,121,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Cascade MCM10",boiler,121,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Cascade MCM10",boiler,121,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Cascade MCM10",boiler,121,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Cascade MCM10",boiler,121,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Cascade MCM10",boiler,121,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Cascade MCM10",boiler,121,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Cascade MCM10",boiler,121,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Cascade MCM10",boiler,121,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Cascade MCM10",boiler,121,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Cascade MCM10",boiler,121,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Cascade MCM10",boiler,121,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Cascade MCM10",boiler,121,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Cascade MCM10",boiler,121,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Cascade MCM10",boiler,121,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Cascade MCM10",boiler,121,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Cascade MCM10",boiler,121,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Cascade MCM10",boiler,121,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Cascade MCM10",boiler,121,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Cascade MCM10",boiler,121,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Cascade MCM10",boiler,121,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Cascade MCM10",boiler,121,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Cascade MCM10",boiler,121,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Cascade MCM10",boiler,121,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Cascade MCM10",boiler,121,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Cascade MCM10",boiler,121,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Cascade MCM10",boiler,121,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Cascade MCM10",boiler,121,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Cascade MCM10",boiler,121,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Cascade MCM10",boiler,121,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Cascade MCM10",boiler,121,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Proline",boiler,122,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Proline",boiler,122,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Proline",boiler,122,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Proline",boiler,122,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Proline",boiler,122,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Proline",boiler,122,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Proline",boiler,122,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Proline",boiler,122,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Proline",boiler,122,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Proline",boiler,122,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Proline",boiler,122,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Proline",boiler,122,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Proline",boiler,122,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Proline",boiler,122,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Proline",boiler,122,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Proline",boiler,122,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Proline",boiler,122,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Proline",boiler,122,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Proline",boiler,122,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Proline",boiler,122,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Proline",boiler,122,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Proline",boiler,122,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Proline",boiler,122,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Proline",boiler,122,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Proline",boiler,122,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Proline",boiler,122,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Proline",boiler,122,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Proline",boiler,122,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Proline",boiler,122,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Proline",boiler,122,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Proline",boiler,122,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Proline",boiler,122,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Proline",boiler,122,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Proline",boiler,122,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Proline",boiler,122,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Proline",boiler,122,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Proline",boiler,122,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Proline",boiler,122,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Proline",boiler,122,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Proline",boiler,122,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Proline",boiler,122,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Proline",boiler,122,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Proline",boiler,122,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Proline",boiler,122,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Proline",boiler,122,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Proline",boiler,122,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Proline",boiler,122,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Proline",boiler,122,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Proline",boiler,122,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Proline",boiler,122,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Proline",boiler,122,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Proline",boiler,122,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Proline",boiler,122,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Proline",boiler,122,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Proline",boiler,122,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Proline",boiler,122,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Proline",boiler,122,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Proline",boiler,122,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Proline",boiler,122,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Proline",boiler,122,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Proline",boiler,122,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Proline",boiler,122,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Proline",boiler,122,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Proline",boiler,122,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Proline",boiler,122,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Proline",boiler,122,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Proline",boiler,122,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Proline",boiler,122,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Proline",boiler,122,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Proline",boiler,122,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Proline",boiler,122,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Proline",boiler,122,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Proline",boiler,122,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Proline",boiler,122,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Proline",boiler,122,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Proline",boiler,122,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Proline",boiler,122,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Proline",boiler,122,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Proline",boiler,122,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Proline",boiler,122,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Proline",boiler,122,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Proline",boiler,122,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Proline",boiler,122,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Proline",boiler,122,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Proline",boiler,122,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Proline",boiler,122,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Proline",boiler,122,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Proline",boiler,122,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Proline",boiler,122,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Proline",boiler,122,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Proline",boiler,122,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Proline",boiler,122,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Proline",boiler,122,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Proline",boiler,122,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Proline",boiler,122,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Proline",boiler,122,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Proline",boiler,122,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Proline",boiler,122,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Proline",boiler,122,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Proline",boiler,122,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Proline",boiler,122,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Proline",boiler,122,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Proline",boiler,122,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Proline",boiler,122,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Proline",boiler,122,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Proline",boiler,122,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Proline",boiler,122,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Proline",boiler,122,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Proline",boiler,122,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Proline",boiler,122,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Proline",boiler,122,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Proline",boiler,122,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Proline",boiler,122,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Proline",boiler,122,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"GB212",boiler,131,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"GB212",boiler,131,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"GB212",boiler,131,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"GB212",boiler,131,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"GB212",boiler,131,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"GB212",boiler,131,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"GB212",boiler,131,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"GB212",boiler,131,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"GB212",boiler,131,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"GB212",boiler,131,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"GB212",boiler,131,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"GB212",boiler,131,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"GB212",boiler,131,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"GB212",boiler,131,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"GB212",boiler,131,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"GB212",boiler,131,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"GB212",boiler,131,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"GB212",boiler,131,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"GB212",boiler,131,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"GB212",boiler,131,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"GB212",boiler,131,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"GB212",boiler,131,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"GB212",boiler,131,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"GB212",boiler,131,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"GB212",boiler,131,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"GB212",boiler,131,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"GB212",boiler,131,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"GB212",boiler,131,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"GB212",boiler,131,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"GB212",boiler,131,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"GB212",boiler,131,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"GB212",boiler,131,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"GB212",boiler,131,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"GB212",boiler,131,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"GB212",boiler,131,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"GB212",boiler,131,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"GB212",boiler,131,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"GB212",boiler,131,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"GB212",boiler,131,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"GB212",boiler,131,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"GB212",boiler,131,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"GB212",boiler,131,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"GB212",boiler,131,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"GB212",boiler,131,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"GB212",boiler,131,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"GB212",boiler,131,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"GB212",boiler,131,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"GB212",boiler,131,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"GB212",boiler,131,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"GB212",boiler,131,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"GB212",boiler,131,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"GB212",boiler,131,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"GB212",boiler,131,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"GB212",boiler,131,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"GB212",boiler,131,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"GB212",boiler,131,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"GB212",boiler,131,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"GB212",boiler,131,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"GB212",boiler,131,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"GB212",boiler,131,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"GB212",boiler,131,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"GB212",boiler,131,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"GB212",boiler,131,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"GB212",boiler,131,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"GB212",boiler,131,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"GB212",boiler,131,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"GB212",boiler,131,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"GB212",boiler,131,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"GB212",boiler,131,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"GB212",boiler,131,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"GB212",boiler,131,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"GB212",boiler,131,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"GB212",boiler,131,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"GB212",boiler,131,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"GB212",boiler,131,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"GB212",boiler,131,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"GB212",boiler,131,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"GB212",boiler,131,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"GB212",boiler,131,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"GB212",boiler,131,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"GB212",boiler,131,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"GB212",boiler,131,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"GB212",boiler,131,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"GB212",boiler,131,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"GB212",boiler,131,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"GB212",boiler,131,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"GB212",boiler,131,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"GB212",boiler,131,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"GB212",boiler,131,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"GB212",boiler,131,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"GB212",boiler,131,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"GB212",boiler,131,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"GB212",boiler,131,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"GB212",boiler,131,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"GB212",boiler,131,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"GB212",boiler,131,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"GB212",boiler,131,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"GB212",boiler,131,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"GB212",boiler,131,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"GB212",boiler,131,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"GB212",boiler,131,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"GB212",boiler,131,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"GB212",boiler,131,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"GB212",boiler,131,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"GB212",boiler,131,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"GB212",boiler,131,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"GB212",boiler,131,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"GB212",boiler,131,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"GB212",boiler,131,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"GB212",boiler,131,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"GB212",boiler,131,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"GB212",boiler,131,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"GB212",boiler,131,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"GB212",boiler,131,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"GC7000F",boiler,132,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"GC7000F",boiler,132,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"GC7000F",boiler,132,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"GC7000F",boiler,132,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"GC7000F",boiler,132,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"GC7000F",boiler,132,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"GC7000F",boiler,132,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"GC7000F",boiler,132,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"GC7000F",boiler,132,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"GC7000F",boiler,132,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"GC7000F",boiler,132,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"GC7000F",boiler,132,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"GC7000F",boiler,132,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"GC7000F",boiler,132,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"GC7000F",boiler,132,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"GC7000F",boiler,132,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"GC7000F",boiler,132,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"GC7000F",boiler,132,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"GC7000F",boiler,132,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"GC7000F",boiler,132,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"GC7000F",boiler,132,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"GC7000F",boiler,132,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"GC7000F",boiler,132,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"GC7000F",boiler,132,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"GC7000F",boiler,132,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"GC7000F",boiler,132,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"GC7000F",boiler,132,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"GC7000F",boiler,132,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"GC7000F",boiler,132,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"GC7000F",boiler,132,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"GC7000F",boiler,132,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"GC7000F",boiler,132,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"GC7000F",boiler,132,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"GC7000F",boiler,132,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"GC7000F",boiler,132,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"GC7000F",boiler,132,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"GC7000F",boiler,132,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"GC7000F",boiler,132,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"GC7000F",boiler,132,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"GC7000F",boiler,132,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"GC7000F",boiler,132,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"GC7000F",boiler,132,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"GC7000F",boiler,132,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"GC7000F",boiler,132,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"GC7000F",boiler,132,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"GC7000F",boiler,132,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"GC7000F",boiler,132,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"GC7000F",boiler,132,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"GC7000F",boiler,132,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"GC7000F",boiler,132,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"GC7000F",boiler,132,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"GC7000F",boiler,132,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"GC7000F",boiler,132,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"GC7000F",boiler,132,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"GC7000F",boiler,132,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"GC7000F",boiler,132,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"GC7000F",boiler,132,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"GC7000F",boiler,132,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"GC7000F",boiler,132,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"GC7000F",boiler,132,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"GC7000F",boiler,132,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"GC7000F",boiler,132,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"GC7000F",boiler,132,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"GC7000F",boiler,132,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"GC7000F",boiler,132,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"GC7000F",boiler,132,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"GC7000F",boiler,132,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"GC7000F",boiler,132,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"GC7000F",boiler,132,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"GC7000F",boiler,132,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"GC7000F",boiler,132,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"GC7000F",boiler,132,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"GC7000F",boiler,132,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"GC7000F",boiler,132,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"GC7000F",boiler,132,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"GC7000F",boiler,132,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"GC7000F",boiler,132,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"GC7000F",boiler,132,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"GC7000F",boiler,132,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"GC7000F",boiler,132,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"GC7000F",boiler,132,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"GC7000F",boiler,132,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"GC7000F",boiler,132,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"GC7000F",boiler,132,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"GC7000F",boiler,132,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"GC7000F",boiler,132,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"GC7000F",boiler,132,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"GC7000F",boiler,132,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"GC7000F",boiler,132,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"GC7000F",boiler,132,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"GC7000F",boiler,132,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"GC7000F",boiler,132,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"GC7000F",boiler,132,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"GC7000F",boiler,132,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"GC7000F",boiler,132,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"GC7000F",boiler,132,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"GC7000F",boiler,132,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"GC7000F",boiler,132,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"GC7000F",boiler,132,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"GC7000F",boiler,132,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"GC7000F",boiler,132,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"GC7000F",boiler,132,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"GC7000F",boiler,132,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"GC7000F",boiler,132,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"GC7000F",boiler,132,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"GC7000F",boiler,132,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"GC7000F",boiler,132,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"GC7000F",boiler,132,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"GC7000F",boiler,132,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"GC7000F",boiler,132,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"GC7000F",boiler,132,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"GC7000F",boiler,132,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"GC7000F",boiler,132,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"GC7000F",boiler,132,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Greenstar 30Ri Compact",boiler,154,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Greenstar 30Ri Compact",boiler,154,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Greenstar 30Ri Compact",boiler,154,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Greenstar 30Ri Compact",boiler,154,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Greenstar 30Ri Compact",boiler,154,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Greenstar 30Ri Compact",boiler,154,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Greenstar 30Ri Compact",boiler,154,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Greenstar 30Ri Compact",boiler,154,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Greenstar 30Ri Compact",boiler,154,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Greenstar 30Ri Compact",boiler,154,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Greenstar 30Ri Compact",boiler,154,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Greenstar 30Ri Compact",boiler,154,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Greenstar 30Ri Compact",boiler,154,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Greenstar 30Ri Compact",boiler,154,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Greenstar 30Ri Compact",boiler,154,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Greenstar 30Ri Compact",boiler,154,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Greenstar 30Ri Compact",boiler,154,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Greenstar 30Ri Compact",boiler,154,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Greenstar 30Ri Compact",boiler,154,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Greenstar 30Ri Compact",boiler,154,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Greenstar 30Ri Compact",boiler,154,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Greenstar 30Ri Compact",boiler,154,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Greenstar 30Ri Compact",boiler,154,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Greenstar 30Ri Compact",boiler,154,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Greenstar 30Ri Compact",boiler,154,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Greenstar 30Ri Compact",boiler,154,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Greenstar 30Ri Compact",boiler,154,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Greenstar 30Ri Compact",boiler,154,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Greenstar 30Ri Compact",boiler,154,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Greenstar 30Ri Compact",boiler,154,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Greenstar 30Ri Compact",boiler,154,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Greenstar 30Ri Compact",boiler,154,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Greenstar 30Ri Compact",boiler,154,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Greenstar 30Ri Compact",boiler,154,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Greenstar 30Ri Compact",boiler,154,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Greenstar 30Ri Compact",boiler,154,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Greenstar 30Ri Compact",boiler,154,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Greenstar 30Ri Compact",boiler,154,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Greenstar 30Ri Compact",boiler,154,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Greenstar 30Ri Compact",boiler,154,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Greenstar 30Ri Compact",boiler,154,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Greenstar 30Ri Compact",boiler,154,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Greenstar 30Ri Compact",boiler,154,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Greenstar 30Ri Compact",boiler,154,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Greenstar 30Ri Compact",boiler,154,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Greenstar 30Ri Compact",boiler,154,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Greenstar 30Ri Compact",boiler,154,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Greenstar 30Ri Compact",boiler,154,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Greenstar 30Ri Compact",boiler,154,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Greenstar 30Ri Compact",boiler,154,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Greenstar 30Ri Compact",boiler,154,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Greenstar 30Ri Compact",boiler,154,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Greenstar 30Ri Compact",boiler,154,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Greenstar 30Ri Compact",boiler,154,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Greenstar 30Ri Compact",boiler,154,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Greenstar 30Ri Compact",boiler,154,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Greenstar 30Ri Compact",boiler,154,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Greenstar 30Ri Compact",boiler,154,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Greenstar 30Ri Compact",boiler,154,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Greenstar 30Ri Compact",boiler,154,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Greenstar 30Ri Compact",boiler,154,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Greenstar 30Ri Compact",boiler,154,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Greenstar 30Ri Compact",boiler,154,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Greenstar 30Ri Compact",boiler,154,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Greenstar 30Ri Compact",boiler,154,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Greenstar 30Ri Compact",boiler,154,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Greenstar 30Ri Compact",boiler,154,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Greenstar 30Ri Compact",boiler,154,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Greenstar 30Ri Compact",boiler,154,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Greenstar 30Ri Compact",boiler,154,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Greenstar 30Ri Compact",boiler,154,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Greenstar 30Ri Compact",boiler,154,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Greenstar 30Ri Compact",boiler,154,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Greenstar 30Ri Compact",boiler,154,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Greenstar 30Ri Compact",boiler,154,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Greenstar 30Ri Compact",boiler,154,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Greenstar 30Ri Compact",boiler,154,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Greenstar 30Ri Compact",boiler,154,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Greenstar 30Ri Compact",boiler,154,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Greenstar 30Ri Compact",boiler,154,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Greenstar 30Ri Compact",boiler,154,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Greenstar 30Ri Compact",boiler,154,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Greenstar 30Ri Compact",boiler,154,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Greenstar 30Ri Compact",boiler,154,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Greenstar 30Ri Compact",boiler,154,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Greenstar 30Ri Compact",boiler,154,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Greenstar 30Ri Compact",boiler,154,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Greenstar 30Ri Compact",boiler,154,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Greenstar 30Ri Compact",boiler,154,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Greenstar 30Ri Compact",boiler,154,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Greenstar 30Ri Compact",boiler,154,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Greenstar 30Ri Compact",boiler,154,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Greenstar 30Ri Compact",boiler,154,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Greenstar 30Ri Compact",boiler,154,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Greenstar 30Ri Compact",boiler,154,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Greenstar 30Ri Compact",boiler,154,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Greenstar 30Ri Compact",boiler,154,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Greenstar 30Ri Compact",boiler,154,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Greenstar 30Ri Compact",boiler,154,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Greenstar 30Ri Compact",boiler,154,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Greenstar 30Ri Compact",boiler,154,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Greenstar 30Ri Compact",boiler,154,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Greenstar 30Ri Compact",boiler,154,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Greenstar 30Ri Compact",boiler,154,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Greenstar 30Ri Compact",boiler,154,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Greenstar 30Ri Compact",boiler,154,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Greenstar 30Ri Compact",boiler,154,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Greenstar 30Ri Compact",boiler,154,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Greenstar 30Ri Compact",boiler,154,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Greenstar 30Ri Compact",boiler,154,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Greenstar 30Ri Compact",boiler,154,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Greenstar 30Ri Compact",boiler,154,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Greenstar 30Ri Compact",boiler,154,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Greenstar 30Ri Compact",boiler,154,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Suprapur-o",boiler,155,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Suprapur-o",boiler,155,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Suprapur-o",boiler,155,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Suprapur-o",boiler,155,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Suprapur-o",boiler,155,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Suprapur-o",boiler,155,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Suprapur-o",boiler,155,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Suprapur-o",boiler,155,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Suprapur-o",boiler,155,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Suprapur-o",boiler,155,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Suprapur-o",boiler,155,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Suprapur-o",boiler,155,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Suprapur-o",boiler,155,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Suprapur-o",boiler,155,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Suprapur-o",boiler,155,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Suprapur-o",boiler,155,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Suprapur-o",boiler,155,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Suprapur-o",boiler,155,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Suprapur-o",boiler,155,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Suprapur-o",boiler,155,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Suprapur-o",boiler,155,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Suprapur-o",boiler,155,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Suprapur-o",boiler,155,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Suprapur-o",boiler,155,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Suprapur-o",boiler,155,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Suprapur-o",boiler,155,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Suprapur-o",boiler,155,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Suprapur-o",boiler,155,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Suprapur-o",boiler,155,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Suprapur-o",boiler,155,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Suprapur-o",boiler,155,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Suprapur-o",boiler,155,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Suprapur-o",boiler,155,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Suprapur-o",boiler,155,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Suprapur-o",boiler,155,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Suprapur-o",boiler,155,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Suprapur-o",boiler,155,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Suprapur-o",boiler,155,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Suprapur-o",boiler,155,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Suprapur-o",boiler,155,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Suprapur-o",boiler,155,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Suprapur-o",boiler,155,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Suprapur-o",boiler,155,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Suprapur-o",boiler,155,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Suprapur-o",boiler,155,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Suprapur-o",boiler,155,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Suprapur-o",boiler,155,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Suprapur-o",boiler,155,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Suprapur-o",boiler,155,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Suprapur-o",boiler,155,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Suprapur-o",boiler,155,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Suprapur-o",boiler,155,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Suprapur-o",boiler,155,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Suprapur-o",boiler,155,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Suprapur-o",boiler,155,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Suprapur-o",boiler,155,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Suprapur-o",boiler,155,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Suprapur-o",boiler,155,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Suprapur-o",boiler,155,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Suprapur-o",boiler,155,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Suprapur-o",boiler,155,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Suprapur-o",boiler,155,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Suprapur-o",boiler,155,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Suprapur-o",boiler,155,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Suprapur-o",boiler,155,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Suprapur-o",boiler,155,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Suprapur-o",boiler,155,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Suprapur-o",boiler,155,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Suprapur-o",boiler,155,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Suprapur-o",boiler,155,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Suprapur-o",boiler,155,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Suprapur-o",boiler,155,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Suprapur-o",boiler,155,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Suprapur-o",boiler,155,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Suprapur-o",boiler,155,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Suprapur-o",boiler,155,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Suprapur-o",boiler,155,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Suprapur-o",boiler,155,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Suprapur-o",boiler,155,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Suprapur-o",boiler,155,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Suprapur-o",boiler,155,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Suprapur-o",boiler,155,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Suprapur-o",boiler,155,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Suprapur-o",boiler,155,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Suprapur-o",boiler,155,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Suprapur-o",boiler,155,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Suprapur-o",boiler,155,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Suprapur-o",boiler,155,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Suprapur-o",boiler,155,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Suprapur-o",boiler,155,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Suprapur-o",boiler,155,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Suprapur-o",boiler,155,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Suprapur-o",boiler,155,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Suprapur-o",boiler,155,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Suprapur-o",boiler,155,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Suprapur-o",boiler,155,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Suprapur-o",boiler,155,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Suprapur-o",boiler,155,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Suprapur-o",boiler,155,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Suprapur-o",boiler,155,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Suprapur-o",boiler,155,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Suprapur-o",boiler,155,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Suprapur-o",boiler,155,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Suprapur-o",boiler,155,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Suprapur-o",boiler,155,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Suprapur-o",boiler,155,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Suprapur-o",boiler,155,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Suprapur-o",boiler,155,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Suprapur-o",boiler,155,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Suprapur-o",boiler,155,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Suprapur-o",boiler,155,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Suprapur-o",boiler,155,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Suprapur-o",boiler,155,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Suprapur-o",boiler,155,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Cerapur Aero",boiler,167,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Cerapur Aero",boiler,167,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Cerapur Aero",boiler,167,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Cerapur Aero",boiler,167,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Cerapur Aero",boiler,167,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Cerapur Aero",boiler,167,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Cerapur Aero",boiler,167,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Cerapur Aero",boiler,167,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Cerapur Aero",boiler,167,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Cerapur Aero",boiler,167,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Cerapur Aero",boiler,167,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Cerapur Aero",boiler,167,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Cerapur Aero",boiler,167,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Cerapur Aero",boiler,167,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Cerapur Aero",boiler,167,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Cerapur Aero",boiler,167,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Cerapur Aero",boiler,167,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Cerapur Aero",boiler,167,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Cerapur Aero",boiler,167,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Cerapur Aero",boiler,167,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Cerapur Aero",boiler,167,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Cerapur Aero",boiler,167,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Cerapur Aero",boiler,167,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Cerapur Aero",boiler,167,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Cerapur Aero",boiler,167,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Cerapur Aero",boiler,167,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Cerapur Aero",boiler,167,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Cerapur Aero",boiler,167,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Cerapur Aero",boiler,167,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Cerapur Aero",boiler,167,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Cerapur Aero",boiler,167,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Cerapur Aero",boiler,167,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Cerapur Aero",boiler,167,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Cerapur Aero",boiler,167,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Cerapur Aero",boiler,167,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Cerapur Aero",boiler,167,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Cerapur Aero",boiler,167,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Cerapur Aero",boiler,167,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Cerapur Aero",boiler,167,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Cerapur Aero",boiler,167,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Cerapur Aero",boiler,167,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Cerapur Aero",boiler,167,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Cerapur Aero",boiler,167,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Cerapur Aero",boiler,167,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Cerapur Aero",boiler,167,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Cerapur Aero",boiler,167,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Cerapur Aero",boiler,167,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Cerapur Aero",boiler,167,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Cerapur Aero",boiler,167,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Cerapur Aero",boiler,167,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Cerapur Aero",boiler,167,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Cerapur Aero",boiler,167,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Cerapur Aero",boiler,167,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Cerapur Aero",boiler,167,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Cerapur Aero",boiler,167,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Cerapur Aero",boiler,167,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Cerapur Aero",boiler,167,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Cerapur Aero",boiler,167,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Cerapur Aero",boiler,167,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Cerapur Aero",boiler,167,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Cerapur Aero",boiler,167,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Cerapur Aero",boiler,167,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Cerapur Aero",boiler,167,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Cerapur Aero",boiler,167,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Cerapur Aero",boiler,167,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Cerapur Aero",boiler,167,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Cerapur Aero",boiler,167,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Cerapur Aero",boiler,167,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Cerapur Aero",boiler,167,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Cerapur Aero",boiler,167,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Cerapur Aero",boiler,167,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Cerapur Aero",boiler,167,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Cerapur Aero",boiler,167,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Cerapur Aero",boiler,167,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Cerapur Aero",boiler,167,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Cerapur Aero",boiler,167,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Cerapur Aero",boiler,167,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Cerapur Aero",boiler,167,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Cerapur Aero",boiler,167,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Cerapur Aero",boiler,167,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Cerapur Aero",boiler,167,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Cerapur Aero",boiler,167,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Cerapur Aero",boiler,167,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Cerapur Aero",boiler,167,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Cerapur Aero",boiler,167,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Cerapur Aero",boiler,167,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Cerapur Aero",boiler,167,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Cerapur Aero",boiler,167,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Cerapur Aero",boiler,167,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Cerapur Aero",boiler,167,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Cerapur Aero",boiler,167,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Cerapur Aero",boiler,167,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Cerapur Aero",boiler,167,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Cerapur Aero",boiler,167,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Cerapur Aero",boiler,167,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Cerapur Aero",boiler,167,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Cerapur Aero",boiler,167,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Cerapur Aero",boiler,167,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Cerapur Aero",boiler,167,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Cerapur Aero",boiler,167,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Cerapur Aero",boiler,167,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Cerapur Aero",boiler,167,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Cerapur Aero",boiler,167,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Cerapur Aero",boiler,167,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Cerapur Aero",boiler,167,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Cerapur Aero",boiler,167,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Cerapur Aero",boiler,167,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Cerapur Aero",boiler,167,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Cerapur Aero",boiler,167,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Cerapur Aero",boiler,167,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Cerapur Aero",boiler,167,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Cerapur Aero",boiler,167,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Cerapur Aero",boiler,167,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Cerapur Aero",boiler,167,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Hybrid Heatpump",boiler,168,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Hybrid Heatpump",boiler,168,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Hybrid Heatpump",boiler,168,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Hybrid Heatpump",boiler,168,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Hybrid Heatpump",boiler,168,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Hybrid Heatpump",boiler,168,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Hybrid Heatpump",boiler,168,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Hybrid Heatpump",boiler,168,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Hybrid Heatpump",boiler,168,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Hybrid Heatpump",boiler,168,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Hybrid Heatpump",boiler,168,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Hybrid Heatpump",boiler,168,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Hybrid Heatpump",boiler,168,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Hybrid Heatpump",boiler,168,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Hybrid Heatpump",boiler,168,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Hybrid Heatpump",boiler,168,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Hybrid Heatpump",boiler,168,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Hybrid Heatpump",boiler,168,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Hybrid Heatpump",boiler,168,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Hybrid Heatpump",boiler,168,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Hybrid Heatpump",boiler,168,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Hybrid Heatpump",boiler,168,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Hybrid Heatpump",boiler,168,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Hybrid Heatpump",boiler,168,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Hybrid Heatpump",boiler,168,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Hybrid Heatpump",boiler,168,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Hybrid Heatpump",boiler,168,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Hybrid Heatpump",boiler,168,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Hybrid Heatpump",boiler,168,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Hybrid Heatpump",boiler,168,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Hybrid Heatpump",boiler,168,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Hybrid Heatpump",boiler,168,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Hybrid Heatpump",boiler,168,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Hybrid Heatpump",boiler,168,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Hybrid Heatpump",boiler,168,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Hybrid Heatpump",boiler,168,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Hybrid Heatpump",boiler,168,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Hybrid Heatpump",boiler,168,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Hybrid Heatpump",boiler,168,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Hybrid Heatpump",boiler,168,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Hybrid Heatpump",boiler,168,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Hybrid Heatpump",boiler,168,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Hybrid Heatpump",boiler,168,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Hybrid Heatpump",boiler,168,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Hybrid Heatpump",boiler,168,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Hybrid Heatpump",boiler,168,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Hybrid Heatpump",boiler,168,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Hybrid Heatpump",boiler,168,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Hybrid Heatpump",boiler,168,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Hybrid Heatpump",boiler,168,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Hybrid Heatpump",boiler,168,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Hybrid Heatpump",boiler,168,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Hybrid Heatpump",boiler,168,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Hybrid Heatpump",boiler,168,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Hybrid Heatpump",boiler,168,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Hybrid Heatpump",boiler,168,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Hybrid Heatpump",boiler,168,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Hybrid Heatpump",boiler,168,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Hybrid Heatpump",boiler,168,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Hybrid Heatpump",boiler,168,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Hybrid Heatpump",boiler,168,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Hybrid Heatpump",boiler,168,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Hybrid Heatpump",boiler,168,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Hybrid Heatpump",boiler,168,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Hybrid Heatpump",boiler,168,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Hybrid Heatpump",boiler,168,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Hybrid Heatpump",boiler,168,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Hybrid Heatpump",boiler,168,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Hybrid Heatpump",boiler,168,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Hybrid Heatpump",boiler,168,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Hybrid Heatpump",boiler,168,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Hybrid Heatpump",boiler,168,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Hybrid Heatpump",boiler,168,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Hybrid Heatpump",boiler,168,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Hybrid Heatpump",boiler,168,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Hybrid Heatpump",boiler,168,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Hybrid Heatpump",boiler,168,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Hybrid Heatpump",boiler,168,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Hybrid Heatpump",boiler,168,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Hybrid Heatpump",boiler,168,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Hybrid Heatpump",boiler,168,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Hybrid Heatpump",boiler,168,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Hybrid Heatpump",boiler,168,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Hybrid Heatpump",boiler,168,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Hybrid Heatpump",boiler,168,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Hybrid Heatpump",boiler,168,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Hybrid Heatpump",boiler,168,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Hybrid Heatpump",boiler,168,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Hybrid Heatpump",boiler,168,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Hybrid Heatpump",boiler,168,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Hybrid Heatpump",boiler,168,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Hybrid Heatpump",boiler,168,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Hybrid Heatpump",boiler,168,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Hybrid Heatpump",boiler,168,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Hybrid Heatpump",boiler,168,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Hybrid Heatpump",boiler,168,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Hybrid Heatpump",boiler,168,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Hybrid Heatpump",boiler,168,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Hybrid Heatpump",boiler,168,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Hybrid Heatpump",boiler,168,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Hybrid Heatpump",boiler,168,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Hybrid Heatpump",boiler,168,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Hybrid Heatpump",boiler,168,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Hybrid Heatpump",boiler,168,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Hybrid Heatpump",boiler,168,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Hybrid Heatpump",boiler,168,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Hybrid Heatpump",boiler,168,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Hybrid Heatpump",boiler,168,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Hybrid Heatpump",boiler,168,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Hybrid Heatpump",boiler,168,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Hybrid Heatpump",boiler,168,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Hybrid Heatpump",boiler,168,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Hybrid Heatpump",boiler,168,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Hybrid Heatpump",boiler,168,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logano GB212",boiler,170,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logano GB212",boiler,170,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logano GB212",boiler,170,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logano GB212",boiler,170,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logano GB212",boiler,170,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logano GB212",boiler,170,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logano GB212",boiler,170,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logano GB212",boiler,170,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logano GB212",boiler,170,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logano GB212",boiler,170,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logano GB212",boiler,170,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logano GB212",boiler,170,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logano GB212",boiler,170,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logano GB212",boiler,170,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logano GB212",boiler,170,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logano GB212",boiler,170,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logano GB212",boiler,170,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logano GB212",boiler,170,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logano GB212",boiler,170,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logano GB212",boiler,170,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logano GB212",boiler,170,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logano GB212",boiler,170,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logano GB212",boiler,170,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logano GB212",boiler,170,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logano GB212",boiler,170,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logano GB212",boiler,170,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logano GB212",boiler,170,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logano GB212",boiler,170,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logano GB212",boiler,170,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logano GB212",boiler,170,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logano GB212",boiler,170,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logano GB212",boiler,170,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logano GB212",boiler,170,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logano GB212",boiler,170,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logano GB212",boiler,170,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logano GB212",boiler,170,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logano GB212",boiler,170,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logano GB212",boiler,170,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logano GB212",boiler,170,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logano GB212",boiler,170,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logano GB212",boiler,170,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logano GB212",boiler,170,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logano GB212",boiler,170,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logano GB212",boiler,170,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logano GB212",boiler,170,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logano GB212",boiler,170,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logano GB212",boiler,170,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logano GB212",boiler,170,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logano GB212",boiler,170,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logano GB212",boiler,170,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logano GB212",boiler,170,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logano GB212",boiler,170,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logano GB212",boiler,170,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logano GB212",boiler,170,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logano GB212",boiler,170,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logano GB212",boiler,170,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logano GB212",boiler,170,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logano GB212",boiler,170,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logano GB212",boiler,170,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logano GB212",boiler,170,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logano GB212",boiler,170,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logano GB212",boiler,170,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logano GB212",boiler,170,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logano GB212",boiler,170,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logano GB212",boiler,170,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logano GB212",boiler,170,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logano GB212",boiler,170,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logano GB212",boiler,170,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logano GB212",boiler,170,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logano GB212",boiler,170,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logano GB212",boiler,170,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logano GB212",boiler,170,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logano GB212",boiler,170,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logano GB212",boiler,170,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logano GB212",boiler,170,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logano GB212",boiler,170,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logano GB212",boiler,170,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logano GB212",boiler,170,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logano GB212",boiler,170,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logano GB212",boiler,170,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logano GB212",boiler,170,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logano GB212",boiler,170,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logano GB212",boiler,170,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logano GB212",boiler,170,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logano GB212",boiler,170,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logano GB212",boiler,170,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logano GB212",boiler,170,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logano GB212",boiler,170,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logano GB212",boiler,170,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logano GB212",boiler,170,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logano GB212",boiler,170,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logano GB212",boiler,170,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logano GB212",boiler,170,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logano GB212",boiler,170,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logano GB212",boiler,170,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logano GB212",boiler,170,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logano GB212",boiler,170,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logano GB212",boiler,170,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logano GB212",boiler,170,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logano GB212",boiler,170,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logano GB212",boiler,170,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logano GB212",boiler,170,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logano GB212",boiler,170,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logano GB212",boiler,170,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logano GB212",boiler,170,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logano GB212",boiler,170,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logano GB212",boiler,170,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logano GB212",boiler,170,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logano GB212",boiler,170,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logano GB212",boiler,170,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logano GB212",boiler,170,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logano GB212",boiler,170,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logano GB212",boiler,170,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logano GB212",boiler,170,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_energy,sensor.boiler_dhw_nrg,5,9,1/100,0,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_heating,sensor.boiler_nrgheat,5,0,1/100,85,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgcool,energy cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_cooling,sensor.boiler_nrgcool,5,0,1/100,87,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_total,sensor.boiler_metertotal,5,0,1/100,89,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_compressor,sensor.boiler_metercomp,5,0,1/100,91,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_e-heater,sensor.boiler_metereheat,5,0,1/100,93,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/100,95,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metercool,meter cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_cooling,sensor.boiler_metercool,5,0,1/100,97,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/100,2,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimetotal,heatpump total uptime,time (>=0<=279620),minutes,false,sensor.boiler_heatpump_total_uptime,sensor.boiler_uptimetotal,5,0,1/60,99,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecontrol,total operating time heat,time (>=0<=279620),minutes,false,sensor.boiler_total_operating_time_heat,sensor.boiler_uptimecontrol,5,0,1/60,101,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecompheating,operating time compressor heating,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_heating,sensor.boiler_uptimecompheating,5,0,1/60,103,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecompcooling,operating time compressor cooling,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_cooling,sensor.boiler_uptimecompcooling,5,0,1/60,105,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.uptimecomp,operating time compressor,time (>=0<=279620),minutes,false,sensor.boiler_dhw_operating_time_compressor,sensor.boiler_dhw_uptimecomp,5,9,1/60,4,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecomppool,operating time compressor pool,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_pool,sensor.boiler_uptimecomppool,5,0,1/60,107,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,totalcompstarts,total compressor control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_total_compressor_control_starts,sensor.boiler_totalcompstarts,5,0,1,109,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_heating_control_starts,sensor.boiler_heatingstarts,5,0,1,111,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,coolingstarts,cooling control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_cooling_control_starts,sensor.boiler_coolingstarts,5,0,1,113,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts_hp,sensor.boiler_dhw_startshp,5,9,1,6,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,poolstarts,pool control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_pool_control_starts,sensor.boiler_poolstarts,5,0,1,115,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconstotal,total energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption,sensor.boiler_nrgconstotal,5,0,1,117,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscomptotal,total energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption_compressor,sensor.boiler_nrgconscomptotal,5,0,1,119,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscompheating,energy consumption compressor heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_heating,sensor.boiler_nrgconscompheating,5,0,1,121,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.nrgconscomp,energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_energy_consumption_compressor,sensor.boiler_dhw_nrgconscomp,5,9,1,8,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscompcooling,energy consumption compressor cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_cooling,sensor.boiler_nrgconscompcooling,5,0,1,123,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscomppool,energy consumption compressor pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_pool,sensor.boiler_nrgconscomppool,5,0,1,125,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxelecheatnrgconstotal,total aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_aux_elec._heater_energy_consumption,sensor.boiler_auxelecheatnrgconstotal,5,0,1,127,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxelecheatnrgconsheating,aux elec. heater energy consumption heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_heating,sensor.boiler_auxelecheatnrgconsheating,5,0,1,129,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.auxelecheatnrgcons,aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_aux_elec._heater_energy_consumption,sensor.boiler_dhw_auxelecheatnrgcons,5,9,1,10,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxelecheatnrgconspool,aux elec. heater energy consumption pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_pool,sensor.boiler_auxelecheatnrgconspool,5,0,1,131,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsupptotal,total energy supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied,sensor.boiler_nrgsupptotal,5,0,1,133,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsuppheating,total energy supplied heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_heating,sensor.boiler_nrgsuppheating,5,0,1,135,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.nrgsupp,total energy warm supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_total_energy_warm_supplied,sensor.boiler_dhw_nrgsupp,5,9,1,12,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsuppcooling,total energy supplied cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_cooling,sensor.boiler_nrgsuppcooling,5,0,1,137,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsupppool,total energy supplied pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_pool,sensor.boiler_nrgsupppool,5,0,1,139,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppower,compressor power output,uint16 (>=0<=3199),kW,false,sensor.boiler_compressor_power_output,sensor.boiler_hppower,5,0,1/10,141,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpmaxpower,compressor max power,uint8 (>=0<=100),%,true,number.boiler_compressor_max_power,number.boiler_hpmaxpower,5,0,1,142,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pvmaxcomp,pv compressor max power,uint8 (>=0<=25),kW,true,number.boiler_pv_compressor_max_power,number.boiler_pvmaxcomp,5,0,1/10,143,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,powerreduction,power reduction,uint8 (>=30<=60),%,true,number.boiler_power_reduction,number.boiler_powerreduction,5,0,10,144,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpsetdiffpress,set differential pressure,uint8 (>=150<=750),mbar,true,number.boiler_set_differential_pressure,number.boiler_hpsetdiffpress,5,0,50,145,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcompon,hp compressor,boolean, ,false,binary_sensor.boiler_hp_compressor,binary_sensor.boiler_hpcompon,5,0,1,146,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpactivity,compressor activity,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_compressor_activity,sensor.boiler_hpactivity,5,0,1,147,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpbrinepumpspd,brine pump speed,uint8 (>=0<=100),%,false,sensor.boiler_brine_pump_speed,sensor.boiler_hpbrinepumpspd,5,0,1,148,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpswitchvalve,switch valve,boolean, ,false,binary_sensor.boiler_switch_valve,binary_sensor.boiler_hpswitchvalve,5,0,1,149,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_speed,sensor.boiler_hpcompspd,5,0,1,150,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcircspd,circulation pump speed,uint8 (>=0<=100),%,false,sensor.boiler_circulation_pump_speed,sensor.boiler_hpcircspd,5,0,1,151,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpbrinein,brine in/evaporator,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_in/evaporator,sensor.boiler_hpbrinein,5,0,1/10,152,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpbrineout,brine out/condenser,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_out/condenser,sensor.boiler_hpbrineout,5,0,1/10,153,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptc0,heat carrier return (TC0),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_return_(TC0),sensor.boiler_hptc0,5,0,1/10,154,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptc1,heat carrier forward (TC1),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_forward_(TC1),sensor.boiler_hptc1,5,0,1/10,155,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptc3,condenser temperature (TC3),int16 (>=-3199<=3199),C,false,sensor.boiler_condenser_temperature_(TC3),sensor.boiler_hptc3,5,0,1/10,156,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_temperature_(TR1),sensor.boiler_hptr1,5,0,1/10,157,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.boiler_hptr3,5,0,1/10,158,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.boiler_evaporator_inlet_temperature_(TR4),sensor.boiler_hptr4,5,0,1/10,159,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_inlet_temperature_(TR5),sensor.boiler_hptr5,5,0,1/10,160,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_outlet_temperature_(TR6),sensor.boiler_hptr6,5,0,1/10,161,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr7,refrigerant temperature gas side (condenser input) (TR7),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_gas_side_(condenser_input)_(TR7),sensor.boiler_hptr7,5,0,1/10,162,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.boiler_air_inlet_temperature_(TL2),sensor.boiler_hptl2,5,0,1/10,163,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.boiler_low_pressure_side_temperature_(PL1),sensor.boiler_hppl1,5,0,1/10,164,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.boiler_high_pressure_side_temperature_(PH1),sensor.boiler_hpph1,5,0,1/10,165,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.boiler_drain_pan_temp_(TA4),sensor.boiler_hpta4,5,0,1/10,166,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptw1,reservoir temp (TW1),int16 (>=-3199<=3199),C,false,sensor.boiler_reservoir_temp_(TW1),sensor.boiler_hptw1,5,0,1/10,167,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,poolsettemp,pool set temperature,uint8 (>=0<=127),C,true,number.boiler_pool_set_temperature,number.boiler_poolsettemp,5,0,1/2,168,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hp4way,4-way valve (VR4),enum [cooling & defrost\|heating & dhw], ,false,sensor.boiler_4-way_valve_(VR4),sensor.boiler_hp4way,5,0,1,169,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin1,input 1 state,boolean, ,false,binary_sensor.boiler_input_1_state,binary_sensor.boiler_hpin1,5,0,1,170,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin1opt,input 1 options,string, ,true,sensor.boiler_input_1_options,sensor.boiler_hpin1opt,5,0,1,171,8 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin2,input 2 state,boolean, ,false,binary_sensor.boiler_input_2_state,binary_sensor.boiler_hpin2,5,0,1,179,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin2opt,input 2 options,string, ,true,sensor.boiler_input_2_options,sensor.boiler_hpin2opt,5,0,1,180,8 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin3,input 3 state,boolean, ,false,binary_sensor.boiler_input_3_state,binary_sensor.boiler_hpin3,5,0,1,188,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin3opt,input 3 options,string, ,true,sensor.boiler_input_3_options,sensor.boiler_hpin3opt,5,0,1,189,8 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin4,input 4 state,boolean, ,false,binary_sensor.boiler_input_4_state,binary_sensor.boiler_hpin4,5,0,1,197,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin4opt,input 4 options,string, ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,5,0,1,198,8 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maxheatcomp,heat limit compressor,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,5,0,1,206,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maxheatheat,heat limit heating,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,5,0,1,207,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.maxheat,heat limit,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,5,9,1,14,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,mandefrost,manual defrost,boolean, ,true,switch.boiler_manual_defrost,switch.boiler_mandefrost,5,0,1,208,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pvcooling,cooling only with PV,boolean, ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,5,0,1,209,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheateronly,aux heater only,boolean, ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,5,0,1,210,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheateroff,disable aux heater,boolean, ,true,switch.boiler_disable_aux_heater,switch.boiler_auxheateroff,5,0,1,211,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheaterstatus,aux heater status,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_aux_heater_status,sensor.boiler_auxheaterstatus,5,0,1,212,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheaterlevel,aux heater level,uint8 (>=0<=100),%,false,sensor.boiler_aux_heater_level,sensor.boiler_auxheaterlevel,5,0,1,213,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheaterdelay,aux heater on delay,uint16 (>=10<=1000),K*min,true,number.boiler_aux_heater_on_delay,number.boiler_auxheaterdelay,5,0,10,214,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxmaxlimit,aux heater max limit,uint8 (>=0<=10),K,true,number.boiler_aux_heater_max_limit,number.boiler_auxmaxlimit,5,0,1/10,215,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxlimitstart,aux heater limit start,uint8 (>=0<=10),K,true,number.boiler_aux_heater_limit_start,number.boiler_auxlimitstart,5,0,1/10,216,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheatrmode,aux heater mode,enum [eco\|comfort], ,true,select.boiler_aux_heater_mode,select.boiler_auxheatrmode,5,0,1,217,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hphystheat,on/off hyst heat,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_heat,number.boiler_hphystheat,5,0,5,218,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hphystcool,on/off hyst cool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_cool,number.boiler_hphystcool,5,0,5,219,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hphystpool,on/off hyst pool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_pool,number.boiler_hphystpool,5,0,5,220,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,silentmode,silent mode,enum [off\|auto\|on], ,true,select.boiler_silent_mode,select.boiler_silentmode,5,0,1,221,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,silentfrom,silent mode from,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_from,number.boiler_silentfrom,5,0,15,222,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,silentto,silent mode to,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_to,number.boiler_silentto,5,0,15,223,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,mintempsilent,min outside temp for silent mode,int8 (>=-126<=126),C,true,number.boiler_min_outside_temp_for_silent_mode,number.boiler_mintempsilent,5,0,1,224,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tempparmode,outside temp parallel mode,int8 (>=-126<=126),C,true,number.boiler_outside_temp_parallel_mode,number.boiler_tempparmode,5,0,1,225,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheatmix,aux heater mixing valve,int8 (>=-100<=100),%,false,sensor.boiler_aux_heater_mixing_valve,sensor.boiler_auxheatmix,5,0,1,226,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tempdiffheat,temp diff TC3/TC0 heat,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_heat,number.boiler_tempdiffheat,5,0,1/10,227,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tempdiffcool,temp diff TC3/TC0 cool,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_cool,number.boiler_tempdiffcool,5,0,1/10,228,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,vpcooling,valve/pump cooling,boolean, ,true,switch.boiler_valve/pump_cooling,switch.boiler_vpcooling,5,0,1,229,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatcable,heating cable,boolean, ,true,switch.boiler_heating_cable,switch.boiler_heatcable,5,0,1,230,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,vc0valve,VC0 valve,boolean, ,true,switch.boiler_VC0_valve,switch.boiler_vc0valve,5,0,1,231,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,primepump,primary heatpump,boolean, ,true,switch.boiler_primary_heatpump,switch.boiler_primepump,5,0,1,232,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,primepumpmod,primary heatpump modulation,uint8 (>=0<=100),%,true,number.boiler_primary_heatpump_modulation,number.boiler_primepumpmod,5,0,1,233,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hp3way,3-way valve,boolean, ,true,switch.boiler_3-way_valve,switch.boiler_hp3way,5,0,1,234,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,elheatstep1,el. heater step 1,boolean, ,true,switch.boiler_el._heater_step_1,switch.boiler_elheatstep1,5,0,1,235,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,elheatstep2,el. heater step 2,boolean, ,true,switch.boiler_el._heater_step_2,switch.boiler_elheatstep2,5,0,1,236,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,elheatstep3,el. heater step 3,boolean, ,true,switch.boiler_el._heater_step_3,switch.boiler_elheatstep3,5,0,1,237,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpea0,condensate reservoir heating (EA0),boolean, ,false,binary_sensor.boiler_condensate_reservoir_heating_(EA0),binary_sensor.boiler_hpea0,5,0,1,238,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppumpmode,primary heatpump mode,enum [auto\|continuous], ,true,select.boiler_primary_heatpump_mode,select.boiler_hppumpmode,5,0,1,239,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,fan,fan,uint8 (>=20<=100),%,true,number.boiler_fan,number.boiler_fan,5,0,1,240,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,shutdown,shutdown,cmd [off\|on], ,true,sensor.boiler_shutdown,sensor.boiler_shutdown,5,0,1,241,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcurrpower,compressor current power,uint16 (>=0<=31999),W,false,sensor.boiler_compressor_current_power,sensor.boiler_hpcurrpower,5,0,1,242,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppowerlimit,power limit,uint16 (>=0<=31999),W,true,number.boiler_power_limit,number.boiler_hppowerlimit,5,0,1,243,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.alternatingop,alternating operation,boolean, ,true,switch.boiler_dhw_alternating_operation,switch.boiler_dhw_alternatingop,5,9,1,15,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.altopprioheat,prioritise heating during dhw,uint8 (>=20<=120),minutes,true,number.boiler_dhw_prioritise_heating_during_dhw,number.boiler_dhw_altopprioheat,5,9,1,16,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.altopprio,prioritise dhw during heating,uint8 (>=30<=120),minutes,true,number.boiler_dhw_prioritise_dhw_during_heating,number.boiler_dhw_altopprio,5,9,1,17,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,5,9,1,18,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,5,9,1,19,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,5,9,1,20,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfdiff,comfort diff,uint8 (>=6<=12),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,5,9,1,21,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecodiff,eco diff,uint8 (>=6<=12),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,5,9,1,22,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusdiff,eco+ diff,uint8 (>=6<=12),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,5,9,1,23,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfstop,comfort stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,5,9,1,24,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecostop,eco stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,5,9,1,25,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,5,9,1,26,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.hpcircpump,circulation pump available during dhw,boolean, ,true,switch.boiler_dhw_circulation_pump_available_during_dhw,switch.boiler_dhw_hpcircpump,5,9,1,27,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Geo 5xx",boiler,173,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Geo 5xx",boiler,173,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Geo 5xx",boiler,173,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Geo 5xx",boiler,173,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Geo 5xx",boiler,173,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Geo 5xx",boiler,173,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Geo 5xx",boiler,173,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Geo 5xx",boiler,173,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Geo 5xx",boiler,173,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Geo 5xx",boiler,173,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Geo 5xx",boiler,173,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Geo 5xx",boiler,173,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Geo 5xx",boiler,173,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Geo 5xx",boiler,173,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Geo 5xx",boiler,173,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Geo 5xx",boiler,173,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Geo 5xx",boiler,173,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Geo 5xx",boiler,173,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Geo 5xx",boiler,173,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Geo 5xx",boiler,173,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Geo 5xx",boiler,173,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Geo 5xx",boiler,173,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Geo 5xx",boiler,173,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Geo 5xx",boiler,173,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Geo 5xx",boiler,173,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Geo 5xx",boiler,173,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Geo 5xx",boiler,173,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Geo 5xx",boiler,173,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Geo 5xx",boiler,173,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Geo 5xx",boiler,173,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Geo 5xx",boiler,173,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Geo 5xx",boiler,173,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Geo 5xx",boiler,173,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Geo 5xx",boiler,173,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Geo 5xx",boiler,173,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Geo 5xx",boiler,173,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Geo 5xx",boiler,173,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Geo 5xx",boiler,173,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Geo 5xx",boiler,173,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Geo 5xx",boiler,173,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Geo 5xx",boiler,173,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Geo 5xx",boiler,173,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Geo 5xx",boiler,173,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Geo 5xx",boiler,173,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Geo 5xx",boiler,173,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_energy,sensor.boiler_dhw_nrg,5,9,1/100,0,2 -"Geo 5xx",boiler,173,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_heating,sensor.boiler_nrgheat,5,0,1/100,85,2 -"Geo 5xx",boiler,173,nrgcool,energy cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_cooling,sensor.boiler_nrgcool,5,0,1/100,87,2 -"Geo 5xx",boiler,173,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_total,sensor.boiler_metertotal,5,0,1/100,89,2 -"Geo 5xx",boiler,173,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_compressor,sensor.boiler_metercomp,5,0,1/100,91,2 -"Geo 5xx",boiler,173,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_e-heater,sensor.boiler_metereheat,5,0,1/100,93,2 -"Geo 5xx",boiler,173,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/100,95,2 -"Geo 5xx",boiler,173,metercool,meter cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_cooling,sensor.boiler_metercool,5,0,1/100,97,2 -"Geo 5xx",boiler,173,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/100,2,2 -"Geo 5xx",boiler,173,uptimetotal,heatpump total uptime,time (>=0<=279620),minutes,false,sensor.boiler_heatpump_total_uptime,sensor.boiler_uptimetotal,5,0,1/60,99,2 -"Geo 5xx",boiler,173,uptimecontrol,total operating time heat,time (>=0<=279620),minutes,false,sensor.boiler_total_operating_time_heat,sensor.boiler_uptimecontrol,5,0,1/60,101,2 -"Geo 5xx",boiler,173,uptimecompheating,operating time compressor heating,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_heating,sensor.boiler_uptimecompheating,5,0,1/60,103,2 -"Geo 5xx",boiler,173,uptimecompcooling,operating time compressor cooling,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_cooling,sensor.boiler_uptimecompcooling,5,0,1/60,105,2 -"Geo 5xx",boiler,173,dhw.uptimecomp,operating time compressor,time (>=0<=279620),minutes,false,sensor.boiler_dhw_operating_time_compressor,sensor.boiler_dhw_uptimecomp,5,9,1/60,4,2 -"Geo 5xx",boiler,173,uptimecomppool,operating time compressor pool,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_pool,sensor.boiler_uptimecomppool,5,0,1/60,107,2 -"Geo 5xx",boiler,173,totalcompstarts,total compressor control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_total_compressor_control_starts,sensor.boiler_totalcompstarts,5,0,1,109,2 -"Geo 5xx",boiler,173,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_heating_control_starts,sensor.boiler_heatingstarts,5,0,1,111,2 -"Geo 5xx",boiler,173,coolingstarts,cooling control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_cooling_control_starts,sensor.boiler_coolingstarts,5,0,1,113,2 -"Geo 5xx",boiler,173,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts_hp,sensor.boiler_dhw_startshp,5,9,1,6,2 -"Geo 5xx",boiler,173,poolstarts,pool control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_pool_control_starts,sensor.boiler_poolstarts,5,0,1,115,2 -"Geo 5xx",boiler,173,nrgconstotal,total energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption,sensor.boiler_nrgconstotal,5,0,1,117,2 -"Geo 5xx",boiler,173,nrgconscomptotal,total energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption_compressor,sensor.boiler_nrgconscomptotal,5,0,1,119,2 -"Geo 5xx",boiler,173,nrgconscompheating,energy consumption compressor heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_heating,sensor.boiler_nrgconscompheating,5,0,1,121,2 -"Geo 5xx",boiler,173,dhw.nrgconscomp,energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_energy_consumption_compressor,sensor.boiler_dhw_nrgconscomp,5,9,1,8,2 -"Geo 5xx",boiler,173,nrgconscompcooling,energy consumption compressor cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_cooling,sensor.boiler_nrgconscompcooling,5,0,1,123,2 -"Geo 5xx",boiler,173,nrgconscomppool,energy consumption compressor pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_pool,sensor.boiler_nrgconscomppool,5,0,1,125,2 -"Geo 5xx",boiler,173,auxelecheatnrgconstotal,total aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_aux_elec._heater_energy_consumption,sensor.boiler_auxelecheatnrgconstotal,5,0,1,127,2 -"Geo 5xx",boiler,173,auxelecheatnrgconsheating,aux elec. heater energy consumption heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_heating,sensor.boiler_auxelecheatnrgconsheating,5,0,1,129,2 -"Geo 5xx",boiler,173,dhw.auxelecheatnrgcons,aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_aux_elec._heater_energy_consumption,sensor.boiler_dhw_auxelecheatnrgcons,5,9,1,10,2 -"Geo 5xx",boiler,173,auxelecheatnrgconspool,aux elec. heater energy consumption pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_pool,sensor.boiler_auxelecheatnrgconspool,5,0,1,131,2 -"Geo 5xx",boiler,173,nrgsupptotal,total energy supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied,sensor.boiler_nrgsupptotal,5,0,1,133,2 -"Geo 5xx",boiler,173,nrgsuppheating,total energy supplied heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_heating,sensor.boiler_nrgsuppheating,5,0,1,135,2 -"Geo 5xx",boiler,173,dhw.nrgsupp,total energy warm supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_total_energy_warm_supplied,sensor.boiler_dhw_nrgsupp,5,9,1,12,2 -"Geo 5xx",boiler,173,nrgsuppcooling,total energy supplied cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_cooling,sensor.boiler_nrgsuppcooling,5,0,1,137,2 -"Geo 5xx",boiler,173,nrgsupppool,total energy supplied pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_pool,sensor.boiler_nrgsupppool,5,0,1,139,2 -"Geo 5xx",boiler,173,hppower,compressor power output,uint16 (>=0<=3199),kW,false,sensor.boiler_compressor_power_output,sensor.boiler_hppower,5,0,1/10,141,1 -"Geo 5xx",boiler,173,hpmaxpower,compressor max power,uint8 (>=0<=100),%,true,number.boiler_compressor_max_power,number.boiler_hpmaxpower,5,0,1,142,1 -"Geo 5xx",boiler,173,pvmaxcomp,pv compressor max power,uint8 (>=0<=25),kW,true,number.boiler_pv_compressor_max_power,number.boiler_pvmaxcomp,5,0,1/10,143,1 -"Geo 5xx",boiler,173,powerreduction,power reduction,uint8 (>=30<=60),%,true,number.boiler_power_reduction,number.boiler_powerreduction,5,0,10,144,1 -"Geo 5xx",boiler,173,hpsetdiffpress,set differential pressure,uint8 (>=150<=750),mbar,true,number.boiler_set_differential_pressure,number.boiler_hpsetdiffpress,5,0,50,145,1 -"Geo 5xx",boiler,173,hpcompon,hp compressor,boolean, ,false,binary_sensor.boiler_hp_compressor,binary_sensor.boiler_hpcompon,5,0,1,146,1 -"Geo 5xx",boiler,173,hpactivity,compressor activity,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_compressor_activity,sensor.boiler_hpactivity,5,0,1,147,1 -"Geo 5xx",boiler,173,hpbrinepumpspd,brine pump speed,uint8 (>=0<=100),%,false,sensor.boiler_brine_pump_speed,sensor.boiler_hpbrinepumpspd,5,0,1,148,1 -"Geo 5xx",boiler,173,hpswitchvalve,switch valve,boolean, ,false,binary_sensor.boiler_switch_valve,binary_sensor.boiler_hpswitchvalve,5,0,1,149,1 -"Geo 5xx",boiler,173,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_speed,sensor.boiler_hpcompspd,5,0,1,150,1 -"Geo 5xx",boiler,173,hpcircspd,circulation pump speed,uint8 (>=0<=100),%,false,sensor.boiler_circulation_pump_speed,sensor.boiler_hpcircspd,5,0,1,151,1 -"Geo 5xx",boiler,173,hpbrinein,brine in/evaporator,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_in/evaporator,sensor.boiler_hpbrinein,5,0,1/10,152,1 -"Geo 5xx",boiler,173,hpbrineout,brine out/condenser,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_out/condenser,sensor.boiler_hpbrineout,5,0,1/10,153,1 -"Geo 5xx",boiler,173,hptc0,heat carrier return (TC0),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_return_(TC0),sensor.boiler_hptc0,5,0,1/10,154,1 -"Geo 5xx",boiler,173,hptc1,heat carrier forward (TC1),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_forward_(TC1),sensor.boiler_hptc1,5,0,1/10,155,1 -"Geo 5xx",boiler,173,hptc3,condenser temperature (TC3),int16 (>=-3199<=3199),C,false,sensor.boiler_condenser_temperature_(TC3),sensor.boiler_hptc3,5,0,1/10,156,1 -"Geo 5xx",boiler,173,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_temperature_(TR1),sensor.boiler_hptr1,5,0,1/10,157,1 -"Geo 5xx",boiler,173,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.boiler_hptr3,5,0,1/10,158,1 -"Geo 5xx",boiler,173,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.boiler_evaporator_inlet_temperature_(TR4),sensor.boiler_hptr4,5,0,1/10,159,1 -"Geo 5xx",boiler,173,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_inlet_temperature_(TR5),sensor.boiler_hptr5,5,0,1/10,160,1 -"Geo 5xx",boiler,173,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_outlet_temperature_(TR6),sensor.boiler_hptr6,5,0,1/10,161,1 -"Geo 5xx",boiler,173,hptr7,refrigerant temperature gas side (condenser input) (TR7),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_gas_side_(condenser_input)_(TR7),sensor.boiler_hptr7,5,0,1/10,162,1 -"Geo 5xx",boiler,173,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.boiler_air_inlet_temperature_(TL2),sensor.boiler_hptl2,5,0,1/10,163,1 -"Geo 5xx",boiler,173,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.boiler_low_pressure_side_temperature_(PL1),sensor.boiler_hppl1,5,0,1/10,164,1 -"Geo 5xx",boiler,173,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.boiler_high_pressure_side_temperature_(PH1),sensor.boiler_hpph1,5,0,1/10,165,1 -"Geo 5xx",boiler,173,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.boiler_drain_pan_temp_(TA4),sensor.boiler_hpta4,5,0,1/10,166,1 -"Geo 5xx",boiler,173,hptw1,reservoir temp (TW1),int16 (>=-3199<=3199),C,false,sensor.boiler_reservoir_temp_(TW1),sensor.boiler_hptw1,5,0,1/10,167,1 -"Geo 5xx",boiler,173,poolsettemp,pool set temperature,uint8 (>=0<=127),C,true,number.boiler_pool_set_temperature,number.boiler_poolsettemp,5,0,1/2,168,1 -"Geo 5xx",boiler,173,hp4way,4-way valve (VR4),enum [cooling & defrost\|heating & dhw], ,false,sensor.boiler_4-way_valve_(VR4),sensor.boiler_hp4way,5,0,1,169,1 -"Geo 5xx",boiler,173,hpin1,input 1 state,boolean, ,false,binary_sensor.boiler_input_1_state,binary_sensor.boiler_hpin1,5,0,1,170,1 -"Geo 5xx",boiler,173,hpin1opt,input 1 options,string, ,true,sensor.boiler_input_1_options,sensor.boiler_hpin1opt,5,0,1,171,8 -"Geo 5xx",boiler,173,hpin2,input 2 state,boolean, ,false,binary_sensor.boiler_input_2_state,binary_sensor.boiler_hpin2,5,0,1,179,1 -"Geo 5xx",boiler,173,hpin2opt,input 2 options,string, ,true,sensor.boiler_input_2_options,sensor.boiler_hpin2opt,5,0,1,180,8 -"Geo 5xx",boiler,173,hpin3,input 3 state,boolean, ,false,binary_sensor.boiler_input_3_state,binary_sensor.boiler_hpin3,5,0,1,188,1 -"Geo 5xx",boiler,173,hpin3opt,input 3 options,string, ,true,sensor.boiler_input_3_options,sensor.boiler_hpin3opt,5,0,1,189,8 -"Geo 5xx",boiler,173,hpin4,input 4 state,boolean, ,false,binary_sensor.boiler_input_4_state,binary_sensor.boiler_hpin4,5,0,1,197,1 -"Geo 5xx",boiler,173,hpin4opt,input 4 options,string, ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,5,0,1,198,8 -"Geo 5xx",boiler,173,maxheatcomp,heat limit compressor,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,5,0,1,206,1 -"Geo 5xx",boiler,173,maxheatheat,heat limit heating,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,5,0,1,207,1 -"Geo 5xx",boiler,173,dhw.maxheat,heat limit,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,5,9,1,14,1 -"Geo 5xx",boiler,173,mandefrost,manual defrost,boolean, ,true,switch.boiler_manual_defrost,switch.boiler_mandefrost,5,0,1,208,1 -"Geo 5xx",boiler,173,pvcooling,cooling only with PV,boolean, ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,5,0,1,209,1 -"Geo 5xx",boiler,173,auxheateronly,aux heater only,boolean, ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,5,0,1,210,1 -"Geo 5xx",boiler,173,auxheateroff,disable aux heater,boolean, ,true,switch.boiler_disable_aux_heater,switch.boiler_auxheateroff,5,0,1,211,1 -"Geo 5xx",boiler,173,auxheaterstatus,aux heater status,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_aux_heater_status,sensor.boiler_auxheaterstatus,5,0,1,212,1 -"Geo 5xx",boiler,173,auxheaterlevel,aux heater level,uint8 (>=0<=100),%,false,sensor.boiler_aux_heater_level,sensor.boiler_auxheaterlevel,5,0,1,213,1 -"Geo 5xx",boiler,173,auxheaterdelay,aux heater on delay,uint16 (>=10<=1000),K*min,true,number.boiler_aux_heater_on_delay,number.boiler_auxheaterdelay,5,0,10,214,1 -"Geo 5xx",boiler,173,auxmaxlimit,aux heater max limit,uint8 (>=0<=10),K,true,number.boiler_aux_heater_max_limit,number.boiler_auxmaxlimit,5,0,1/10,215,1 -"Geo 5xx",boiler,173,auxlimitstart,aux heater limit start,uint8 (>=0<=10),K,true,number.boiler_aux_heater_limit_start,number.boiler_auxlimitstart,5,0,1/10,216,1 -"Geo 5xx",boiler,173,auxheatrmode,aux heater mode,enum [eco\|comfort], ,true,select.boiler_aux_heater_mode,select.boiler_auxheatrmode,5,0,1,217,1 -"Geo 5xx",boiler,173,hphystheat,on/off hyst heat,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_heat,number.boiler_hphystheat,5,0,5,218,1 -"Geo 5xx",boiler,173,hphystcool,on/off hyst cool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_cool,number.boiler_hphystcool,5,0,5,219,1 -"Geo 5xx",boiler,173,hphystpool,on/off hyst pool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_pool,number.boiler_hphystpool,5,0,5,220,1 -"Geo 5xx",boiler,173,silentmode,silent mode,enum [off\|auto\|on], ,true,select.boiler_silent_mode,select.boiler_silentmode,5,0,1,221,1 -"Geo 5xx",boiler,173,silentfrom,silent mode from,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_from,number.boiler_silentfrom,5,0,15,222,1 -"Geo 5xx",boiler,173,silentto,silent mode to,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_to,number.boiler_silentto,5,0,15,223,1 -"Geo 5xx",boiler,173,mintempsilent,min outside temp for silent mode,int8 (>=-126<=126),C,true,number.boiler_min_outside_temp_for_silent_mode,number.boiler_mintempsilent,5,0,1,224,1 -"Geo 5xx",boiler,173,tempparmode,outside temp parallel mode,int8 (>=-126<=126),C,true,number.boiler_outside_temp_parallel_mode,number.boiler_tempparmode,5,0,1,225,1 -"Geo 5xx",boiler,173,auxheatmix,aux heater mixing valve,int8 (>=-100<=100),%,false,sensor.boiler_aux_heater_mixing_valve,sensor.boiler_auxheatmix,5,0,1,226,1 -"Geo 5xx",boiler,173,tempdiffheat,temp diff TC3/TC0 heat,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_heat,number.boiler_tempdiffheat,5,0,1/10,227,1 -"Geo 5xx",boiler,173,tempdiffcool,temp diff TC3/TC0 cool,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_cool,number.boiler_tempdiffcool,5,0,1/10,228,1 -"Geo 5xx",boiler,173,vpcooling,valve/pump cooling,boolean, ,true,switch.boiler_valve/pump_cooling,switch.boiler_vpcooling,5,0,1,229,1 -"Geo 5xx",boiler,173,heatcable,heating cable,boolean, ,true,switch.boiler_heating_cable,switch.boiler_heatcable,5,0,1,230,1 -"Geo 5xx",boiler,173,vc0valve,VC0 valve,boolean, ,true,switch.boiler_VC0_valve,switch.boiler_vc0valve,5,0,1,231,1 -"Geo 5xx",boiler,173,primepump,primary heatpump,boolean, ,true,switch.boiler_primary_heatpump,switch.boiler_primepump,5,0,1,232,1 -"Geo 5xx",boiler,173,primepumpmod,primary heatpump modulation,uint8 (>=0<=100),%,true,number.boiler_primary_heatpump_modulation,number.boiler_primepumpmod,5,0,1,233,1 -"Geo 5xx",boiler,173,hp3way,3-way valve,boolean, ,true,switch.boiler_3-way_valve,switch.boiler_hp3way,5,0,1,234,1 -"Geo 5xx",boiler,173,elheatstep1,el. heater step 1,boolean, ,true,switch.boiler_el._heater_step_1,switch.boiler_elheatstep1,5,0,1,235,1 -"Geo 5xx",boiler,173,elheatstep2,el. heater step 2,boolean, ,true,switch.boiler_el._heater_step_2,switch.boiler_elheatstep2,5,0,1,236,1 -"Geo 5xx",boiler,173,elheatstep3,el. heater step 3,boolean, ,true,switch.boiler_el._heater_step_3,switch.boiler_elheatstep3,5,0,1,237,1 -"Geo 5xx",boiler,173,hpea0,condensate reservoir heating (EA0),boolean, ,false,binary_sensor.boiler_condensate_reservoir_heating_(EA0),binary_sensor.boiler_hpea0,5,0,1,238,1 -"Geo 5xx",boiler,173,hppumpmode,primary heatpump mode,enum [auto\|continuous], ,true,select.boiler_primary_heatpump_mode,select.boiler_hppumpmode,5,0,1,239,1 -"Geo 5xx",boiler,173,fan,fan,uint8 (>=20<=100),%,true,number.boiler_fan,number.boiler_fan,5,0,1,240,1 -"Geo 5xx",boiler,173,shutdown,shutdown,cmd [off\|on], ,true,sensor.boiler_shutdown,sensor.boiler_shutdown,5,0,1,241,1 -"Geo 5xx",boiler,173,hpcurrpower,compressor current power,uint16 (>=0<=31999),W,false,sensor.boiler_compressor_current_power,sensor.boiler_hpcurrpower,5,0,1,242,1 -"Geo 5xx",boiler,173,hppowerlimit,power limit,uint16 (>=0<=31999),W,true,number.boiler_power_limit,number.boiler_hppowerlimit,5,0,1,243,1 -"Geo 5xx",boiler,173,dhw.alternatingop,alternating operation,boolean, ,true,switch.boiler_dhw_alternating_operation,switch.boiler_dhw_alternatingop,5,9,1,15,1 -"Geo 5xx",boiler,173,dhw.altopprioheat,prioritise heating during dhw,uint8 (>=20<=120),minutes,true,number.boiler_dhw_prioritise_heating_during_dhw,number.boiler_dhw_altopprioheat,5,9,1,16,1 -"Geo 5xx",boiler,173,dhw.altopprio,prioritise dhw during heating,uint8 (>=30<=120),minutes,true,number.boiler_dhw_prioritise_dhw_during_heating,number.boiler_dhw_altopprio,5,9,1,17,1 -"Geo 5xx",boiler,173,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,5,9,1,18,1 -"Geo 5xx",boiler,173,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,5,9,1,19,1 -"Geo 5xx",boiler,173,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,5,9,1,20,1 -"Geo 5xx",boiler,173,dhw.comfdiff,comfort diff,uint8 (>=6<=12),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,5,9,1,21,1 -"Geo 5xx",boiler,173,dhw.ecodiff,eco diff,uint8 (>=6<=12),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,5,9,1,22,1 -"Geo 5xx",boiler,173,dhw.ecoplusdiff,eco+ diff,uint8 (>=6<=12),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,5,9,1,23,1 -"Geo 5xx",boiler,173,dhw.comfstop,comfort stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,5,9,1,24,1 -"Geo 5xx",boiler,173,dhw.ecostop,eco stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,5,9,1,25,1 -"Geo 5xx",boiler,173,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,5,9,1,26,1 -"Geo 5xx",boiler,173,dhw.hpcircpump,circulation pump available during dhw,boolean, ,true,switch.boiler_dhw_circulation_pump_available_during_dhw,switch.boiler_dhw_hpcircpump,5,9,1,27,1 -"Geo 5xx",boiler,173,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Geo 5xx",boiler,173,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Geo 5xx",boiler,173,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Geo 5xx",boiler,173,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Geo 5xx",boiler,173,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Geo 5xx",boiler,173,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Geo 5xx",boiler,173,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Geo 5xx",boiler,173,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Geo 5xx",boiler,173,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Geo 5xx",boiler,173,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Geo 5xx",boiler,173,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Geo 5xx",boiler,173,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Geo 5xx",boiler,173,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Geo 5xx",boiler,173,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Geo 5xx",boiler,173,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Geo 5xx",boiler,173,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Geo 5xx",boiler,173,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Geo 5xx",boiler,173,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Geo 5xx",boiler,173,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Geo 5xx",boiler,173,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Geo 5xx",boiler,173,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Geo 5xx",boiler,173,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Geo 5xx",boiler,173,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Geo 5xx",boiler,173,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Geo 5xx",boiler,173,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Geo 5xx",boiler,173,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Geo 5xx",boiler,173,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Geo 5xx",boiler,173,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Geo 5xx",boiler,173,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Geo 5xx",boiler,173,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Geo 5xx",boiler,173,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Geo 5xx",boiler,173,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Geo 5xx",boiler,173,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Geo 5xx",boiler,173,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Geo 5xx",boiler,173,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Geo 5xx",boiler,173,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Geo 5xx",boiler,173,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Geo 5xx",boiler,173,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Geo 5xx",boiler,173,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logamax U122, Cerapur",boiler,203,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logamax U122, Cerapur",boiler,203,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logamax U122, Cerapur",boiler,203,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logamax U122, Cerapur",boiler,203,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logamax U122, Cerapur",boiler,203,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logamax U122, Cerapur",boiler,203,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logamax U122, Cerapur",boiler,203,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logamax U122, Cerapur",boiler,203,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logamax U122, Cerapur",boiler,203,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logamax U122, Cerapur",boiler,203,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logamax U122, Cerapur",boiler,203,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logamax U122, Cerapur",boiler,203,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logamax U122, Cerapur",boiler,203,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logamax U122, Cerapur",boiler,203,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logamax U122, Cerapur",boiler,203,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logamax U122, Cerapur",boiler,203,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logamax U122, Cerapur",boiler,203,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logamax U122, Cerapur",boiler,203,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logamax U122, Cerapur",boiler,203,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logamax U122, Cerapur",boiler,203,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logamax U122, Cerapur",boiler,203,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logamax U122, Cerapur",boiler,203,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logamax U122, Cerapur",boiler,203,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logamax U122, Cerapur",boiler,203,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logamax U122, Cerapur",boiler,203,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logamax U122, Cerapur",boiler,203,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logamax U122, Cerapur",boiler,203,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logamax U122, Cerapur",boiler,203,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logamax U122, Cerapur",boiler,203,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logamax U122, Cerapur",boiler,203,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logamax U122, Cerapur",boiler,203,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logamax U122, Cerapur",boiler,203,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logamax U122, Cerapur",boiler,203,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logamax U122, Cerapur",boiler,203,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logamax U122, Cerapur",boiler,203,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logamax U122, Cerapur",boiler,203,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logamax U122, Cerapur",boiler,203,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logamax U122, Cerapur",boiler,203,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logamax U122, Cerapur",boiler,203,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logamax U122, Cerapur",boiler,203,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logamax U122, Cerapur",boiler,203,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logamax U122, Cerapur",boiler,203,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logamax U122, Cerapur",boiler,203,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logamax U122, Cerapur",boiler,203,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logamax U122, Cerapur",boiler,203,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logamax U122, Cerapur",boiler,203,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logamax U122, Cerapur",boiler,203,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logamax U122, Cerapur",boiler,203,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logamax U122, Cerapur",boiler,203,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logamax U122, Cerapur",boiler,203,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logamax U122, Cerapur",boiler,203,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logamax U122, Cerapur",boiler,203,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logamax U122, Cerapur",boiler,203,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logamax U122, Cerapur",boiler,203,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logamax U122, Cerapur",boiler,203,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logamax U122, Cerapur",boiler,203,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logamax U122, Cerapur",boiler,203,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logamax U122, Cerapur",boiler,203,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logamax U122, Cerapur",boiler,203,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logamax U122, Cerapur",boiler,203,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logamax U122, Cerapur",boiler,203,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logamax U122, Cerapur",boiler,203,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logamax U122, Cerapur",boiler,203,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logamax U122, Cerapur",boiler,203,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logamax U122, Cerapur",boiler,203,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logamax U122, Cerapur",boiler,203,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logamax U122, Cerapur",boiler,203,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logamax U122, Cerapur",boiler,203,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logamax U122, Cerapur",boiler,203,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logamax U122, Cerapur",boiler,203,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logamax U122, Cerapur",boiler,203,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logamax U122, Cerapur",boiler,203,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logamax U122, Cerapur",boiler,203,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logamax U122, Cerapur",boiler,203,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logamax U122, Cerapur",boiler,203,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logamax U122, Cerapur",boiler,203,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logamax U122, Cerapur",boiler,203,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logamax U122, Cerapur",boiler,203,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logamax U122, Cerapur",boiler,203,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logamax U122, Cerapur",boiler,203,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logamax U122, Cerapur",boiler,203,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logamax U122, Cerapur",boiler,203,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logamax U122, Cerapur",boiler,203,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logamax U122, Cerapur",boiler,203,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logamax U122, Cerapur",boiler,203,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logamax U122, Cerapur",boiler,203,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logamax U122, Cerapur",boiler,203,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logamax U122, Cerapur",boiler,203,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logamax U122, Cerapur",boiler,203,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logamax U122, Cerapur",boiler,203,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logamax U122, Cerapur",boiler,203,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logamax U122, Cerapur",boiler,203,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logamax U122, Cerapur",boiler,203,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logamax U122, Cerapur",boiler,203,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logamax U122, Cerapur",boiler,203,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logamax U122, Cerapur",boiler,203,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logamax U122, Cerapur",boiler,203,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logamax U122, Cerapur",boiler,203,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logamax U122, Cerapur",boiler,203,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logamax U122, Cerapur",boiler,203,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logamax U122, Cerapur",boiler,203,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logamax U122, Cerapur",boiler,203,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logamax U122, Cerapur",boiler,203,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logamax U122, Cerapur",boiler,203,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logamax U122, Cerapur",boiler,203,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logamax U122, Cerapur",boiler,203,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logamax U122, Cerapur",boiler,203,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logamax U122, Cerapur",boiler,203,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logamax U122, Cerapur",boiler,203,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logamax U122, Cerapur",boiler,203,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logamax U122, Cerapur",boiler,203,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logamax U122, Cerapur",boiler,203,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logamax U122, Cerapur",boiler,203,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logamax U122, Cerapur",boiler,203,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Ecomline Excellent",boiler,206,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Ecomline Excellent",boiler,206,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Ecomline Excellent",boiler,206,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Ecomline Excellent",boiler,206,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Ecomline Excellent",boiler,206,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Ecomline Excellent",boiler,206,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Ecomline Excellent",boiler,206,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Ecomline Excellent",boiler,206,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Ecomline Excellent",boiler,206,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Ecomline Excellent",boiler,206,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Ecomline Excellent",boiler,206,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Ecomline Excellent",boiler,206,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Ecomline Excellent",boiler,206,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Ecomline Excellent",boiler,206,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Ecomline Excellent",boiler,206,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Ecomline Excellent",boiler,206,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Ecomline Excellent",boiler,206,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Ecomline Excellent",boiler,206,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Ecomline Excellent",boiler,206,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Ecomline Excellent",boiler,206,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Ecomline Excellent",boiler,206,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Ecomline Excellent",boiler,206,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Ecomline Excellent",boiler,206,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Ecomline Excellent",boiler,206,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Ecomline Excellent",boiler,206,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Ecomline Excellent",boiler,206,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Ecomline Excellent",boiler,206,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Ecomline Excellent",boiler,206,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Ecomline Excellent",boiler,206,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Ecomline Excellent",boiler,206,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Ecomline Excellent",boiler,206,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Ecomline Excellent",boiler,206,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Ecomline Excellent",boiler,206,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Ecomline Excellent",boiler,206,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Ecomline Excellent",boiler,206,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Ecomline Excellent",boiler,206,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Ecomline Excellent",boiler,206,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Ecomline Excellent",boiler,206,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Ecomline Excellent",boiler,206,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Ecomline Excellent",boiler,206,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Ecomline Excellent",boiler,206,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Ecomline Excellent",boiler,206,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Ecomline Excellent",boiler,206,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Ecomline Excellent",boiler,206,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Ecomline Excellent",boiler,206,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Ecomline Excellent",boiler,206,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Ecomline Excellent",boiler,206,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Ecomline Excellent",boiler,206,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Ecomline Excellent",boiler,206,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Ecomline Excellent",boiler,206,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Ecomline Excellent",boiler,206,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Ecomline Excellent",boiler,206,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Ecomline Excellent",boiler,206,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Ecomline Excellent",boiler,206,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Ecomline Excellent",boiler,206,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Ecomline Excellent",boiler,206,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Ecomline Excellent",boiler,206,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Ecomline Excellent",boiler,206,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Ecomline Excellent",boiler,206,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Ecomline Excellent",boiler,206,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Ecomline Excellent",boiler,206,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Ecomline Excellent",boiler,206,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Ecomline Excellent",boiler,206,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Ecomline Excellent",boiler,206,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Ecomline Excellent",boiler,206,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Ecomline Excellent",boiler,206,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Ecomline Excellent",boiler,206,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Ecomline Excellent",boiler,206,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Ecomline Excellent",boiler,206,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Ecomline Excellent",boiler,206,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Ecomline Excellent",boiler,206,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Ecomline Excellent",boiler,206,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Ecomline Excellent",boiler,206,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Ecomline Excellent",boiler,206,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Ecomline Excellent",boiler,206,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Ecomline Excellent",boiler,206,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Ecomline Excellent",boiler,206,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Ecomline Excellent",boiler,206,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Ecomline Excellent",boiler,206,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Ecomline Excellent",boiler,206,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Ecomline Excellent",boiler,206,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Ecomline Excellent",boiler,206,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Ecomline Excellent",boiler,206,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Ecomline Excellent",boiler,206,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Ecomline Excellent",boiler,206,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Ecomline Excellent",boiler,206,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Ecomline Excellent",boiler,206,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Ecomline Excellent",boiler,206,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Ecomline Excellent",boiler,206,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Ecomline Excellent",boiler,206,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Ecomline Excellent",boiler,206,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Ecomline Excellent",boiler,206,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Ecomline Excellent",boiler,206,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Ecomline Excellent",boiler,206,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Ecomline Excellent",boiler,206,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Ecomline Excellent",boiler,206,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Ecomline Excellent",boiler,206,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Ecomline Excellent",boiler,206,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Ecomline Excellent",boiler,206,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Ecomline Excellent",boiler,206,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Ecomline Excellent",boiler,206,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Ecomline Excellent",boiler,206,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Ecomline Excellent",boiler,206,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Ecomline Excellent",boiler,206,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Ecomline Excellent",boiler,206,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Ecomline Excellent",boiler,206,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Ecomline Excellent",boiler,206,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Ecomline Excellent",boiler,206,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Ecomline Excellent",boiler,206,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Ecomline Excellent",boiler,206,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Ecomline Excellent",boiler,206,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Ecomline Excellent",boiler,206,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Ecomline Excellent",boiler,206,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Ecomline Excellent",boiler,206,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Cascade MC400",boiler,210,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Cascade MC400",boiler,210,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Cascade MC400",boiler,210,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Cascade MC400",boiler,210,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Cascade MC400",boiler,210,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Cascade MC400",boiler,210,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Cascade MC400",boiler,210,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Cascade MC400",boiler,210,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Cascade MC400",boiler,210,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Cascade MC400",boiler,210,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Cascade MC400",boiler,210,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Cascade MC400",boiler,210,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Cascade MC400",boiler,210,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Cascade MC400",boiler,210,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Cascade MC400",boiler,210,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Cascade MC400",boiler,210,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Cascade MC400",boiler,210,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Cascade MC400",boiler,210,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Cascade MC400",boiler,210,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Cascade MC400",boiler,210,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Cascade MC400",boiler,210,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Cascade MC400",boiler,210,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Cascade MC400",boiler,210,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Cascade MC400",boiler,210,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Cascade MC400",boiler,210,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Cascade MC400",boiler,210,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Cascade MC400",boiler,210,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Cascade MC400",boiler,210,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Cascade MC400",boiler,210,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Cascade MC400",boiler,210,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Cascade MC400",boiler,210,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Cascade MC400",boiler,210,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Cascade MC400",boiler,210,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Cascade MC400",boiler,210,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Cascade MC400",boiler,210,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Cascade MC400",boiler,210,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Cascade MC400",boiler,210,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Cascade MC400",boiler,210,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Cascade MC400",boiler,210,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Cascade MC400",boiler,210,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Cascade MC400",boiler,210,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Cascade MC400",boiler,210,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Cascade MC400",boiler,210,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Cascade MC400",boiler,210,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Cascade MC400",boiler,210,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Cascade MC400",boiler,210,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Cascade MC400",boiler,210,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Cascade MC400",boiler,210,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Cascade MC400",boiler,210,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Cascade MC400",boiler,210,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Cascade MC400",boiler,210,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Cascade MC400",boiler,210,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Cascade MC400",boiler,210,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Cascade MC400",boiler,210,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Cascade MC400",boiler,210,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Cascade MC400",boiler,210,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Cascade MC400",boiler,210,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Cascade MC400",boiler,210,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Cascade MC400",boiler,210,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Cascade MC400",boiler,210,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Cascade MC400",boiler,210,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Cascade MC400",boiler,210,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Cascade MC400",boiler,210,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Cascade MC400",boiler,210,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Cascade MC400",boiler,210,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Cascade MC400",boiler,210,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Cascade MC400",boiler,210,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Cascade MC400",boiler,210,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Cascade MC400",boiler,210,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Cascade MC400",boiler,210,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Cascade MC400",boiler,210,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Cascade MC400",boiler,210,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Cascade MC400",boiler,210,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Cascade MC400",boiler,210,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Cascade MC400",boiler,210,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Cascade MC400",boiler,210,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Cascade MC400",boiler,210,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Cascade MC400",boiler,210,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Cascade MC400",boiler,210,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Cascade MC400",boiler,210,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Cascade MC400",boiler,210,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Cascade MC400",boiler,210,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Cascade MC400",boiler,210,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Cascade MC400",boiler,210,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Cascade MC400",boiler,210,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Cascade MC400",boiler,210,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Cascade MC400",boiler,210,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Cascade MC400",boiler,210,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Cascade MC400",boiler,210,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Cascade MC400",boiler,210,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Cascade MC400",boiler,210,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Cascade MC400",boiler,210,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Cascade MC400",boiler,210,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Cascade MC400",boiler,210,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Cascade MC400",boiler,210,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Cascade MC400",boiler,210,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Cascade MC400",boiler,210,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Cascade MC400",boiler,210,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Cascade MC400",boiler,210,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Cascade MC400",boiler,210,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Cascade MC400",boiler,210,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Cascade MC400",boiler,210,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Cascade MC400",boiler,210,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Cascade MC400",boiler,210,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Cascade MC400",boiler,210,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Cascade MC400",boiler,210,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Cascade MC400",boiler,210,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Cascade MC400",boiler,210,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Cascade MC400",boiler,210,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Cascade MC400",boiler,210,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Cascade MC400",boiler,210,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Cascade MC400",boiler,210,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Cascade MC400",boiler,210,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Cascade MC400",boiler,210,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"EasyControl Adapter",boiler,211,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"EasyControl Adapter",boiler,211,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"EasyControl Adapter",boiler,211,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"EasyControl Adapter",boiler,211,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"EasyControl Adapter",boiler,211,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"EasyControl Adapter",boiler,211,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"EasyControl Adapter",boiler,211,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"EasyControl Adapter",boiler,211,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"EasyControl Adapter",boiler,211,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"EasyControl Adapter",boiler,211,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"EasyControl Adapter",boiler,211,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"EasyControl Adapter",boiler,211,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"EasyControl Adapter",boiler,211,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"EasyControl Adapter",boiler,211,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"EasyControl Adapter",boiler,211,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"EasyControl Adapter",boiler,211,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"EasyControl Adapter",boiler,211,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"EasyControl Adapter",boiler,211,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"EasyControl Adapter",boiler,211,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"EasyControl Adapter",boiler,211,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"EasyControl Adapter",boiler,211,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"EasyControl Adapter",boiler,211,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"EasyControl Adapter",boiler,211,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"EasyControl Adapter",boiler,211,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"EasyControl Adapter",boiler,211,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"EasyControl Adapter",boiler,211,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"EasyControl Adapter",boiler,211,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"EasyControl Adapter",boiler,211,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"EasyControl Adapter",boiler,211,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"EasyControl Adapter",boiler,211,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"EasyControl Adapter",boiler,211,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"EasyControl Adapter",boiler,211,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"EasyControl Adapter",boiler,211,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"EasyControl Adapter",boiler,211,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"EasyControl Adapter",boiler,211,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"EasyControl Adapter",boiler,211,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"EasyControl Adapter",boiler,211,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"EasyControl Adapter",boiler,211,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"EasyControl Adapter",boiler,211,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"EasyControl Adapter",boiler,211,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"EasyControl Adapter",boiler,211,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"EasyControl Adapter",boiler,211,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"EasyControl Adapter",boiler,211,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"EasyControl Adapter",boiler,211,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"EasyControl Adapter",boiler,211,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"EasyControl Adapter",boiler,211,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"EasyControl Adapter",boiler,211,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"EasyControl Adapter",boiler,211,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"EasyControl Adapter",boiler,211,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"EasyControl Adapter",boiler,211,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"EasyControl Adapter",boiler,211,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"EasyControl Adapter",boiler,211,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"EasyControl Adapter",boiler,211,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"EasyControl Adapter",boiler,211,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"EasyControl Adapter",boiler,211,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"EasyControl Adapter",boiler,211,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"EasyControl Adapter",boiler,211,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"EasyControl Adapter",boiler,211,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"EasyControl Adapter",boiler,211,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"EasyControl Adapter",boiler,211,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"EasyControl Adapter",boiler,211,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"EasyControl Adapter",boiler,211,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"EasyControl Adapter",boiler,211,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"EasyControl Adapter",boiler,211,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"EasyControl Adapter",boiler,211,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"EasyControl Adapter",boiler,211,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"EasyControl Adapter",boiler,211,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"EasyControl Adapter",boiler,211,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"EasyControl Adapter",boiler,211,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"EasyControl Adapter",boiler,211,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"EasyControl Adapter",boiler,211,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"EasyControl Adapter",boiler,211,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"EasyControl Adapter",boiler,211,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"EasyControl Adapter",boiler,211,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"EasyControl Adapter",boiler,211,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"EasyControl Adapter",boiler,211,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"EasyControl Adapter",boiler,211,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"EasyControl Adapter",boiler,211,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"EasyControl Adapter",boiler,211,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"EasyControl Adapter",boiler,211,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"EasyControl Adapter",boiler,211,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"EasyControl Adapter",boiler,211,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"EasyControl Adapter",boiler,211,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"EasyControl Adapter",boiler,211,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"EasyControl Adapter",boiler,211,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"EasyControl Adapter",boiler,211,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"EasyControl Adapter",boiler,211,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"EasyControl Adapter",boiler,211,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"EasyControl Adapter",boiler,211,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"EasyControl Adapter",boiler,211,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"EasyControl Adapter",boiler,211,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"EasyControl Adapter",boiler,211,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"EasyControl Adapter",boiler,211,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"EasyControl Adapter",boiler,211,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"EasyControl Adapter",boiler,211,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"EasyControl Adapter",boiler,211,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"EasyControl Adapter",boiler,211,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"EasyControl Adapter",boiler,211,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"EasyControl Adapter",boiler,211,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"EasyControl Adapter",boiler,211,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"EasyControl Adapter",boiler,211,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"EasyControl Adapter",boiler,211,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"EasyControl Adapter",boiler,211,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"EasyControl Adapter",boiler,211,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"EasyControl Adapter",boiler,211,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"EasyControl Adapter",boiler,211,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"EasyControl Adapter",boiler,211,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"EasyControl Adapter",boiler,211,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"EasyControl Adapter",boiler,211,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"EasyControl Adapter",boiler,211,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"EasyControl Adapter",boiler,211,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"EasyControl Adapter",boiler,211,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"EasyControl Adapter",boiler,211,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"EasyControl Adapter",boiler,211,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,netflowtemp,heat network flow temp,uint16 (>=0<=3199),C,false,sensor.boiler_heat_network_flow_temp,sensor.boiler_netflowtemp,5,0,1/10,271,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatvalve,heating valve,uint8 (>=0<=100),%,false,sensor.boiler_heating_valve,sensor.boiler_heatvalve,5,0,1,272,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.dhwvalve,valve,uint8 (>=0<=100),%,false,sensor.boiler_dhw_valve,sensor.boiler_dhw_dhwvalve,5,9,1,73,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,keepwarmtemp,keep warm temperature,uint8 (>=0<=254),C,true,number.boiler_keep_warm_temperature,number.boiler_keepwarmtemp,5,0,1,273,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,setreturntemp,set temp return,uint8 (>=0<=254),C,true,number.boiler_set_temp_return,number.boiler_setreturntemp,5,0,1,274,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heating,heating,boolean, ,false,binary_sensor.boiler_heating,binary_sensor.boiler_heating,5,0,1,275,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,1,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,2,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,3,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,4,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,5,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,6,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,7,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,8,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,9,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,10,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,11,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,12,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,244,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,245,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,246,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,247,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,248,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,249,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,250,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,251,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,252,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,253,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,254,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,255,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,256,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,257,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,258,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,259,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,260,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,261,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,262,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,263,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,264,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,265,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,13,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,14,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,15,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,16,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,17,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,18,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,19,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,20,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,21,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,22,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,23,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,24,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,26,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,28,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,30,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,32,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,34,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,36,28 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,64,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,66,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,67,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,69,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,70,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,71,6 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,77,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,78,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,79,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,80,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,81,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,82,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,95,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,266,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,69,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,268,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,71,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,63,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,64,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,65,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,67,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,270,1 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,83,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,85,2 -"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 -"Logamatic TC100, Moduline Easy",thermostat,202,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Logamatic TC100, Moduline Easy",thermostat,202,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Logamatic TC100, Moduline Easy",thermostat,202,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"Logamatic TC100, Moduline Easy",thermostat,202,hc1.seltemp,selected room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/100,0,1 -"Logamatic TC100, Moduline Easy",thermostat,202,hc1.currtemp,current room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/100,1,1 -"Logamatic TC100, Moduline Easy",thermostat,202,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"EasyControl, CT200",thermostat,203,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"EasyControl, CT200",thermostat,203,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"EasyControl, CT200",thermostat,203,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"EasyControl, CT200",thermostat,203,hc1.seltemp,selected room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/100,0,1 -"EasyControl, CT200",thermostat,203,hc1.currtemp,current room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/100,1,1 -"EasyControl, CT200",thermostat,203,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"UI800, BC400",thermostat,4,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"UI800, BC400",thermostat,4,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"UI800, BC400",thermostat,4,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"UI800, BC400",thermostat,4,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"UI800, BC400",thermostat,4,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 -"UI800, BC400",thermostat,4,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 -"UI800, BC400",thermostat,4,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 -"UI800, BC400",thermostat,4,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"UI800, BC400",thermostat,4,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"UI800, BC400",thermostat,4,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"UI800, BC400",thermostat,4,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 -"UI800, BC400",thermostat,4,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"UI800, BC400",thermostat,4,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"UI800, BC400",thermostat,4,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"UI800, BC400",thermostat,4,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"UI800, BC400",thermostat,4,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"UI800, BC400",thermostat,4,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"UI800, BC400",thermostat,4,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"UI800, BC400",thermostat,4,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 -"UI800, BC400",thermostat,4,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 -"UI800, BC400",thermostat,4,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 -"UI800, BC400",thermostat,4,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 -"UI800, BC400",thermostat,4,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"UI800, BC400",thermostat,4,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"UI800, BC400",thermostat,4,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"UI800, BC400",thermostat,4,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"UI800, BC400",thermostat,4,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"UI800, BC400",thermostat,4,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"UI800, BC400",thermostat,4,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"UI800, BC400",thermostat,4,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 -"UI800, BC400",thermostat,4,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"UI800, BC400",thermostat,4,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"UI800, BC400",thermostat,4,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 -"UI800, BC400",thermostat,4,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"UI800, BC400",thermostat,4,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"UI800, BC400",thermostat,4,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"UI800, BC400",thermostat,4,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 -"UI800, BC400",thermostat,4,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 -"UI800, BC400",thermostat,4,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"UI800, BC400",thermostat,4,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"UI800, BC400",thermostat,4,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"UI800, BC400",thermostat,4,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"UI800, BC400",thermostat,4,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 -"UI800, BC400",thermostat,4,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 -"UI800, BC400",thermostat,4,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"UI800, BC400",thermostat,4,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 -"UI800, BC400",thermostat,4,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 -"UI800, BC400",thermostat,4,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"UI800, BC400",thermostat,4,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"UI800, BC400",thermostat,4,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"UI800, BC400",thermostat,4,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 -"UI800, BC400",thermostat,4,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 -"UI800, BC400",thermostat,4,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"UI800, BC400",thermostat,4,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"UI800, BC400",thermostat,4,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"UI800, BC400",thermostat,4,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"UI800, BC400",thermostat,4,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"UI800, BC400",thermostat,4,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 -"UI800, BC400",thermostat,4,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 -"UI800, BC400",thermostat,4,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 -"UI800, BC400",thermostat,4,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 -"UI800, BC400",thermostat,4,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 -"UI800, BC400",thermostat,4,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 -"UI800, BC400",thermostat,4,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"UI800, BC400",thermostat,4,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"UI800, BC400",thermostat,4,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 -"UI800, BC400",thermostat,4,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 -"UI800, BC400",thermostat,4,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 -"UI800, BC400",thermostat,4,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 -"UI800, BC400",thermostat,4,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 -"UI800, BC400",thermostat,4,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 -"UI800, BC400",thermostat,4,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 -"UI800, BC400",thermostat,4,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 -"UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 -"UI800, BC400",thermostat,4,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 -"UI800, BC400",thermostat,4,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 -"UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 -"UI800, BC400",thermostat,4,hc1.currsolarinfl,curent solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_curent_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 -"UI800, BC400",thermostat,4,dhw.mode,operating mode,enum [off\|eco+\|eco\|comfort\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"UI800, BC400",thermostat,4,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,1,1 -"UI800, BC400",thermostat,4,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,2,1 -"UI800, BC400",thermostat,4,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"UI800, BC400",thermostat,4,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,4,1 -"UI800, BC400",thermostat,4,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"UI800, BC400",thermostat,4,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,6,1 -"UI800, BC400",thermostat,4,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"UI800, BC400",thermostat,4,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"UI800, BC400",thermostat,4,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,9,1 -"UI800, BC400",thermostat,4,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,10,1 -"UI800, BC400",thermostat,4,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,11,1 -"CR11",thermostat,10,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"CR11",thermostat,10,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"CR11",thermostat,10,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"CR11",thermostat,10,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"CR11",thermostat,10,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"CR11",thermostat,10,hc1.mode,operating mode,enum [manual\|auto], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 -"CR11",thermostat,10,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"CR11",thermostat,10,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC10",thermostat,65,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC10",thermostat,65,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC10",thermostat,65,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC10",thermostat,65,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC10",thermostat,65,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC10",thermostat,65,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC10",thermostat,65,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC10",thermostat,65,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC10",thermostat,65,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC10",thermostat,65,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"RC10",thermostat,65,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC10",thermostat,65,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC10",thermostat,65,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC10",thermostat,65,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC10",thermostat,65,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC10",thermostat,65,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC10",thermostat,65,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC10",thermostat,65,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC30",thermostat,67,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC30",thermostat,67,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC30",thermostat,67,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC30",thermostat,67,display,display,enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 -"RC30",thermostat,67,language,language,enum [german\|dutch\|french\|italian], ,false,sensor.thermostat_language,sensor.thermostat_language,6,0,1,66,1 -"RC30",thermostat,67,clockoffset,clock offset,int8 (>=-126<=126),seconds,true,number.thermostat_clock_offset,number.thermostat_clockoffset,6,0,1,67,1 -"RC30",thermostat,67,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"RC30",thermostat,67,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC30",thermostat,67,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 -"RC30",thermostat,67,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 -"RC30",thermostat,67,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"RC30",thermostat,67,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 -"RC30",thermostat,67,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"RC30",thermostat,67,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC30",thermostat,67,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC30",thermostat,67,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC30",thermostat,67,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC30",thermostat,67,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC30",thermostat,67,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"RC30",thermostat,67,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC30",thermostat,67,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"RC30",thermostat,67,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 -"RC30",thermostat,67,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,58,1 -"RC30",thermostat,67,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"RC30",thermostat,67,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC30",thermostat,67,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC30",thermostat,67,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,59,1 -"RC30",thermostat,67,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"RC30",thermostat,67,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"RC30",thermostat,67,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"RC30",thermostat,67,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC30",thermostat,67,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC30",thermostat,67,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,60,1 -"RC30",thermostat,67,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC30",thermostat,67,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"RC30",thermostat,67,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"RC30",thermostat,67,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"RC30",thermostat,67,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,61,13 -"RC30",thermostat,67,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,74,13 -"RC30",thermostat,67,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC30",thermostat,67,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,87,1 -"RC30",thermostat,67,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,88,1 -"RC30",thermostat,67,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC30",thermostat,67,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"RC30",thermostat,67,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"RC30",thermostat,67,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,89,1 -"RC30",thermostat,67,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,90,1 -"RC30",thermostat,67,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"RC30",thermostat,67,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"RC30",thermostat,67,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"RC30",thermostat,67,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,91,8 -"RC30",thermostat,67,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,99,8 -"RC30",thermostat,67,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"RC30",thermostat,67,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"RC30",thermostat,67,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,12,1 -"RC30",thermostat,67,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,13,1 -"RC30",thermostat,67,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"RC30",thermostat,67,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"RC30",thermostat,67,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,14,1 -"RC30",thermostat,67,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,15,1 -"RC30",thermostat,67,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,16,1 -"RC30",thermostat,67,dhw.switchtimeWW,program switchtime warm water,string, ,true,sensor.thermostat_dhw_program_switchtime_warm_water,sensor.thermostat_dhw_switchtimeWW,6,9,1,17,11 -"RC30",thermostat,67,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,28,8 -"RC30",thermostat,67,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,36,13 -"RC30",thermostat,67,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,49,13 -"RC20, Moduline 300",thermostat,77,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC20, Moduline 300",thermostat,77,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC20, Moduline 300",thermostat,77,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC20, Moduline 300",thermostat,77,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC20, Moduline 300",thermostat,77,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC20, Moduline 300",thermostat,77,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC20, Moduline 300",thermostat,77,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC20, Moduline 300",thermostat,77,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"RC20, Moduline 300",thermostat,77,hc1.offtemp,temperature when mode is off,uint8 (>=0<=127),C,true,number.thermostat_hc1_temperature_when_mode_is_off,number.thermostat_hc1_offtemp,6,1,1/2,107,1 -"RC20, Moduline 300",thermostat,77,hc1.daytemp2,day temperature T2,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T2,number.thermostat_hc1_daytemp2,6,1,1/2,108,1 -"RC20, Moduline 300",thermostat,77,hc1.daytemp3,day temperature T3,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T3,number.thermostat_hc1_daytemp3,6,1,1/2,109,1 -"RC20, Moduline 300",thermostat,77,hc1.daytemp4,day temperature T4,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T4,number.thermostat_hc1_daytemp4,6,1,1/2,110,1 -"RC20, Moduline 300",thermostat,77,hc1.nighttemp,night temperature T1,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature_T1,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC20, Moduline 300",thermostat,77,hc1.switchtime,program switchtime,string, ,true,sensor.thermostat_hc1_program_switchtime,sensor.thermostat_hc1_switchtime,6,1,1,111,8 -"Moduline 400",thermostat,78,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Moduline 400",thermostat,78,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Moduline 400",thermostat,78,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"Moduline 400",thermostat,78,clockoffset,clock offset,int8 (>=-126<=126),seconds,true,number.thermostat_clock_offset,number.thermostat_clockoffset,6,0,1,67,1 -"Moduline 400",thermostat,78,autodst,automatic change daylight saving time,boolean, ,true,switch.thermostat_automatic_change_daylight_saving_time,switch.thermostat_autodst,6,0,1,70,1 -"Moduline 400",thermostat,78,language,language,enum [german\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 -"Moduline 400",thermostat,78,backlight,key backlight,boolean, ,true,switch.thermostat_key_backlight,switch.thermostat_backlight,6,0,1,71,1 -"Moduline 400",thermostat,78,brightness,screen brightness,int8 (>=-15<=15), ,true,number.thermostat_screen_brightness,number.thermostat_brightness,6,0,1,72,1 -"Moduline 400",thermostat,78,mixingvalves,mixing valves,uint8 (>=0<=2), ,true,number.thermostat_mixing_valves,number.thermostat_mixingvalves,6,0,1,73,1 -"Moduline 400",thermostat,78,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"Moduline 400",thermostat,78,heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_heating_PID,select.thermostat_heatingpid,6,0,1,74,1 -"Moduline 400",thermostat,78,preheating,preheating in the clock program,boolean, ,true,switch.thermostat_preheating_in_the_clock_program,switch.thermostat_preheating,6,0,1,75,1 -"Moduline 400",thermostat,78,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"Moduline 400",thermostat,78,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"Moduline 400",thermostat,78,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"Moduline 400",thermostat,78,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"Moduline 400",thermostat,78,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"Moduline 400",thermostat,78,hc1.pause,pause time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,87,1 -"Moduline 400",thermostat,78,hc1.party,party time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,88,1 -"Moduline 400",thermostat,78,hc1.vacations1,vacation dates 1,string, ,true,sensor.thermostat_hc1_vacation_dates_1,sensor.thermostat_hc1_vacations1,6,1,1,119,11 -"Moduline 400",thermostat,78,hc1.vacations2,vacation dates 2,string, ,true,sensor.thermostat_hc1_vacation_dates_2,sensor.thermostat_hc1_vacations2,6,1,1,130,11 -"Moduline 400",thermostat,78,hc1.vacations3,vacation dates 3,string, ,true,sensor.thermostat_hc1_vacation_dates_3,sensor.thermostat_hc1_vacations3,6,1,1,141,11 -"Moduline 400",thermostat,78,hc1.vacations4,vacation dates 4,string, ,true,sensor.thermostat_hc1_vacation_dates_4,sensor.thermostat_hc1_vacations4,6,1,1,152,11 -"Moduline 400",thermostat,78,hc1.vacations5,vacation dates 5,string, ,true,sensor.thermostat_hc1_vacation_dates_5,sensor.thermostat_hc1_vacations5,6,1,1,163,11 -"Moduline 400",thermostat,78,hc1.vacations6,vacation dates 6,string, ,true,sensor.thermostat_hc1_vacation_dates_6,sensor.thermostat_hc1_vacations6,6,1,1,174,11 -"Moduline 400",thermostat,78,hc1.vacations7,vacation dates 7,string, ,true,sensor.thermostat_hc1_vacation_dates_7,sensor.thermostat_hc1_vacations7,6,1,1,185,11 -"Moduline 400",thermostat,78,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"Moduline 400",thermostat,78,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,91,8 -"Moduline 400",thermostat,78,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"Moduline 400",thermostat,78,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"Moduline 400",thermostat,78,hc1.holidaytemp,holiday temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,58,1 -"Moduline 400",thermostat,78,hc1.nighttemp,night temperature T1,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature_T1,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"Moduline 400",thermostat,78,hc1.daytemp2,day temperature T2,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T2,number.thermostat_hc1_daytemp2,6,1,1/2,108,1 -"Moduline 400",thermostat,78,hc1.daytemp3,day temperature T3,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T3,number.thermostat_hc1_daytemp3,6,1,1/2,109,1 -"Moduline 400",thermostat,78,hc1.daytemp4,day temperature T4,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T4,number.thermostat_hc1_daytemp4,6,1,1/2,110,1 -"Moduline 400",thermostat,78,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"Moduline 400",thermostat,78,hc1.offtemp,temperature when mode is off,uint8 (>=0<=127),C,true,number.thermostat_hc1_temperature_when_mode_is_off,number.thermostat_hc1_offtemp,6,1,1/2,107,1 -"Moduline 400",thermostat,78,dhw.mode,operating mode,enum [on\|off\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"Moduline 400",thermostat,78,dhw.whenmodeoff,when thermostat mode off,boolean, ,true,switch.thermostat_dhw_when_thermostat_mode_off,switch.thermostat_dhw_whenmodeoff,6,9,1,62,1 -"Moduline 400",thermostat,78,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"Moduline 400",thermostat,78,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"Moduline 400",thermostat,78,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,14,1 -"RC10, Moduline 100",thermostat,79,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC10, Moduline 100",thermostat,79,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC10, Moduline 100",thermostat,79,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"RC10, Moduline 100",thermostat,79,heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_heating_PID,select.thermostat_heatingpid,6,0,1,74,1 -"RC10, Moduline 100",thermostat,79,backlight,key backlight,boolean, ,true,switch.thermostat_key_backlight,switch.thermostat_backlight,6,0,1,71,1 -"RC10, Moduline 100",thermostat,79,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC10, Moduline 100",thermostat,79,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC10, Moduline 100",thermostat,79,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC10, Moduline 100",thermostat,79,hc1.mode,operating mode,enum [nofrost\|night\|day], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC10, Moduline 100",thermostat,79,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"RC10, Moduline 100",thermostat,79,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC10, Moduline 100",thermostat,79,hc1.reducehours,duration for nighttemp,uint8 (>=0<=254),hours,true,number.thermostat_hc1_duration_for_nighttemp,number.thermostat_hc1_reducehours,6,1,1,196,1 -"RC10, Moduline 100",thermostat,79,hc1.reduceminutes,remaining time for nightmode,uint16 (>=0<=31999),minutes,false,sensor.thermostat_hc1_remaining_time_for_nightmode,sensor.thermostat_hc1_reduceminutes,6,1,1,197,1 -"RC10, Moduline 100",thermostat,79,dhw.mode,operating mode,enum [on\|off\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"Moduline 200",thermostat,80,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Moduline 200",thermostat,80,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Moduline 200",thermostat,80,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"Moduline 200",thermostat,80,heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_heating_PID,select.thermostat_heatingpid,6,0,1,74,1 -"Moduline 200",thermostat,80,backlight,key backlight,boolean, ,true,switch.thermostat_key_backlight,switch.thermostat_backlight,6,0,1,71,1 -"Moduline 200",thermostat,80,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"Moduline 200",thermostat,80,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"Moduline 200",thermostat,80,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"Moduline 200",thermostat,80,hc1.mode,operating mode,enum [nofrost\|night\|day], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"Moduline 200",thermostat,80,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"Moduline 200",thermostat,80,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"Moduline 200",thermostat,80,hc1.reducehours,duration for nighttemp,uint8 (>=0<=254),hours,true,number.thermostat_hc1_duration_for_nighttemp,number.thermostat_hc1_reducehours,6,1,1,196,1 -"Moduline 200",thermostat,80,hc1.reduceminutes,remaining time for nightmode,uint16 (>=0<=31999),minutes,false,sensor.thermostat_hc1_remaining_time_for_nightmode,sensor.thermostat_hc1_reduceminutes,6,1,1,197,1 -"Moduline 200",thermostat,80,dhw.mode,operating mode,enum [on\|off\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"RC35",thermostat,86,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC35",thermostat,86,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC35",thermostat,86,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC35",thermostat,86,intoffset,internal temperature offset,int8 (>=-5<=5),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"RC35",thermostat,86,minexttemp,minimal external temperature,int8 (>=-30<=0),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC35",thermostat,86,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 -"RC35",thermostat,86,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 -"RC35",thermostat,86,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"RC35",thermostat,86,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 -"RC35",thermostat,86,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"RC35",thermostat,86,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC35",thermostat,86,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC35",thermostat,86,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC35",thermostat,86,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC35",thermostat,86,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC35",thermostat,86,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"RC35",thermostat,86,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC35",thermostat,86,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"RC35",thermostat,86,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 -"RC35",thermostat,86,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,58,1 -"RC35",thermostat,86,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"RC35",thermostat,86,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC35",thermostat,86,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC35",thermostat,86,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,59,1 -"RC35",thermostat,86,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"RC35",thermostat,86,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"RC35",thermostat,86,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"RC35",thermostat,86,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC35",thermostat,86,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC35",thermostat,86,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,60,1 -"RC35",thermostat,86,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC35",thermostat,86,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"RC35",thermostat,86,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"RC35",thermostat,86,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"RC35",thermostat,86,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,61,13 -"RC35",thermostat,86,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,74,13 -"RC35",thermostat,86,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC35",thermostat,86,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,87,1 -"RC35",thermostat,86,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,88,1 -"RC35",thermostat,86,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC35",thermostat,86,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"RC35",thermostat,86,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"RC35",thermostat,86,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,89,1 -"RC35",thermostat,86,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,90,1 -"RC35",thermostat,86,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"RC35",thermostat,86,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"RC35",thermostat,86,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"RC35",thermostat,86,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,91,8 -"RC35",thermostat,86,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,99,8 -"RC35",thermostat,86,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"RC35",thermostat,86,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"RC35",thermostat,86,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,12,1 -"RC35",thermostat,86,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,13,1 -"RC35",thermostat,86,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"RC35",thermostat,86,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"RC35",thermostat,86,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,14,1 -"RC35",thermostat,86,dhw.maxtemp,maximum temperature,uint8 (>=60<=80),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,15,1 -"RC35",thermostat,86,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,16,1 -"RC35",thermostat,86,dhw.switchtimeWW,program switchtime warm water,string, ,true,sensor.thermostat_dhw_program_switchtime_warm_water,sensor.thermostat_dhw_switchtimeWW,6,9,1,17,11 -"RC35",thermostat,86,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,28,8 -"RC35",thermostat,86,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,36,13 -"RC35",thermostat,86,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,49,13 -"RC10, Moduline 100",thermostat,90,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC10, Moduline 100",thermostat,90,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC10, Moduline 100",thermostat,90,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC10, Moduline 100",thermostat,90,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC10, Moduline 100",thermostat,90,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC10, Moduline 100",thermostat,90,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC10, Moduline 100",thermostat,90,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC10, Moduline 100",thermostat,90,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC10, Moduline 100",thermostat,90,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC10, Moduline 100",thermostat,90,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"RC10, Moduline 100",thermostat,90,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC10, Moduline 100",thermostat,90,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC10, Moduline 100",thermostat,90,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC10, Moduline 100",thermostat,90,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC10, Moduline 100",thermostat,90,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC10, Moduline 100",thermostat,90,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC10, Moduline 100",thermostat,90,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC10, Moduline 100",thermostat,90,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC20RF",thermostat,93,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC20RF",thermostat,93,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC20RF",thermostat,93,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC20RF",thermostat,93,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC20RF",thermostat,93,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC20RF",thermostat,93,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC20RF",thermostat,93,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC20RF",thermostat,93,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"RC20RF",thermostat,93,hc1.offtemp,temperature when mode is off,uint8 (>=0<=127),C,true,number.thermostat_hc1_temperature_when_mode_is_off,number.thermostat_hc1_offtemp,6,1,1/2,107,1 -"RC20RF",thermostat,93,hc1.daytemp2,day temperature T2,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T2,number.thermostat_hc1_daytemp2,6,1,1/2,108,1 -"RC20RF",thermostat,93,hc1.daytemp3,day temperature T3,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T3,number.thermostat_hc1_daytemp3,6,1,1/2,109,1 -"RC20RF",thermostat,93,hc1.daytemp4,day temperature T4,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T4,number.thermostat_hc1_daytemp4,6,1,1/2,110,1 -"RC20RF",thermostat,93,hc1.nighttemp,night temperature T1,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature_T1,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC20RF",thermostat,93,hc1.switchtime,program switchtime,string, ,true,sensor.thermostat_hc1_program_switchtime,sensor.thermostat_hc1_switchtime,6,1,1,111,8 -"RFM20 Remote",thermostat,94,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RFM20 Remote",thermostat,94,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RFM20 Remote",thermostat,94,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RFM20 Remote",thermostat,94,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RFM20 Remote",thermostat,94,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RFM20 Remote",thermostat,94,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC25",thermostat,151,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC25",thermostat,151,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC25",thermostat,151,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC25",thermostat,151,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC25",thermostat,151,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC25",thermostat,151,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC25",thermostat,151,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC25",thermostat,151,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC25",thermostat,151,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC25",thermostat,151,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"RC25",thermostat,151,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"RC25",thermostat,151,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC25",thermostat,151,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC25",thermostat,151,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC25",thermostat,151,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC25",thermostat,151,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC25",thermostat,151,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC25",thermostat,151,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC200, CW100, CR120, CR50",thermostat,157,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC200, CW100, CR120, CR50",thermostat,157,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC200, CW100, CR120, CR50",thermostat,157,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC200, CW100, CR120, CR50",thermostat,157,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"RC200, CW100, CR120, CR50",thermostat,157,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 -"RC200, CW100, CR120, CR50",thermostat,157,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 -"RC200, CW100, CR120, CR50",thermostat,157,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 -"RC200, CW100, CR120, CR50",thermostat,157,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"RC200, CW100, CR120, CR50",thermostat,157,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC200, CW100, CR120, CR50",thermostat,157,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"RC200, CW100, CR120, CR50",thermostat,157,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 -"RC200, CW100, CR120, CR50",thermostat,157,vacations,vacation dates,string, ,true,sensor.thermostat_vacation_dates,sensor.thermostat_vacations,6,0,1,76,13 -"RC200, CW100, CR120, CR50",thermostat,157,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"RC200, CW100, CR120, CR50",thermostat,157,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"RC200, CW100, CR120, CR50",thermostat,157,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"RC200, CW100, CR120, CR50",thermostat,157,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"RC200, CW100, CR120, CR50",thermostat,157,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"RC200, CW100, CR120, CR50",thermostat,157,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"RC200, CW100, CR120, CR50",thermostat,157,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"RC200, CW100, CR120, CR50",thermostat,157,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 -"RC200, CW100, CR120, CR50",thermostat,157,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 -"RC200, CW100, CR120, CR50",thermostat,157,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 -"RC200, CW100, CR120, CR50",thermostat,157,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.mode,operating mode,enum [manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.controlmode,control mode,enum [optimized\|simple\|n/a\|room\|power], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 -"RC200, CW100, CR120, CR50",thermostat,157,hc1.currsolarinfl,curent solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_curent_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,1,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,2,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,4,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,6,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,9,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,10,1 -"RC200, CW100, CR120, CR50",thermostat,157,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,11,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.mode,operating mode,enum [manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currsolarinfl,curent solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_curent_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.mode,operating mode,enum [off\|normal\|comfort\|auto\|own prog], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,1,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,2,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,4,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,6,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,9,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,10,1 -"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,11,1 -"RC100, CR10, Moduline 1000/1010",thermostat,165,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC100, CR10, Moduline 1000/1010",thermostat,165,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.mode,operating mode,enum [manual\|auto], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 -"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"Rego 2000/3000",thermostat,172,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Rego 2000/3000",thermostat,172,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Rego 2000/3000",thermostat,172,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"Rego 2000/3000",thermostat,172,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"Rego 2000/3000",thermostat,172,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 -"Rego 2000/3000",thermostat,172,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 -"Rego 2000/3000",thermostat,172,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 -"Rego 2000/3000",thermostat,172,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"Rego 2000/3000",thermostat,172,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"Rego 2000/3000",thermostat,172,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"Rego 2000/3000",thermostat,172,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 -"Rego 2000/3000",thermostat,172,vacations,vacation dates,string, ,true,sensor.thermostat_vacation_dates,sensor.thermostat_vacations,6,0,1,76,13 -"Rego 2000/3000",thermostat,172,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"Rego 2000/3000",thermostat,172,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"Rego 2000/3000",thermostat,172,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"Rego 2000/3000",thermostat,172,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"Rego 2000/3000",thermostat,172,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"Rego 2000/3000",thermostat,172,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"Rego 2000/3000",thermostat,172,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"Rego 2000/3000",thermostat,172,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 -"Rego 2000/3000",thermostat,172,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 -"Rego 2000/3000",thermostat,172,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 -"Rego 2000/3000",thermostat,172,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 -"Rego 2000/3000",thermostat,172,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"Rego 2000/3000",thermostat,172,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"Rego 2000/3000",thermostat,172,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"Rego 2000/3000",thermostat,172,hc1.mode,operating mode,enum [manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"Rego 2000/3000",thermostat,172,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"Rego 2000/3000",thermostat,172,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"Rego 2000/3000",thermostat,172,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"Rego 2000/3000",thermostat,172,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 -"Rego 2000/3000",thermostat,172,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"Rego 2000/3000",thermostat,172,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"Rego 2000/3000",thermostat,172,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 -"Rego 2000/3000",thermostat,172,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"Rego 2000/3000",thermostat,172,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"Rego 2000/3000",thermostat,172,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"Rego 2000/3000",thermostat,172,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 -"Rego 2000/3000",thermostat,172,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 -"Rego 2000/3000",thermostat,172,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"Rego 2000/3000",thermostat,172,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"Rego 2000/3000",thermostat,172,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"Rego 2000/3000",thermostat,172,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"Rego 2000/3000",thermostat,172,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 -"Rego 2000/3000",thermostat,172,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 -"Rego 2000/3000",thermostat,172,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"Rego 2000/3000",thermostat,172,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 -"Rego 2000/3000",thermostat,172,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 -"Rego 2000/3000",thermostat,172,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"Rego 2000/3000",thermostat,172,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"Rego 2000/3000",thermostat,172,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"Rego 2000/3000",thermostat,172,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 -"Rego 2000/3000",thermostat,172,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 -"Rego 2000/3000",thermostat,172,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"Rego 2000/3000",thermostat,172,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"Rego 2000/3000",thermostat,172,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"Rego 2000/3000",thermostat,172,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"Rego 2000/3000",thermostat,172,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"Rego 2000/3000",thermostat,172,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 -"Rego 2000/3000",thermostat,172,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 -"Rego 2000/3000",thermostat,172,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 -"Rego 2000/3000",thermostat,172,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 -"Rego 2000/3000",thermostat,172,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 -"Rego 2000/3000",thermostat,172,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 -"Rego 2000/3000",thermostat,172,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"Rego 2000/3000",thermostat,172,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"Rego 2000/3000",thermostat,172,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 -"Rego 2000/3000",thermostat,172,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 -"Rego 2000/3000",thermostat,172,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 -"Rego 2000/3000",thermostat,172,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 -"Rego 2000/3000",thermostat,172,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 -"Rego 2000/3000",thermostat,172,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 -"Rego 2000/3000",thermostat,172,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 -"Rego 2000/3000",thermostat,172,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 -"Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 -"Rego 2000/3000",thermostat,172,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 -"Rego 2000/3000",thermostat,172,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 -"Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 -"Rego 2000/3000",thermostat,172,hc1.currsolarinfl,curent solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_curent_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 -"Rego 2000/3000",thermostat,172,dhw.mode,operating mode,enum [normal\|comfort\|eco+], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"Rego 2000/3000",thermostat,172,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,1,1 -"Rego 2000/3000",thermostat,172,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,2,1 -"Rego 2000/3000",thermostat,172,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"Rego 2000/3000",thermostat,172,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,4,1 -"Rego 2000/3000",thermostat,172,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"Rego 2000/3000",thermostat,172,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,6,1 -"Rego 2000/3000",thermostat,172,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"Rego 2000/3000",thermostat,172,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"Rego 2000/3000",thermostat,172,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,9,1 -"Rego 2000/3000",thermostat,172,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,10,1 -"Rego 2000/3000",thermostat,172,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,11,1 -"Comfort RF",thermostat,215,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Comfort RF",thermostat,215,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Comfort RF",thermostat,215,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"Comfort RF",thermostat,215,hc1.seltemp,selected room temperature,int16 (>=-15999<=15999),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/2,0,1 -"Comfort RF",thermostat,215,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"Comfort RF",thermostat,215,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"Comfort RF",thermostat,215,hc1.mode,operating mode,enum [auto\|off], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 -"Comfort RF",thermostat,215,hc1.modetype,mode type,enum [off\|on], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"Comfort RF",thermostat,215,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"CRF200S",thermostat,216,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"CRF200S",thermostat,216,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"CRF200S",thermostat,216,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"CRF200S",thermostat,216,hc1.seltemp,selected room temperature,int16 (>=-15999<=15999),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/2,0,1 -"CRF200S",thermostat,216,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"CRF200S",thermostat,216,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"CRF200S",thermostat,216,hc1.mode,operating mode,enum [auto\|off], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 -"CRF200S",thermostat,216,hc1.modetype,mode type,enum [off\|on], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"CRF200S",thermostat,216,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"Comfort+2RF",thermostat,246,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Comfort+2RF",thermostat,246,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Comfort+2RF",thermostat,246,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"Comfort+2RF",thermostat,246,hc1.seltemp,selected room temperature,int16 (>=-15999<=15999),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/2,0,1 -"Comfort+2RF",thermostat,246,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"Comfort+2RF",thermostat,246,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"Comfort+2RF",thermostat,246,hc1.mode,operating mode,enum [auto\|off], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 -"Comfort+2RF",thermostat,246,hc1.modetype,mode type,enum [off\|on], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"Comfort+2RF",thermostat,246,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currsolarinfl,curent solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_curent_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.mode,operating mode,enum [off\|eco+\|eco\|comfort\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,1,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,2,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,4,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,6,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,9,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,10,1 -"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,11,1 -"ES72, RC20",thermostat,66,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"ES72, RC20",thermostat,66,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"ES72, RC20",thermostat,66,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"ES72, RC20",thermostat,66,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"ES72, RC20",thermostat,66,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"ES72, RC20",thermostat,66,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"ES72, RC20",thermostat,66,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"ES72, RC20",thermostat,66,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"ES72, RC20",thermostat,66,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"ES72, RC20",thermostat,66,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"ES72, RC20",thermostat,66,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"ES72, RC20",thermostat,66,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"ES72, RC20",thermostat,66,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"ES72, RC20",thermostat,66,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"ES72, RC20",thermostat,66,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"ES72, RC20",thermostat,66,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"ES72, RC20",thermostat,66,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"ES72, RC20",thermostat,66,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"ES73",thermostat,76,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"ES73",thermostat,76,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"ES73",thermostat,76,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"ES73",thermostat,76,display,display,enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 -"ES73",thermostat,76,language,language,enum [german\|dutch\|french\|italian], ,false,sensor.thermostat_language,sensor.thermostat_language,6,0,1,66,1 -"ES73",thermostat,76,clockoffset,clock offset,int8 (>=-126<=126),seconds,true,number.thermostat_clock_offset,number.thermostat_clockoffset,6,0,1,67,1 -"ES73",thermostat,76,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"ES73",thermostat,76,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"ES73",thermostat,76,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 -"ES73",thermostat,76,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 -"ES73",thermostat,76,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"ES73",thermostat,76,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 -"ES73",thermostat,76,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"ES73",thermostat,76,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"ES73",thermostat,76,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"ES73",thermostat,76,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"ES73",thermostat,76,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"ES73",thermostat,76,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"ES73",thermostat,76,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"ES73",thermostat,76,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"ES73",thermostat,76,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"ES73",thermostat,76,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 -"ES73",thermostat,76,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,58,1 -"ES73",thermostat,76,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"ES73",thermostat,76,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"ES73",thermostat,76,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"ES73",thermostat,76,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,59,1 -"ES73",thermostat,76,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"ES73",thermostat,76,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"ES73",thermostat,76,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"ES73",thermostat,76,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"ES73",thermostat,76,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"ES73",thermostat,76,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,60,1 -"ES73",thermostat,76,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"ES73",thermostat,76,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"ES73",thermostat,76,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"ES73",thermostat,76,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"ES73",thermostat,76,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,61,13 -"ES73",thermostat,76,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,74,13 -"ES73",thermostat,76,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"ES73",thermostat,76,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,87,1 -"ES73",thermostat,76,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,88,1 -"ES73",thermostat,76,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"ES73",thermostat,76,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"ES73",thermostat,76,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"ES73",thermostat,76,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,89,1 -"ES73",thermostat,76,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,90,1 -"ES73",thermostat,76,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"ES73",thermostat,76,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"ES73",thermostat,76,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"ES73",thermostat,76,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,91,8 -"ES73",thermostat,76,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,99,8 -"ES73",thermostat,76,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"ES73",thermostat,76,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"ES73",thermostat,76,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,12,1 -"ES73",thermostat,76,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,13,1 -"ES73",thermostat,76,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"ES73",thermostat,76,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"ES73",thermostat,76,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,14,1 -"ES73",thermostat,76,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,15,1 -"ES73",thermostat,76,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,16,1 -"ES73",thermostat,76,dhw.switchtimeWW,program switchtime warm water,string, ,true,sensor.thermostat_dhw_program_switchtime_warm_water,sensor.thermostat_dhw_switchtimeWW,6,9,1,17,11 -"ES73",thermostat,76,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,28,8 -"ES73",thermostat,76,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,36,13 -"ES73",thermostat,76,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,49,13 -"ES72, RC20",thermostat,113,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"ES72, RC20",thermostat,113,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"ES72, RC20",thermostat,113,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"ES72, RC20",thermostat,113,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"ES72, RC20",thermostat,113,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"ES72, RC20",thermostat,113,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"ES72, RC20",thermostat,113,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"ES72, RC20",thermostat,113,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"ES72, RC20",thermostat,113,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"ES72, RC20",thermostat,113,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"ES72, RC20",thermostat,113,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"ES72, RC20",thermostat,113,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"ES72, RC20",thermostat,113,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"ES72, RC20",thermostat,113,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"ES72, RC20",thermostat,113,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"ES72, RC20",thermostat,113,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"ES72, RC20",thermostat,113,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"ES72, RC20",thermostat,113,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"ES79",thermostat,156,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"ES79",thermostat,156,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"ES79",thermostat,156,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"ES79",thermostat,156,intoffset,internal temperature offset,int8 (>=-5<=5),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 -"ES79",thermostat,156,minexttemp,minimal external temperature,int8 (>=-30<=0),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 -"ES79",thermostat,156,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 -"ES79",thermostat,156,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 -"ES79",thermostat,156,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 -"ES79",thermostat,156,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 -"ES79",thermostat,156,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 -"ES79",thermostat,156,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"ES79",thermostat,156,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"ES79",thermostat,156,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"ES79",thermostat,156,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"ES79",thermostat,156,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"ES79",thermostat,156,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,56,1 -"ES79",thermostat,156,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,57,1 -"ES79",thermostat,156,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"ES79",thermostat,156,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 -"ES79",thermostat,156,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,58,1 -"ES79",thermostat,156,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"ES79",thermostat,156,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 -"ES79",thermostat,156,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 -"ES79",thermostat,156,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,59,1 -"ES79",thermostat,156,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 -"ES79",thermostat,156,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 -"ES79",thermostat,156,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 -"ES79",thermostat,156,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"ES79",thermostat,156,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"ES79",thermostat,156,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,60,1 -"ES79",thermostat,156,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"ES79",thermostat,156,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 -"ES79",thermostat,156,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"ES79",thermostat,156,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"ES79",thermostat,156,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,61,13 -"ES79",thermostat,156,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,74,13 -"ES79",thermostat,156,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"ES79",thermostat,156,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,87,1 -"ES79",thermostat,156,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,88,1 -"ES79",thermostat,156,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 -"ES79",thermostat,156,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 -"ES79",thermostat,156,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 -"ES79",thermostat,156,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,89,1 -"ES79",thermostat,156,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,90,1 -"ES79",thermostat,156,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"ES79",thermostat,156,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 -"ES79",thermostat,156,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"ES79",thermostat,156,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,91,8 -"ES79",thermostat,156,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,99,8 -"ES79",thermostat,156,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 -"ES79",thermostat,156,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,3,1 -"ES79",thermostat,156,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,12,1 -"ES79",thermostat,156,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,13,1 -"ES79",thermostat,156,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,7,1 -"ES79",thermostat,156,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,8,1 -"ES79",thermostat,156,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,14,1 -"ES79",thermostat,156,dhw.maxtemp,maximum temperature,uint8 (>=60<=80),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,15,1 -"ES79",thermostat,156,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,16,1 -"ES79",thermostat,156,dhw.switchtimeWW,program switchtime warm water,string, ,true,sensor.thermostat_dhw_program_switchtime_warm_water,sensor.thermostat_dhw_switchtimeWW,6,9,1,17,11 -"ES79",thermostat,156,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,28,8 -"ES79",thermostat,156,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,36,13 -"ES79",thermostat,156,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,49,13 -"FW100",thermostat,105,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FW100",thermostat,105,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FW100",thermostat,105,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FW100",thermostat,105,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FW100",thermostat,105,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FW100",thermostat,105,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FW100",thermostat,105,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FW100",thermostat,105,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FW100",thermostat,105,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FW100",thermostat,105,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FW100",thermostat,105,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FW100",thermostat,105,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FW100",thermostat,105,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FW100",thermostat,105,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FW100",thermostat,105,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FW100",thermostat,105,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FW100",thermostat,105,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FW100",thermostat,105,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FW100",thermostat,105,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FW100",thermostat,105,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FW100",thermostat,105,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FW100",thermostat,105,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FW100",thermostat,105,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FW100",thermostat,105,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FW100",thermostat,105,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FW100",thermostat,105,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FW100",thermostat,105,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FW100",thermostat,105,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FW100",thermostat,105,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FW100",thermostat,105,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FW100",thermostat,105,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FW100",thermostat,105,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FW100",thermostat,105,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FW100",thermostat,105,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FW100",thermostat,105,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FW200",thermostat,106,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FW200",thermostat,106,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FW200",thermostat,106,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FW200",thermostat,106,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FW200",thermostat,106,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FW200",thermostat,106,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FW200",thermostat,106,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FW200",thermostat,106,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FW200",thermostat,106,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FW200",thermostat,106,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FW200",thermostat,106,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FW200",thermostat,106,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FW200",thermostat,106,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FW200",thermostat,106,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FW200",thermostat,106,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FW200",thermostat,106,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FW200",thermostat,106,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FW200",thermostat,106,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FW200",thermostat,106,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FW200",thermostat,106,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FW200",thermostat,106,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FW200",thermostat,106,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FW200",thermostat,106,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FW200",thermostat,106,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FW200",thermostat,106,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FW200",thermostat,106,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FW200",thermostat,106,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FW200",thermostat,106,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FW200",thermostat,106,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FW200",thermostat,106,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FW200",thermostat,106,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FW200",thermostat,106,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FW200",thermostat,106,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FW200",thermostat,106,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FW200",thermostat,106,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FR100",thermostat,107,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FR100",thermostat,107,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FR100",thermostat,107,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FR100",thermostat,107,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FR100",thermostat,107,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FR100",thermostat,107,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FR100",thermostat,107,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FR100",thermostat,107,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FR100",thermostat,107,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FR100",thermostat,107,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FR100",thermostat,107,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FR100",thermostat,107,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FR100",thermostat,107,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FR100",thermostat,107,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FR100",thermostat,107,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FR100",thermostat,107,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FR100",thermostat,107,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FR100",thermostat,107,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FR100",thermostat,107,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FR100",thermostat,107,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FR100",thermostat,107,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FR100",thermostat,107,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FR100",thermostat,107,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FR100",thermostat,107,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FR100",thermostat,107,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FR100",thermostat,107,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FR100",thermostat,107,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FR100",thermostat,107,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FR100",thermostat,107,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FR100",thermostat,107,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FR100",thermostat,107,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FR100",thermostat,107,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FR100",thermostat,107,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FR100",thermostat,107,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FR100",thermostat,107,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FR110",thermostat,108,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FR110",thermostat,108,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FR110",thermostat,108,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FR110",thermostat,108,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FR110",thermostat,108,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FR110",thermostat,108,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FR110",thermostat,108,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FR110",thermostat,108,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FR110",thermostat,108,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FR110",thermostat,108,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FR110",thermostat,108,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FR110",thermostat,108,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FR110",thermostat,108,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FR110",thermostat,108,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FR110",thermostat,108,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FR110",thermostat,108,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FR110",thermostat,108,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FR110",thermostat,108,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FR110",thermostat,108,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FR110",thermostat,108,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FR110",thermostat,108,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FR110",thermostat,108,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FR110",thermostat,108,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FR110",thermostat,108,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FR110",thermostat,108,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FR110",thermostat,108,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FR110",thermostat,108,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FR110",thermostat,108,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FR110",thermostat,108,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FR110",thermostat,108,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FR110",thermostat,108,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FR110",thermostat,108,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FR110",thermostat,108,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FR110",thermostat,108,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FR110",thermostat,108,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FB10",thermostat,109,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FB10",thermostat,109,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FB10",thermostat,109,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FB10",thermostat,109,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FB10",thermostat,109,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FB10",thermostat,109,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FB10",thermostat,109,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FB10",thermostat,109,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FB10",thermostat,109,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FB10",thermostat,109,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FB10",thermostat,109,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FB10",thermostat,109,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FB10",thermostat,109,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FB10",thermostat,109,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FB10",thermostat,109,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FB10",thermostat,109,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FB10",thermostat,109,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FB10",thermostat,109,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FB10",thermostat,109,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FB10",thermostat,109,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FB10",thermostat,109,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FB10",thermostat,109,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FB10",thermostat,109,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FB10",thermostat,109,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FB10",thermostat,109,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FB10",thermostat,109,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FB10",thermostat,109,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FB10",thermostat,109,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FB10",thermostat,109,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FB10",thermostat,109,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FB10",thermostat,109,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FB10",thermostat,109,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FB10",thermostat,109,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FB10",thermostat,109,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FB10",thermostat,109,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FB100",thermostat,110,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FB100",thermostat,110,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FB100",thermostat,110,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FB100",thermostat,110,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FB100",thermostat,110,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FB100",thermostat,110,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FB100",thermostat,110,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FB100",thermostat,110,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FB100",thermostat,110,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FB100",thermostat,110,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FB100",thermostat,110,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FB100",thermostat,110,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FB100",thermostat,110,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FB100",thermostat,110,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FB100",thermostat,110,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FB100",thermostat,110,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FB100",thermostat,110,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FB100",thermostat,110,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FB100",thermostat,110,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FB100",thermostat,110,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FB100",thermostat,110,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FB100",thermostat,110,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FB100",thermostat,110,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FB100",thermostat,110,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FB100",thermostat,110,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FB100",thermostat,110,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FB100",thermostat,110,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FB100",thermostat,110,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FB100",thermostat,110,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FB100",thermostat,110,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FB100",thermostat,110,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FB100",thermostat,110,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FB100",thermostat,110,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FB100",thermostat,110,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FB100",thermostat,110,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FR10",thermostat,111,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FR10",thermostat,111,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FR10",thermostat,111,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FR10",thermostat,111,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FR10",thermostat,111,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FR10",thermostat,111,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FR10",thermostat,111,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FR10",thermostat,111,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FR10",thermostat,111,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FR10",thermostat,111,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FR10",thermostat,111,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FR10",thermostat,111,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FR10",thermostat,111,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FR10",thermostat,111,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FR10",thermostat,111,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FR10",thermostat,111,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FR10",thermostat,111,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FR10",thermostat,111,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FR10",thermostat,111,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FR10",thermostat,111,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FR10",thermostat,111,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FR10",thermostat,111,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FR10",thermostat,111,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FR10",thermostat,111,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FR10",thermostat,111,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FR10",thermostat,111,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FR10",thermostat,111,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FR10",thermostat,111,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FR10",thermostat,111,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FR10",thermostat,111,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FR10",thermostat,111,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FR10",thermostat,111,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FR10",thermostat,111,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FR10",thermostat,111,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FR10",thermostat,111,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FW500",thermostat,116,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FW500",thermostat,116,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FW500",thermostat,116,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FW500",thermostat,116,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FW500",thermostat,116,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FW500",thermostat,116,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FW500",thermostat,116,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FW500",thermostat,116,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FW500",thermostat,116,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FW500",thermostat,116,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FW500",thermostat,116,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FW500",thermostat,116,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FW500",thermostat,116,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FW500",thermostat,116,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FW500",thermostat,116,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FW500",thermostat,116,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FW500",thermostat,116,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FW500",thermostat,116,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FW500",thermostat,116,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FW500",thermostat,116,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FW500",thermostat,116,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FW500",thermostat,116,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FW500",thermostat,116,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FW500",thermostat,116,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FW500",thermostat,116,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FW500",thermostat,116,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FW500",thermostat,116,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FW500",thermostat,116,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FW500",thermostat,116,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FW500",thermostat,116,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FW500",thermostat,116,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FW500",thermostat,116,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FW500",thermostat,116,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FW500",thermostat,116,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FW500",thermostat,116,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FR50",thermostat,147,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FR50",thermostat,147,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FR50",thermostat,147,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FR50",thermostat,147,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FR50",thermostat,147,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FR50",thermostat,147,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FR50",thermostat,147,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FR50",thermostat,147,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FR50",thermostat,147,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FR50",thermostat,147,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FR50",thermostat,147,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FR50",thermostat,147,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FR50",thermostat,147,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FR50",thermostat,147,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FR50",thermostat,147,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FR50",thermostat,147,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FR50",thermostat,147,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FR50",thermostat,147,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FR50",thermostat,147,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FR50",thermostat,147,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FR50",thermostat,147,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FR50",thermostat,147,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FR50",thermostat,147,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FR50",thermostat,147,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FR50",thermostat,147,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FR50",thermostat,147,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FR50",thermostat,147,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FR50",thermostat,147,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FR50",thermostat,147,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FR50",thermostat,147,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FR50",thermostat,147,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FR50",thermostat,147,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FR50",thermostat,147,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FR50",thermostat,147,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FR50",thermostat,147,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FR120",thermostat,191,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FR120",thermostat,191,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FR120",thermostat,191,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FR120",thermostat,191,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FR120",thermostat,191,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FR120",thermostat,191,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FR120",thermostat,191,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FR120",thermostat,191,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FR120",thermostat,191,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FR120",thermostat,191,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FR120",thermostat,191,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FR120",thermostat,191,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FR120",thermostat,191,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FR120",thermostat,191,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FR120",thermostat,191,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FR120",thermostat,191,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FR120",thermostat,191,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FR120",thermostat,191,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FR120",thermostat,191,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FR120",thermostat,191,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FR120",thermostat,191,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FR120",thermostat,191,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FR120",thermostat,191,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FR120",thermostat,191,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FR120",thermostat,191,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FR120",thermostat,191,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FR120",thermostat,191,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FR120",thermostat,191,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FR120",thermostat,191,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FR120",thermostat,191,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FR120",thermostat,191,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FR120",thermostat,191,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FR120",thermostat,191,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FR120",thermostat,191,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FR120",thermostat,191,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"FW120",thermostat,192,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"FW120",thermostat,192,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"FW120",thermostat,192,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"FW120",thermostat,192,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 -"FW120",thermostat,192,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 -"FW120",thermostat,192,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 -"FW120",thermostat,192,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 -"FW120",thermostat,192,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 -"FW120",thermostat,192,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 -"FW120",thermostat,192,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 -"FW120",thermostat,192,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 -"FW120",thermostat,192,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"FW120",thermostat,192,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"FW120",thermostat,192,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 -"FW120",thermostat,192,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 -"FW120",thermostat,192,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,198,1 -"FW120",thermostat,192,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 -"FW120",thermostat,192,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 -"FW120",thermostat,192,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 -"FW120",thermostat,192,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 -"FW120",thermostat,192,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 -"FW120",thermostat,192,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 -"FW120",thermostat,192,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 -"FW120",thermostat,192,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,199,1 -"FW120",thermostat,192,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,59,1 -"FW120",thermostat,192,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 -"FW120",thermostat,192,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,200,1 -"FW120",thermostat,192,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 -"FW120",thermostat,192,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 -"FW120",thermostat,192,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 -"FW120",thermostat,192,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 -"FW120",thermostat,192,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 -"FW120",thermostat,192,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 -"FW120",thermostat,192,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 -"FW120",thermostat,192,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,5,1 -"RT800, RC220",thermostat,3,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RT800, RC220",thermostat,3,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RT800, RC220",thermostat,3,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RT800, RC220",thermostat,3,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RT800, RC220",thermostat,3,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RT800, RC220",thermostat,3,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"RC100H, CR10H",thermostat,200,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"RC100H, CR10H",thermostat,200,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"RC100H, CR10H",thermostat,200,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"RC100H, CR10H",thermostat,200,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"RC100H, CR10H",thermostat,200,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"RC100H, CR10H",thermostat,200,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"TR120RF, CR20RF",thermostat,249,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 -"TR120RF, CR20RF",thermostat,249,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 -"TR120RF, CR20RF",thermostat,249,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 -"TR120RF, CR20RF",thermostat,249,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 -"TR120RF, CR20RF",thermostat,249,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 -"TR120RF, CR20RF",thermostat,249,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 -"MM10",mixer,69,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"MM10",mixer,69,hc1.valvestatus,mixing valve actuator (VC1),int8 (>=-100<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"MM10",mixer,69,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"MM10",mixer,69,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"MM10",mixer,69,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 -"MM10",mixer,69,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,5,1 -"IPM",mixer,100,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"IPM",mixer,100,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"IPM",mixer,100,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"IPM",mixer,100,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"IPM",mixer,100,hc1.flowtempvf,flow temperature in header (T0/Vf),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_in_header_(T0/Vf),sensor.mixer_hc1_flowtempvf,7,1,1/10,6,1 -"IPM2",mixer,102,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"IPM2",mixer,102,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"IPM2",mixer,102,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"IPM2",mixer,102,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"IPM2",mixer,102,hc1.flowtempvf,flow temperature in header (T0/Vf),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_in_header_(T0/Vf),sensor.mixer_hc1_flowtempvf,7,1,1/10,6,1 -"MM50",mixer,159,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"MM50",mixer,159,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"MM50",mixer,159,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"MM50",mixer,159,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"MM50",mixer,159,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 -"MM50",mixer,159,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,5,1 -"MM50",mixer,159,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,7,1 -"MM100",mixer,160,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"MM100",mixer,160,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"MM100",mixer,160,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"MM100",mixer,160,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"MM100",mixer,160,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 -"MM100",mixer,160,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,5,1 -"MM100",mixer,160,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,7,1 -"MM200",mixer,161,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"MM200",mixer,161,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"MM200",mixer,161,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"MM200",mixer,161,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"MM200",mixer,161,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 -"MM200",mixer,161,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,5,1 -"MM200",mixer,161,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,7,1 -"MZ100",mixer,193,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"MZ100",mixer,193,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"MZ100",mixer,193,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"MZ100",mixer,193,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"MZ100",mixer,193,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 -"MZ100",mixer,193,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,5,1 -"MZ100",mixer,193,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,7,1 -"HM210",mixer,248,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 -"HM210",mixer,248,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 -"HM210",mixer,248,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 -"HM210",mixer,248,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 -"HM210",mixer,248,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 -"HM210",mixer,248,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,5,1 -"HM210",mixer,248,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,7,1 -"SM10",solar,73,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 -"SM10",solar,73,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 -"SM10",solar,73,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 -"SM10",solar,73,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 -"SM10",solar,73,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 -"SM10",solar,73,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 -"SM10",solar,73,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 -"SM10",solar,73,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 -"SM10",solar,73,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,1,9,1 -"SM10",solar,73,turnondiff,pump turn on difference,uint8 (>=0<=254),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1,10,1 -"SM10",solar,73,turnoffdiff,pump turn off difference,uint8 (>=0<=254),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1,11,1 -"SM10",solar,73,solarpower,actual solar power,int16 (>=-31999<=31999),W,false,sensor.solar_actual_solar_power,sensor.solar_solarpower,8,0,1,12,1 -"SM10",solar,73,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 -"SM10",solar,73,maxflow,maximum solar flow,uint8 (>=0<=25),l/min,true,number.solar_maximum_solar_flow,number.solar_maxflow,8,0,1/10,15,1 -"SM10",solar,73,dhw.mintemp,minimum temperature,uint8 (>=0<=254),C,true,number.solar_dhw_minimum_temperature,number.solar_dhw_mintemp,8,9,1,0,1 -"SM10",solar,73,solarenabled,solarmodule enabled,boolean, ,true,switch.solar_solarmodule_enabled,switch.solar_solarenabled,8,0,1,16,1 -"ISM1",solar,101,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 -"ISM1",solar,101,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 -"ISM1",solar,101,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 -"ISM1",solar,101,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 -"ISM1",solar,101,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 -"ISM1",solar,101,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 -"ISM1",solar,101,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 -"ISM1",solar,101,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 -"ISM1",solar,101,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 -"ISM1",solar,101,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 -"ISM1",solar,101,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 -"ISM2",solar,103,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 -"ISM2",solar,103,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 -"ISM2",solar,103,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 -"ISM2",solar,103,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 -"ISM2",solar,103,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 -"ISM2",solar,103,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 -"ISM2",solar,103,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 -"ISM2",solar,103,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 -"ISM2",solar,103,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 -"ISM2",solar,103,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 -"ISM2",solar,103,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 -"SM50",solar,162,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 -"SM50",solar,162,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 -"SM50",solar,162,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 -"SM50",solar,162,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 -"SM50",solar,162,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 -"SM50",solar,162,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 -"SM50",solar,162,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 -"SM50",solar,162,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 -"SM50",solar,162,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,5,9,1 -"SM50",solar,162,turnondiff,pump turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1/10,10,1 -"SM50",solar,162,turnoffdiff,pump turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1/10,11,1 -"SM50",solar,162,collector2temp,collector 2 temperature (TS7),int16 (>=-3199<=3199),C,false,sensor.solar_collector_2_temperature_(TS7),sensor.solar_collector2temp,8,0,1/10,20,1 -"SM50",solar,162,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 -"SM50",solar,162,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 -"SM50",solar,162,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 -"SM50",solar,162,heatassistpower,heat assistance valve power (M1),uint8 (>=0<=100),%,false,sensor.solar_heat_assistance_valve_power_(M1),sensor.solar_heatassistpower,8,0,1,21,1 -"SM50",solar,162,solarpump2,pump 2 (PS4),boolean, ,false,binary_sensor.solar_pump_2_(PS4),binary_sensor.solar_solarpump2,8,0,1,22,1 -"SM50",solar,162,solarpump2mod,pump 2 modulation (PS4),uint8 (>=0<=100),%,false,sensor.solar_pump_2_modulation_(PS4),sensor.solar_solarpump2mod,8,0,1,23,1 -"SM50",solar,162,cyl2bottomtemp,second cylinder bottom temperature (TS5),int16 (>=-3199<=3199),C,false,sensor.solar_second_cylinder_bottom_temperature_(TS5),sensor.solar_cyl2bottomtemp,8,0,1/10,24,1 -"SM50",solar,162,cyl3bottomtemp,third cylinder bottom temperature (TS11),int16 (>=-3199<=3199),C,false,sensor.solar_third_cylinder_bottom_temperature_(TS11),sensor.solar_cyl3bottomtemp,8,0,1/10,25,1 -"SM50",solar,162,cyltoptemp,cylinder top temperature (TS10),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_top_temperature_(TS10),sensor.solar_cyltoptemp,8,0,1/10,26,1 -"SM50",solar,162,heatexchangertemp,heat exchanger temperature (TS6),int16 (>=-3199<=3199),C,false,sensor.solar_heat_exchanger_temperature_(TS6),sensor.solar_heatexchangertemp,8,0,1/10,27,1 -"SM50",solar,162,cylpumpmod,cylinder pump modulation (PS5),uint8 (>=0<=100),%,false,sensor.solar_cylinder_pump_modulation_(PS5),sensor.solar_cylpumpmod,8,0,1,28,1 -"SM50",solar,162,valvestatus,valve status,boolean, ,false,binary_sensor.solar_valve_status,binary_sensor.solar_valvestatus,8,0,1,29,1 -"SM50",solar,162,vs1status,valve status VS1,boolean, ,false,binary_sensor.solar_valve_status_VS1,binary_sensor.solar_vs1status,8,0,1,30,1 -"SM50",solar,162,vs3status,valve status VS3,boolean, ,false,binary_sensor.solar_valve_status_VS3,binary_sensor.solar_vs3status,8,0,1,31,1 -"SM50",solar,162,transferpump,transfer pump,boolean, ,false,binary_sensor.solar_transfer_pump,binary_sensor.solar_transferpump,8,0,1,32,1 -"SM50",solar,162,transferpumpmod,transfer pump modulation,uint8 (>=0<=100),%,false,sensor.solar_transfer_pump_modulation,sensor.solar_transferpumpmod,8,0,1,33,1 -"SM50",solar,162,collectormaxtemp,maximum collector temperature,uint8 (>=0<=254),C,true,number.solar_maximum_collector_temperature,number.solar_collectormaxtemp,8,0,1,34,1 -"SM50",solar,162,collectormintemp,minimum collector temperature,uint8 (>=0<=254),C,true,number.solar_minimum_collector_temperature,number.solar_collectormintemp,8,0,1,35,1 -"SM50",solar,162,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 -"SM50",solar,162,energytoday,total energy today,uint24 (>=0<=16777214),Wh,false,sensor.solar_total_energy_today,sensor.solar_energytoday,8,0,1,36,2 -"SM50",solar,162,energytotal,total energy,uint24 (>=0<=1677721),kWh,false,sensor.solar_total_energy,sensor.solar_energytotal,8,0,1/10,38,2 -"SM50",solar,162,pump2worktime,pump 2 working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_2_working_time,sensor.solar_pump2worktime,8,0,1,40,2 -"SM50",solar,162,m1worktime,differential control working time,time (>=0<=16777214),minutes,false,sensor.solar_differential_control_working_time,sensor.solar_m1worktime,8,0,1,42,2 -"SM50",solar,162,heattransfersystem,heattransfer system,boolean, ,true,switch.solar_heattransfer_system,switch.solar_heattransfersystem,8,0,1,44,1 -"SM50",solar,162,externalcyl,external cylinder,boolean, ,true,switch.solar_external_cylinder,switch.solar_externalcyl,8,0,1,45,1 -"SM50",solar,162,thermaldisinfect,thermal disinfection,boolean, ,true,switch.solar_thermal_disinfection,switch.solar_thermaldisinfect,8,0,1,46,1 -"SM50",solar,162,heatmetering,heatmetering,boolean, ,true,switch.solar_heatmetering,switch.solar_heatmetering,8,0,1,47,1 -"SM50",solar,162,activated,activated,boolean, ,true,switch.solar_activated,switch.solar_activated,8,0,1,48,1 -"SM50",solar,162,solarpumpmode,solar pump mode,enum [constant\|pwm\|analog], ,true,select.solar_solar_pump_mode,select.solar_solarpumpmode,8,0,1,49,1 -"SM50",solar,162,solarpumpkick,solar pump kick,boolean, ,true,switch.solar_solar_pump_kick,switch.solar_solarpumpkick,8,0,1,50,1 -"SM50",solar,162,plainwatermode,plain water mode,boolean, ,true,switch.solar_plain_water_mode,switch.solar_plainwatermode,8,0,1,51,1 -"SM50",solar,162,doublematchflow,doublematchflow,boolean, ,true,switch.solar_doublematchflow,switch.solar_doublematchflow,8,0,1,52,1 -"SM50",solar,162,pump2minmod,minimum pump 2 modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_2_modulation,number.solar_pump2minmod,8,0,1,53,1 -"SM50",solar,162,turnondiff2,pump 2 turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_on_difference,number.solar_turnondiff2,8,0,1/10,54,1 -"SM50",solar,162,turnoffdiff2,pump 2 turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_off_difference,number.solar_turnoffdiff2,8,0,1/10,55,1 -"SM50",solar,162,pump2kick,pump kick 2,boolean, ,true,switch.solar_pump_kick_2,switch.solar_pump2kick,8,0,1,56,1 -"SM50",solar,162,climatezone,climate zone,uint8 (>=0<=254), ,true,number.solar_climate_zone,number.solar_climatezone,8,0,1,57,1 -"SM50",solar,162,collector1area,collector 1 area,uint16 (>=0<=3199),m²,true,number.solar_collector_1_area,number.solar_collector1area,8,0,1/10,58,1 -"SM50",solar,162,collector1type,collector 1 type,enum [flat\|vacuum], ,true,select.solar_collector_1_type,select.solar_collector1type,8,0,1,59,1 -"SM50",solar,162,collector2area,collector 2 area,uint16 (>=0<=3199),m²,true,number.solar_collector_2_area,number.solar_collector2area,8,0,1/10,60,1 -"SM50",solar,162,collector2type,collector 2 type,enum [flat\|vacuum], ,true,select.solar_collector_2_type,select.solar_collector2type,8,0,1,61,1 -"SM50",solar,162,cylpriority,cylinder priority,enum [cyl 1\|cyl 2], ,true,select.solar_cylinder_priority,select.solar_cylpriority,8,0,1,62,1 -"SM50",solar,162,heatcntflowtemp,heat counter flow temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_flow_temperature,sensor.solar_heatcntflowtemp,8,0,1/10,63,1 -"SM50",solar,162,heatcntrettemp,heat counter return temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_return_temperature,sensor.solar_heatcntrettemp,8,0,1/10,64,1 -"SM50",solar,162,heatcnt,heat counter impulses,uint8 (>=0<=254), ,false,sensor.solar_heat_counter_impulses,sensor.solar_heatcnt,8,0,1,65,1 -"SM50",solar,162,swapflowtemp,swap flow temperature (TS14),uint16 (>=0<=3199),C,false,sensor.solar_swap_flow_temperature_(TS14),sensor.solar_swapflowtemp,8,0,1/10,66,1 -"SM50",solar,162,swaprettemp,swap return temperature (TS15),uint16 (>=0<=3199),C,false,sensor.solar_swap_return_temperature_(TS15),sensor.solar_swaprettemp,8,0,1/10,67,1 -"SM100, MS100",solar,163,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 -"SM100, MS100",solar,163,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 -"SM100, MS100",solar,163,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 -"SM100, MS100",solar,163,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 -"SM100, MS100",solar,163,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 -"SM100, MS100",solar,163,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 -"SM100, MS100",solar,163,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 -"SM100, MS100",solar,163,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 -"SM100, MS100",solar,163,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,5,9,1 -"SM100, MS100",solar,163,turnondiff,pump turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1/10,10,1 -"SM100, MS100",solar,163,turnoffdiff,pump turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1/10,11,1 -"SM100, MS100",solar,163,collector2temp,collector 2 temperature (TS7),int16 (>=-3199<=3199),C,false,sensor.solar_collector_2_temperature_(TS7),sensor.solar_collector2temp,8,0,1/10,20,1 -"SM100, MS100",solar,163,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 -"SM100, MS100",solar,163,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 -"SM100, MS100",solar,163,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 -"SM100, MS100",solar,163,heatassistpower,heat assistance valve power (M1),uint8 (>=0<=100),%,false,sensor.solar_heat_assistance_valve_power_(M1),sensor.solar_heatassistpower,8,0,1,21,1 -"SM100, MS100",solar,163,solarpump2,pump 2 (PS4),boolean, ,false,binary_sensor.solar_pump_2_(PS4),binary_sensor.solar_solarpump2,8,0,1,22,1 -"SM100, MS100",solar,163,solarpump2mod,pump 2 modulation (PS4),uint8 (>=0<=100),%,false,sensor.solar_pump_2_modulation_(PS4),sensor.solar_solarpump2mod,8,0,1,23,1 -"SM100, MS100",solar,163,cyl2bottomtemp,second cylinder bottom temperature (TS5),int16 (>=-3199<=3199),C,false,sensor.solar_second_cylinder_bottom_temperature_(TS5),sensor.solar_cyl2bottomtemp,8,0,1/10,24,1 -"SM100, MS100",solar,163,cyl3bottomtemp,third cylinder bottom temperature (TS11),int16 (>=-3199<=3199),C,false,sensor.solar_third_cylinder_bottom_temperature_(TS11),sensor.solar_cyl3bottomtemp,8,0,1/10,25,1 -"SM100, MS100",solar,163,cyltoptemp,cylinder top temperature (TS10),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_top_temperature_(TS10),sensor.solar_cyltoptemp,8,0,1/10,26,1 -"SM100, MS100",solar,163,heatexchangertemp,heat exchanger temperature (TS6),int16 (>=-3199<=3199),C,false,sensor.solar_heat_exchanger_temperature_(TS6),sensor.solar_heatexchangertemp,8,0,1/10,27,1 -"SM100, MS100",solar,163,cylpumpmod,cylinder pump modulation (PS5),uint8 (>=0<=100),%,false,sensor.solar_cylinder_pump_modulation_(PS5),sensor.solar_cylpumpmod,8,0,1,28,1 -"SM100, MS100",solar,163,valvestatus,valve status,boolean, ,false,binary_sensor.solar_valve_status,binary_sensor.solar_valvestatus,8,0,1,29,1 -"SM100, MS100",solar,163,vs1status,valve status VS1,boolean, ,false,binary_sensor.solar_valve_status_VS1,binary_sensor.solar_vs1status,8,0,1,30,1 -"SM100, MS100",solar,163,vs3status,valve status VS3,boolean, ,false,binary_sensor.solar_valve_status_VS3,binary_sensor.solar_vs3status,8,0,1,31,1 -"SM100, MS100",solar,163,transferpump,transfer pump,boolean, ,false,binary_sensor.solar_transfer_pump,binary_sensor.solar_transferpump,8,0,1,32,1 -"SM100, MS100",solar,163,transferpumpmod,transfer pump modulation,uint8 (>=0<=100),%,false,sensor.solar_transfer_pump_modulation,sensor.solar_transferpumpmod,8,0,1,33,1 -"SM100, MS100",solar,163,collectormaxtemp,maximum collector temperature,uint8 (>=0<=254),C,true,number.solar_maximum_collector_temperature,number.solar_collectormaxtemp,8,0,1,34,1 -"SM100, MS100",solar,163,collectormintemp,minimum collector temperature,uint8 (>=0<=254),C,true,number.solar_minimum_collector_temperature,number.solar_collectormintemp,8,0,1,35,1 -"SM100, MS100",solar,163,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 -"SM100, MS100",solar,163,energytoday,total energy today,uint24 (>=0<=16777214),Wh,false,sensor.solar_total_energy_today,sensor.solar_energytoday,8,0,1,36,2 -"SM100, MS100",solar,163,energytotal,total energy,uint24 (>=0<=1677721),kWh,false,sensor.solar_total_energy,sensor.solar_energytotal,8,0,1/10,38,2 -"SM100, MS100",solar,163,pump2worktime,pump 2 working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_2_working_time,sensor.solar_pump2worktime,8,0,1,40,2 -"SM100, MS100",solar,163,m1worktime,differential control working time,time (>=0<=16777214),minutes,false,sensor.solar_differential_control_working_time,sensor.solar_m1worktime,8,0,1,42,2 -"SM100, MS100",solar,163,heattransfersystem,heattransfer system,boolean, ,true,switch.solar_heattransfer_system,switch.solar_heattransfersystem,8,0,1,44,1 -"SM100, MS100",solar,163,externalcyl,external cylinder,boolean, ,true,switch.solar_external_cylinder,switch.solar_externalcyl,8,0,1,45,1 -"SM100, MS100",solar,163,thermaldisinfect,thermal disinfection,boolean, ,true,switch.solar_thermal_disinfection,switch.solar_thermaldisinfect,8,0,1,46,1 -"SM100, MS100",solar,163,heatmetering,heatmetering,boolean, ,true,switch.solar_heatmetering,switch.solar_heatmetering,8,0,1,47,1 -"SM100, MS100",solar,163,activated,activated,boolean, ,true,switch.solar_activated,switch.solar_activated,8,0,1,48,1 -"SM100, MS100",solar,163,solarpumpmode,solar pump mode,enum [constant\|pwm\|analog], ,true,select.solar_solar_pump_mode,select.solar_solarpumpmode,8,0,1,49,1 -"SM100, MS100",solar,163,solarpumpkick,solar pump kick,boolean, ,true,switch.solar_solar_pump_kick,switch.solar_solarpumpkick,8,0,1,50,1 -"SM100, MS100",solar,163,plainwatermode,plain water mode,boolean, ,true,switch.solar_plain_water_mode,switch.solar_plainwatermode,8,0,1,51,1 -"SM100, MS100",solar,163,doublematchflow,doublematchflow,boolean, ,true,switch.solar_doublematchflow,switch.solar_doublematchflow,8,0,1,52,1 -"SM100, MS100",solar,163,pump2minmod,minimum pump 2 modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_2_modulation,number.solar_pump2minmod,8,0,1,53,1 -"SM100, MS100",solar,163,turnondiff2,pump 2 turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_on_difference,number.solar_turnondiff2,8,0,1/10,54,1 -"SM100, MS100",solar,163,turnoffdiff2,pump 2 turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_off_difference,number.solar_turnoffdiff2,8,0,1/10,55,1 -"SM100, MS100",solar,163,pump2kick,pump kick 2,boolean, ,true,switch.solar_pump_kick_2,switch.solar_pump2kick,8,0,1,56,1 -"SM100, MS100",solar,163,climatezone,climate zone,uint8 (>=0<=254), ,true,number.solar_climate_zone,number.solar_climatezone,8,0,1,57,1 -"SM100, MS100",solar,163,collector1area,collector 1 area,uint16 (>=0<=3199),m²,true,number.solar_collector_1_area,number.solar_collector1area,8,0,1/10,58,1 -"SM100, MS100",solar,163,collector1type,collector 1 type,enum [flat\|vacuum], ,true,select.solar_collector_1_type,select.solar_collector1type,8,0,1,59,1 -"SM100, MS100",solar,163,collector2area,collector 2 area,uint16 (>=0<=3199),m²,true,number.solar_collector_2_area,number.solar_collector2area,8,0,1/10,60,1 -"SM100, MS100",solar,163,collector2type,collector 2 type,enum [flat\|vacuum], ,true,select.solar_collector_2_type,select.solar_collector2type,8,0,1,61,1 -"SM100, MS100",solar,163,cylpriority,cylinder priority,enum [cyl 1\|cyl 2], ,true,select.solar_cylinder_priority,select.solar_cylpriority,8,0,1,62,1 -"SM100, MS100",solar,163,heatcntflowtemp,heat counter flow temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_flow_temperature,sensor.solar_heatcntflowtemp,8,0,1/10,63,1 -"SM100, MS100",solar,163,heatcntrettemp,heat counter return temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_return_temperature,sensor.solar_heatcntrettemp,8,0,1/10,64,1 -"SM100, MS100",solar,163,heatcnt,heat counter impulses,uint8 (>=0<=254), ,false,sensor.solar_heat_counter_impulses,sensor.solar_heatcnt,8,0,1,65,1 -"SM100, MS100",solar,163,swapflowtemp,swap flow temperature (TS14),uint16 (>=0<=3199),C,false,sensor.solar_swap_flow_temperature_(TS14),sensor.solar_swapflowtemp,8,0,1/10,66,1 -"SM100, MS100",solar,163,swaprettemp,swap return temperature (TS15),uint16 (>=0<=3199),C,false,sensor.solar_swap_return_temperature_(TS15),sensor.solar_swaprettemp,8,0,1/10,67,1 -"SM200, MS200",solar,164,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 -"SM200, MS200",solar,164,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 -"SM200, MS200",solar,164,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 -"SM200, MS200",solar,164,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 -"SM200, MS200",solar,164,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 -"SM200, MS200",solar,164,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 -"SM200, MS200",solar,164,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 -"SM200, MS200",solar,164,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 -"SM200, MS200",solar,164,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,5,9,1 -"SM200, MS200",solar,164,turnondiff,pump turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1/10,10,1 -"SM200, MS200",solar,164,turnoffdiff,pump turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1/10,11,1 -"SM200, MS200",solar,164,collector2temp,collector 2 temperature (TS7),int16 (>=-3199<=3199),C,false,sensor.solar_collector_2_temperature_(TS7),sensor.solar_collector2temp,8,0,1/10,20,1 -"SM200, MS200",solar,164,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 -"SM200, MS200",solar,164,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 -"SM200, MS200",solar,164,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 -"SM200, MS200",solar,164,heatassistpower,heat assistance valve power (M1),uint8 (>=0<=100),%,false,sensor.solar_heat_assistance_valve_power_(M1),sensor.solar_heatassistpower,8,0,1,21,1 -"SM200, MS200",solar,164,solarpump2,pump 2 (PS4),boolean, ,false,binary_sensor.solar_pump_2_(PS4),binary_sensor.solar_solarpump2,8,0,1,22,1 -"SM200, MS200",solar,164,solarpump2mod,pump 2 modulation (PS4),uint8 (>=0<=100),%,false,sensor.solar_pump_2_modulation_(PS4),sensor.solar_solarpump2mod,8,0,1,23,1 -"SM200, MS200",solar,164,cyl2bottomtemp,second cylinder bottom temperature (TS5),int16 (>=-3199<=3199),C,false,sensor.solar_second_cylinder_bottom_temperature_(TS5),sensor.solar_cyl2bottomtemp,8,0,1/10,24,1 -"SM200, MS200",solar,164,cyl3bottomtemp,third cylinder bottom temperature (TS11),int16 (>=-3199<=3199),C,false,sensor.solar_third_cylinder_bottom_temperature_(TS11),sensor.solar_cyl3bottomtemp,8,0,1/10,25,1 -"SM200, MS200",solar,164,cyltoptemp,cylinder top temperature (TS10),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_top_temperature_(TS10),sensor.solar_cyltoptemp,8,0,1/10,26,1 -"SM200, MS200",solar,164,heatexchangertemp,heat exchanger temperature (TS6),int16 (>=-3199<=3199),C,false,sensor.solar_heat_exchanger_temperature_(TS6),sensor.solar_heatexchangertemp,8,0,1/10,27,1 -"SM200, MS200",solar,164,cylpumpmod,cylinder pump modulation (PS5),uint8 (>=0<=100),%,false,sensor.solar_cylinder_pump_modulation_(PS5),sensor.solar_cylpumpmod,8,0,1,28,1 -"SM200, MS200",solar,164,valvestatus,valve status,boolean, ,false,binary_sensor.solar_valve_status,binary_sensor.solar_valvestatus,8,0,1,29,1 -"SM200, MS200",solar,164,vs1status,valve status VS1,boolean, ,false,binary_sensor.solar_valve_status_VS1,binary_sensor.solar_vs1status,8,0,1,30,1 -"SM200, MS200",solar,164,vs3status,valve status VS3,boolean, ,false,binary_sensor.solar_valve_status_VS3,binary_sensor.solar_vs3status,8,0,1,31,1 -"SM200, MS200",solar,164,transferpump,transfer pump,boolean, ,false,binary_sensor.solar_transfer_pump,binary_sensor.solar_transferpump,8,0,1,32,1 -"SM200, MS200",solar,164,transferpumpmod,transfer pump modulation,uint8 (>=0<=100),%,false,sensor.solar_transfer_pump_modulation,sensor.solar_transferpumpmod,8,0,1,33,1 -"SM200, MS200",solar,164,collectormaxtemp,maximum collector temperature,uint8 (>=0<=254),C,true,number.solar_maximum_collector_temperature,number.solar_collectormaxtemp,8,0,1,34,1 -"SM200, MS200",solar,164,collectormintemp,minimum collector temperature,uint8 (>=0<=254),C,true,number.solar_minimum_collector_temperature,number.solar_collectormintemp,8,0,1,35,1 -"SM200, MS200",solar,164,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 -"SM200, MS200",solar,164,energytoday,total energy today,uint24 (>=0<=16777214),Wh,false,sensor.solar_total_energy_today,sensor.solar_energytoday,8,0,1,36,2 -"SM200, MS200",solar,164,energytotal,total energy,uint24 (>=0<=1677721),kWh,false,sensor.solar_total_energy,sensor.solar_energytotal,8,0,1/10,38,2 -"SM200, MS200",solar,164,pump2worktime,pump 2 working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_2_working_time,sensor.solar_pump2worktime,8,0,1,40,2 -"SM200, MS200",solar,164,m1worktime,differential control working time,time (>=0<=16777214),minutes,false,sensor.solar_differential_control_working_time,sensor.solar_m1worktime,8,0,1,42,2 -"SM200, MS200",solar,164,heattransfersystem,heattransfer system,boolean, ,true,switch.solar_heattransfer_system,switch.solar_heattransfersystem,8,0,1,44,1 -"SM200, MS200",solar,164,externalcyl,external cylinder,boolean, ,true,switch.solar_external_cylinder,switch.solar_externalcyl,8,0,1,45,1 -"SM200, MS200",solar,164,thermaldisinfect,thermal disinfection,boolean, ,true,switch.solar_thermal_disinfection,switch.solar_thermaldisinfect,8,0,1,46,1 -"SM200, MS200",solar,164,heatmetering,heatmetering,boolean, ,true,switch.solar_heatmetering,switch.solar_heatmetering,8,0,1,47,1 -"SM200, MS200",solar,164,activated,activated,boolean, ,true,switch.solar_activated,switch.solar_activated,8,0,1,48,1 -"SM200, MS200",solar,164,solarpumpmode,solar pump mode,enum [constant\|pwm\|analog], ,true,select.solar_solar_pump_mode,select.solar_solarpumpmode,8,0,1,49,1 -"SM200, MS200",solar,164,solarpumpkick,solar pump kick,boolean, ,true,switch.solar_solar_pump_kick,switch.solar_solarpumpkick,8,0,1,50,1 -"SM200, MS200",solar,164,plainwatermode,plain water mode,boolean, ,true,switch.solar_plain_water_mode,switch.solar_plainwatermode,8,0,1,51,1 -"SM200, MS200",solar,164,doublematchflow,doublematchflow,boolean, ,true,switch.solar_doublematchflow,switch.solar_doublematchflow,8,0,1,52,1 -"SM200, MS200",solar,164,pump2minmod,minimum pump 2 modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_2_modulation,number.solar_pump2minmod,8,0,1,53,1 -"SM200, MS200",solar,164,turnondiff2,pump 2 turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_on_difference,number.solar_turnondiff2,8,0,1/10,54,1 -"SM200, MS200",solar,164,turnoffdiff2,pump 2 turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_off_difference,number.solar_turnoffdiff2,8,0,1/10,55,1 -"SM200, MS200",solar,164,pump2kick,pump kick 2,boolean, ,true,switch.solar_pump_kick_2,switch.solar_pump2kick,8,0,1,56,1 -"SM200, MS200",solar,164,climatezone,climate zone,uint8 (>=0<=254), ,true,number.solar_climate_zone,number.solar_climatezone,8,0,1,57,1 -"SM200, MS200",solar,164,collector1area,collector 1 area,uint16 (>=0<=3199),m²,true,number.solar_collector_1_area,number.solar_collector1area,8,0,1/10,58,1 -"SM200, MS200",solar,164,collector1type,collector 1 type,enum [flat\|vacuum], ,true,select.solar_collector_1_type,select.solar_collector1type,8,0,1,59,1 -"SM200, MS200",solar,164,collector2area,collector 2 area,uint16 (>=0<=3199),m²,true,number.solar_collector_2_area,number.solar_collector2area,8,0,1/10,60,1 -"SM200, MS200",solar,164,collector2type,collector 2 type,enum [flat\|vacuum], ,true,select.solar_collector_2_type,select.solar_collector2type,8,0,1,61,1 -"SM200, MS200",solar,164,cylpriority,cylinder priority,enum [cyl 1\|cyl 2], ,true,select.solar_cylinder_priority,select.solar_cylpriority,8,0,1,62,1 -"SM200, MS200",solar,164,heatcntflowtemp,heat counter flow temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_flow_temperature,sensor.solar_heatcntflowtemp,8,0,1/10,63,1 -"SM200, MS200",solar,164,heatcntrettemp,heat counter return temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_return_temperature,sensor.solar_heatcntrettemp,8,0,1/10,64,1 -"SM200, MS200",solar,164,heatcnt,heat counter impulses,uint8 (>=0<=254), ,false,sensor.solar_heat_counter_impulses,sensor.solar_heatcnt,8,0,1,65,1 -"SM200, MS200",solar,164,swapflowtemp,swap flow temperature (TS14),uint16 (>=0<=3199),C,false,sensor.solar_swap_flow_temperature_(TS14),sensor.solar_swapflowtemp,8,0,1/10,66,1 -"SM200, MS200",solar,164,swaprettemp,swap return temperature (TS15),uint16 (>=0<=3199),C,false,sensor.solar_swap_return_temperature_(TS15),sensor.solar_swaprettemp,8,0,1/10,67,1 -"HP Module",heatpump,252,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.heatpump_relative_air_humidity,sensor.heatpump_airhumidity,9,0,1,0,1 -"HP Module",heatpump,252,dewtemperature,dew point temperature,uint8 (>=0<=254),C,false,sensor.heatpump_dew_point_temperature,sensor.heatpump_dewtemperature,9,0,1,1,1 -"HP Module",heatpump,252,curflowtemp,current flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_current_flow_temperature,sensor.heatpump_curflowtemp,9,0,1/10,2,1 -"HP Module",heatpump,252,rettemp,return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_return_temperature,sensor.heatpump_rettemp,9,0,1/10,3,1 -"HP Module",heatpump,252,sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_system_return_temperature,sensor.heatpump_sysrettemp,9,0,1/10,4,1 -"HP Module",heatpump,252,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.heatpump_drain_pan_temp_(TA4),sensor.heatpump_hpta4,9,0,1/10,5,1 -"HP Module",heatpump,252,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_temperature_(TR1),sensor.heatpump_hptr1,9,0,1/10,6,1 -"HP Module",heatpump,252,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.heatpump_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.heatpump_hptr3,9,0,1/10,7,1 -"HP Module",heatpump,252,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.heatpump_evaporator_inlet_temperature_(TR4),sensor.heatpump_hptr4,9,0,1/10,8,1 -"HP Module",heatpump,252,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_inlet_temperature_(TR5),sensor.heatpump_hptr5,9,0,1/10,9,1 -"HP Module",heatpump,252,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_outlet_temperature_(TR6),sensor.heatpump_hptr6,9,0,1/10,10,1 -"HP Module",heatpump,252,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.heatpump_air_inlet_temperature_(TL2),sensor.heatpump_hptl2,9,0,1/10,11,1 -"HP Module",heatpump,252,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.heatpump_low_pressure_side_temperature_(PL1),sensor.heatpump_hppl1,9,0,1/10,12,1 -"HP Module",heatpump,252,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.heatpump_high_pressure_side_temperature_(PH1),sensor.heatpump_hpph1,9,0,1/10,13,1 -"HP Module",heatpump,252,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.heatpump_heating_pump_modulation,sensor.heatpump_heatingpumpmod,9,0,1,14,1 -"HP Module",heatpump,252,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.heatpump_compressor_speed,sensor.heatpump_hpcompspd,9,0,1,15,1 -"HP Module",heatpump,252,hybridstrategy,hybrid control strategy,enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only], ,true,select.heatpump_hybrid_control_strategy,select.heatpump_hybridstrategy,9,0,1,16,1 -"HP Module",heatpump,252,lownoisemode,low noise mode,enum [off\|reduced output\|switch off hp\|perm. reduced], ,true,select.heatpump_low_noise_mode,select.heatpump_lownoisemode,9,0,1,17,1 -"HP Module",heatpump,252,lownoisestart,low noise starttime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_starttime,number.heatpump_lownoisestart,9,0,1,18,1 -"HP Module",heatpump,252,lownoisestop,low noise stoptime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_stoptime,number.heatpump_lownoisestop,9,0,1,19,1 -"HP Module",heatpump,252,dhw.hybriddhw,hybrid DHW,enum [eco\|high comfort], ,true,select.heatpump_dhw_hybrid_DHW,select.heatpump_dhw_hybriddhw,9,9,1,0,1 -"HP Module",heatpump,252,energypricegas,energy price gas,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_gas,number.heatpump_energypricegas,9,0,1,20,1 -"HP Module",heatpump,252,energypriceel,energy price electric,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_electric,number.heatpump_energypriceel,9,0,1,21,1 -"HP Module",heatpump,252,energyfeedpv,feed in PV,uint8 (>=0<=254),ct/kWh,true,number.heatpump_feed_in_PV,number.heatpump_energyfeedpv,9,0,1,22,1 -"HP Module",heatpump,252,switchovertemp,outside switchover temperature,int8 (>=-126<=126),C,true,number.heatpump_outside_switchover_temperature,number.heatpump_switchovertemp,9,0,1,23,1 -"HP Module",heatpump,252,airpurgemode,air purge mode,boolean, ,true,switch.heatpump_air_purge_mode,switch.heatpump_airpurgemode,9,0,1,24,1 -"HP Module",heatpump,252,heatpumpoutput,heatpump output,uint8 (>=0<=100),%,true,number.heatpump_heatpump_output,number.heatpump_heatpumpoutput,9,0,1,25,1 -"HP Module",heatpump,252,coolingcircuit,cooling circuit,boolean, ,true,switch.heatpump_cooling_circuit,switch.heatpump_coolingcircuit,9,0,1,26,1 -"HP Module",heatpump,252,compstartmod,compressor start modulation,uint8 (>=0<=100),%,true,number.heatpump_compressor_start_modulation,number.heatpump_compstartmod,9,0,1,27,1 -"HP Module",heatpump,252,heatdrainpan,heat drain pan,boolean, ,true,switch.heatpump_heat_drain_pan,switch.heatpump_heatdrainpan,9,0,1,28,1 -"HP Module",heatpump,252,heatcable,heating cable,boolean, ,true,switch.heatpump_heating_cable,switch.heatpump_heatcable,9,0,1,29,1 -"HP Module",heatpump,252,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_total_energy,sensor.heatpump_nrgtotal,9,0,1/100,30,2 -"HP Module",heatpump,252,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_energy,sensor.heatpump_dhw_nrg,9,9,1/100,1,2 -"HP Module",heatpump,252,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_energy_heating,sensor.heatpump_nrgheat,9,0,1/100,32,2 -"HP Module",heatpump,252,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_total,sensor.heatpump_metertotal,9,0,1/100,34,2 -"HP Module",heatpump,252,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_compressor,sensor.heatpump_metercomp,9,0,1/100,36,2 -"HP Module",heatpump,252,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_e-heater,sensor.heatpump_metereheat,9,0,1/100,38,2 -"HP Module",heatpump,252,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_heating,sensor.heatpump_meterheat,9,0,1/100,40,2 -"HP Module",heatpump,252,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_meter,sensor.heatpump_dhw_meter,9,9,1/100,3,2 -"HP Module",heatpump,252,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.heatpump_heating_control_starts,sensor.heatpump_heatingstarts,9,0,1,42,2 -"HP Module",heatpump,252,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.heatpump_dhw_starts_hp,sensor.heatpump_dhw_startshp,9,9,1,5,2 -"HP Module",heatpump,252,fuelheat,fuel consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_fuel_consumption_heating,sensor.heatpump_fuelheat,9,0,1/10,44,2 -"HP Module",heatpump,252,dhw.fueldhw,fuel consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_fuel_consumption,sensor.heatpump_dhw_fueldhw,9,9,1/10,7,2 -"HP Module",heatpump,252,elheat,el. consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._consumption_heating,sensor.heatpump_elheat,9,0,1/10,46,2 -"HP Module",heatpump,252,dhw.eldhw,el. consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el._consumption,sensor.heatpump_dhw_eldhw,9,9,1/10,9,2 -"HP Module",heatpump,252,elgenheat,el. generation heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._generation_heating,sensor.heatpump_elgenheat,9,0,1/10,48,2 -"HP Module",heatpump,252,dhw.elgendhw,el generation,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el_generation,sensor.heatpump_dhw_elgendhw,9,9,1/10,11,2 -"Hybrid Manager HM200",heatpump,248,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.heatpump_relative_air_humidity,sensor.heatpump_airhumidity,9,0,1,0,1 -"Hybrid Manager HM200",heatpump,248,dewtemperature,dew point temperature,uint8 (>=0<=254),C,false,sensor.heatpump_dew_point_temperature,sensor.heatpump_dewtemperature,9,0,1,1,1 -"Hybrid Manager HM200",heatpump,248,curflowtemp,current flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_current_flow_temperature,sensor.heatpump_curflowtemp,9,0,1/10,2,1 -"Hybrid Manager HM200",heatpump,248,rettemp,return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_return_temperature,sensor.heatpump_rettemp,9,0,1/10,3,1 -"Hybrid Manager HM200",heatpump,248,sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_system_return_temperature,sensor.heatpump_sysrettemp,9,0,1/10,4,1 -"Hybrid Manager HM200",heatpump,248,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.heatpump_drain_pan_temp_(TA4),sensor.heatpump_hpta4,9,0,1/10,5,1 -"Hybrid Manager HM200",heatpump,248,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_temperature_(TR1),sensor.heatpump_hptr1,9,0,1/10,6,1 -"Hybrid Manager HM200",heatpump,248,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.heatpump_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.heatpump_hptr3,9,0,1/10,7,1 -"Hybrid Manager HM200",heatpump,248,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.heatpump_evaporator_inlet_temperature_(TR4),sensor.heatpump_hptr4,9,0,1/10,8,1 -"Hybrid Manager HM200",heatpump,248,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_inlet_temperature_(TR5),sensor.heatpump_hptr5,9,0,1/10,9,1 -"Hybrid Manager HM200",heatpump,248,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_outlet_temperature_(TR6),sensor.heatpump_hptr6,9,0,1/10,10,1 -"Hybrid Manager HM200",heatpump,248,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.heatpump_air_inlet_temperature_(TL2),sensor.heatpump_hptl2,9,0,1/10,11,1 -"Hybrid Manager HM200",heatpump,248,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.heatpump_low_pressure_side_temperature_(PL1),sensor.heatpump_hppl1,9,0,1/10,12,1 -"Hybrid Manager HM200",heatpump,248,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.heatpump_high_pressure_side_temperature_(PH1),sensor.heatpump_hpph1,9,0,1/10,13,1 -"Hybrid Manager HM200",heatpump,248,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.heatpump_heating_pump_modulation,sensor.heatpump_heatingpumpmod,9,0,1,14,1 -"Hybrid Manager HM200",heatpump,248,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.heatpump_compressor_speed,sensor.heatpump_hpcompspd,9,0,1,15,1 -"Hybrid Manager HM200",heatpump,248,hybridstrategy,hybrid control strategy,enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only], ,true,select.heatpump_hybrid_control_strategy,select.heatpump_hybridstrategy,9,0,1,16,1 -"Hybrid Manager HM200",heatpump,248,lownoisemode,low noise mode,enum [off\|reduced output\|switch off hp\|perm. reduced], ,true,select.heatpump_low_noise_mode,select.heatpump_lownoisemode,9,0,1,17,1 -"Hybrid Manager HM200",heatpump,248,lownoisestart,low noise starttime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_starttime,number.heatpump_lownoisestart,9,0,1,18,1 -"Hybrid Manager HM200",heatpump,248,lownoisestop,low noise stoptime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_stoptime,number.heatpump_lownoisestop,9,0,1,19,1 -"Hybrid Manager HM200",heatpump,248,dhw.hybriddhw,hybrid DHW,enum [eco\|high comfort], ,true,select.heatpump_dhw_hybrid_DHW,select.heatpump_dhw_hybriddhw,9,9,1,0,1 -"Hybrid Manager HM200",heatpump,248,energypricegas,energy price gas,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_gas,number.heatpump_energypricegas,9,0,1,20,1 -"Hybrid Manager HM200",heatpump,248,energypriceel,energy price electric,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_electric,number.heatpump_energypriceel,9,0,1,21,1 -"Hybrid Manager HM200",heatpump,248,energyfeedpv,feed in PV,uint8 (>=0<=254),ct/kWh,true,number.heatpump_feed_in_PV,number.heatpump_energyfeedpv,9,0,1,22,1 -"Hybrid Manager HM200",heatpump,248,switchovertemp,outside switchover temperature,int8 (>=-126<=126),C,true,number.heatpump_outside_switchover_temperature,number.heatpump_switchovertemp,9,0,1,23,1 -"Hybrid Manager HM200",heatpump,248,airpurgemode,air purge mode,boolean, ,true,switch.heatpump_air_purge_mode,switch.heatpump_airpurgemode,9,0,1,24,1 -"Hybrid Manager HM200",heatpump,248,heatpumpoutput,heatpump output,uint8 (>=0<=100),%,true,number.heatpump_heatpump_output,number.heatpump_heatpumpoutput,9,0,1,25,1 -"Hybrid Manager HM200",heatpump,248,coolingcircuit,cooling circuit,boolean, ,true,switch.heatpump_cooling_circuit,switch.heatpump_coolingcircuit,9,0,1,26,1 -"Hybrid Manager HM200",heatpump,248,compstartmod,compressor start modulation,uint8 (>=0<=100),%,true,number.heatpump_compressor_start_modulation,number.heatpump_compstartmod,9,0,1,27,1 -"Hybrid Manager HM200",heatpump,248,heatdrainpan,heat drain pan,boolean, ,true,switch.heatpump_heat_drain_pan,switch.heatpump_heatdrainpan,9,0,1,28,1 -"Hybrid Manager HM200",heatpump,248,heatcable,heating cable,boolean, ,true,switch.heatpump_heating_cable,switch.heatpump_heatcable,9,0,1,29,1 -"Hybrid Manager HM200",heatpump,248,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_total_energy,sensor.heatpump_nrgtotal,9,0,1/100,30,2 -"Hybrid Manager HM200",heatpump,248,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_energy,sensor.heatpump_dhw_nrg,9,9,1/100,1,2 -"Hybrid Manager HM200",heatpump,248,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_energy_heating,sensor.heatpump_nrgheat,9,0,1/100,32,2 -"Hybrid Manager HM200",heatpump,248,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_total,sensor.heatpump_metertotal,9,0,1/100,34,2 -"Hybrid Manager HM200",heatpump,248,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_compressor,sensor.heatpump_metercomp,9,0,1/100,36,2 -"Hybrid Manager HM200",heatpump,248,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_e-heater,sensor.heatpump_metereheat,9,0,1/100,38,2 -"Hybrid Manager HM200",heatpump,248,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_heating,sensor.heatpump_meterheat,9,0,1/100,40,2 -"Hybrid Manager HM200",heatpump,248,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_meter,sensor.heatpump_dhw_meter,9,9,1/100,3,2 -"Hybrid Manager HM200",heatpump,248,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.heatpump_heating_control_starts,sensor.heatpump_heatingstarts,9,0,1,42,2 -"Hybrid Manager HM200",heatpump,248,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.heatpump_dhw_starts_hp,sensor.heatpump_dhw_startshp,9,9,1,5,2 -"Hybrid Manager HM200",heatpump,248,fuelheat,fuel consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_fuel_consumption_heating,sensor.heatpump_fuelheat,9,0,1/10,44,2 -"Hybrid Manager HM200",heatpump,248,dhw.fueldhw,fuel consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_fuel_consumption,sensor.heatpump_dhw_fueldhw,9,9,1/10,7,2 -"Hybrid Manager HM200",heatpump,248,elheat,el. consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._consumption_heating,sensor.heatpump_elheat,9,0,1/10,46,2 -"Hybrid Manager HM200",heatpump,248,dhw.eldhw,el. consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el._consumption,sensor.heatpump_dhw_eldhw,9,9,1/10,9,2 -"Hybrid Manager HM200",heatpump,248,elgenheat,el. generation heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._generation_heating,sensor.heatpump_elgenheat,9,0,1/10,48,2 -"Hybrid Manager HM200",heatpump,248,dhw.elgendhw,el generation,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el_generation,sensor.heatpump_dhw_elgendhw,9,9,1/10,11,2 -"WM10",switch,71,activated,activated,boolean, ,false,binary_sensor.switch_activated,binary_sensor.switch_activated,11,0,1,0,1 -"WM10",switch,71,flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.switch_flow_temperature_(TC1),sensor.switch_flowtemphc,11,0,1/10,1,1 -"WM10",switch,71,status,status,int8 (>=-126<=126), ,false,sensor.switch_status,sensor.switch_status,11,0,1,2,1 -"Rego 3000",controller,240,datetime,date/time,string, ,false,sensor.controller_date/time,sensor.controller_datetime,12,0,1,0,13 -"EM10",alert,74,setflowtemp,set flow temperature,uint8 (>=0<=254),C,false,sensor.alert_set_flow_temperature,sensor.alert_setflowtemp,14,0,1,0,1 -"EM10",alert,74,setburnpow,burner set power,uint8 (>=0<=100),%,false,sensor.alert_burner_set_power,sensor.alert_setburnpow,14,0,1,1,1 -"EM10, EM100",extension,243,flowtempvf,flow temperature in header (T0/Vf),int16 (>=-3199<=3199),C,false,sensor.extension_flow_temperature_in_header_(T0/Vf),sensor.extension_flowtempvf,15,0,1/10,0,1 -"EM10, EM100",extension,243,input,input,uint8 (>=0<=25),V,false,sensor.extension_input,sensor.extension_input,15,0,1/10,1,1 -"EM10, EM100",extension,243,outpow,output IO1,uint8 (>=0<=100),%,false,sensor.extension_output_IO1,sensor.extension_outpow,15,0,1,2,1 -"EM10, EM100",extension,243,setpower,request power,uint8 (>=0<=100),%,false,sensor.extension_request_power,sensor.extension_setpower,15,0,1,3,1 -"EM10, EM100",extension,243,setpoint,set temp.,uint8 (>=0<=254),C,false,sensor.extension_set_temp.,sensor.extension_setpoint,15,0,1,4,1 -"EM10, EM100",extension,243,minv,min volt.,uint8 (>=0<=25),V,true,number.extension_min_volt.,number.extension_minv,15,0,1/10,5,1 -"EM10, EM100",extension,243,maxv,max volt.,uint8 (>=0<=25),V,true,number.extension_max_volt.,number.extension_maxv,15,0,1/10,6,1 -"EM10, EM100",extension,243,mint,min temp.,uint8 (>=0<=254),C,true,number.extension_min_temp.,number.extension_mint,15,0,1,7,1 -"EM10, EM100",extension,243,maxt,max temp.,uint8 (>=0<=254),C,true,number.extension_max_temp.,number.extension_maxt,15,0,1,8,1 -"EM10, EM100",extension,243,mode,operating mode,uint8 (>=0<=254), ,false,sensor.extension_operating_mode,sensor.extension_mode,15,0,1,9,1 -"T1RF",extension,220,flowtempvf,flow temperature in header (T0/Vf),int16 (>=-3199<=3199),C,false,sensor.extension_flow_temperature_in_header_(T0/Vf),sensor.extension_flowtempvf,15,0,1/10,0,1 -"T1RF",extension,220,input,input,uint8 (>=0<=25),V,false,sensor.extension_input,sensor.extension_input,15,0,1/10,1,1 -"T1RF",extension,220,outpow,output IO1,uint8 (>=0<=100),%,false,sensor.extension_output_IO1,sensor.extension_outpow,15,0,1,2,1 -"T1RF",extension,220,setpower,request power,uint8 (>=0<=100),%,false,sensor.extension_request_power,sensor.extension_setpower,15,0,1,3,1 -"T1RF",extension,220,setpoint,set temp.,uint8 (>=0<=254),C,false,sensor.extension_set_temp.,sensor.extension_setpoint,15,0,1,4,1 -"T1RF",extension,220,minv,min volt.,uint8 (>=0<=25),V,true,number.extension_min_volt.,number.extension_minv,15,0,1/10,5,1 -"T1RF",extension,220,maxv,max volt.,uint8 (>=0<=25),V,true,number.extension_max_volt.,number.extension_maxv,15,0,1/10,6,1 -"T1RF",extension,220,mint,min temp.,uint8 (>=0<=254),C,true,number.extension_min_temp.,number.extension_mint,15,0,1,7,1 -"T1RF",extension,220,maxt,max temp.,uint8 (>=0<=254),C,true,number.extension_max_temp.,number.extension_maxt,15,0,1,8,1 -"T1RF",extension,220,mode,operating mode,uint8 (>=0<=254), ,false,sensor.extension_operating_mode,sensor.extension_mode,15,0,1,9,1 -"AM200",heatsource,228,ahs1.sysflowtemp,system flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_system_flow_temperature,sensor.heatsource_ahs1_sysflowtemp,17,19,1/10,0,1 -"AM200",heatsource,228,ahs1.sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_system_return_temperature,sensor.heatsource_ahs1_sysrettemp,17,19,1/10,1,1 -"AM200",heatsource,228,ahs1.altflowtemp,alternative hs flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_alternative_hs_flow_temperature,sensor.heatsource_ahs1_altflowtemp,17,19,1/10,2,1 -"AM200",heatsource,228,ahs1.altrettemp,alternative hs return temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_alternative_hs_return_temperature,sensor.heatsource_ahs1_altrettemp,17,19,1/10,3,1 -"AM200",heatsource,228,ahs1.cyltoptemp,cylinder top temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_cylinder_top_temperature,sensor.heatsource_ahs1_cyltoptemp,17,19,1/10,4,1 -"AM200",heatsource,228,ahs1.cylcentertemp,cylinder center temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_cylinder_center_temperature,sensor.heatsource_ahs1_cylcentertemp,17,19,1/10,5,1 -"AM200",heatsource,228,ahs1.cylbottomtemp,cylinder bottom temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_cylinder_bottom_temperature,sensor.heatsource_ahs1_cylbottomtemp,17,19,1/10,6,1 -"AM200",heatsource,228,ahs1.fluegastemp,flue gas temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_flue_gas_temperature,sensor.heatsource_ahs1_fluegastemp,17,19,1/10,7,1 -"AM200",heatsource,228,ahs1.valvebuffer,buffer valve,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_buffer_valve,sensor.heatsource_ahs1_valvebuffer,17,19,1,8,1 -"AM200",heatsource,228,ahs1.valvereturn,return valve,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_return_valve,sensor.heatsource_ahs1_valvereturn,17,19,1,9,1 -"AM200",heatsource,228,ahs1.apumpmod,alternative hs pump modulation,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_alternative_hs_pump_modulation,sensor.heatsource_ahs1_apumpmod,17,19,1,10,1 -"AM200",heatsource,228,ahs1.vr2config,vr2 configuration,enum [off\|bypass], ,true,select.heatsource_ahs1_vr2_configuration,select.heatsource_ahs1_vr2config,17,19,1,11,1 -"AM200",heatsource,228,ahs1.ahsactivated,alternate heat source activation,boolean, ,true,switch.heatsource_ahs1_alternate_heat_source_activation,switch.heatsource_ahs1_ahsactivated,17,19,1,12,1 -"AM200",heatsource,228,ahs1.apumpconfig,primary pump config,boolean, ,true,switch.heatsource_ahs1_primary_pump_config,switch.heatsource_ahs1_apumpconfig,17,19,1,13,1 -"AM200",heatsource,228,ahs1.apumpsignal,output for pr1 pump,enum [off\|pwm\|pwm inverse], ,true,select.heatsource_ahs1_output_for_pr1_pump,select.heatsource_ahs1_apumpsignal,17,19,1,14,1 -"AM200",heatsource,228,ahs1.apumpmin,min output pump pr1,uint8 (>=12<=50),%,true,number.heatsource_ahs1_min_output_pump_pr1,number.heatsource_ahs1_apumpmin,17,19,1,15,1 -"AM200",heatsource,228,ahs1.temprise,ahs return temp rise,boolean, ,true,switch.heatsource_ahs1_ahs_return_temp_rise,switch.heatsource_ahs1_temprise,17,19,1,16,1 -"AM200",heatsource,228,ahs1.setreturntemp,set temp return,uint8 (>=40<=75),C,true,number.heatsource_ahs1_set_temp_return,number.heatsource_ahs1_setreturntemp,17,19,1,17,1 -"AM200",heatsource,228,ahs1.mixruntime,mixer run time,uint16 (>=0<=600),seconds,true,number.heatsource_ahs1_mixer_run_time,number.heatsource_ahs1_mixruntime,17,19,1,18,1 -"AM200",heatsource,228,ahs1.setflowtemp,set flow temperature,uint8 (>=40<=75),C,true,number.heatsource_ahs1_set_flow_temperature,number.heatsource_ahs1_setflowtemp,17,19,1,19,1 -"AM200",heatsource,228,ahs1.bufbypass,buffer bypass config,enum [no\|mixer\|valve], ,true,select.heatsource_ahs1_buffer_bypass_config,select.heatsource_ahs1_bufbypass,17,19,1,20,1 -"AM200",heatsource,228,ahs1.bufmixruntime,bypass mixer run time,uint16 (>=0<=600),seconds,true,number.heatsource_ahs1_bypass_mixer_run_time,number.heatsource_ahs1_bufmixruntime,17,19,1,21,1 -"AM200",heatsource,228,ahs1.bufconfig,dhw buffer config,enum [off\|monovalent\|bivalent], ,true,select.heatsource_ahs1_dhw_buffer_config,select.heatsource_ahs1_bufconfig,17,19,1,22,1 -"AM200",heatsource,228,ahs1.blockmode,config htg. blocking mode,enum [off\|auto\|blocking], ,true,select.heatsource_ahs1_config_htg._blocking_mode,select.heatsource_ahs1_blockmode,17,19,1,23,1 -"AM200",heatsource,228,ahs1.blockterm,config of block terminal,enum [n_o\|n_c], ,true,select.heatsource_ahs1_config_of_block_terminal,select.heatsource_ahs1_blockterm,17,19,1,24,1 -"AM200",heatsource,228,ahs1.blockhyst,hyst. for boiler block,int8 (>=0<=50),C,true,number.heatsource_ahs1_hyst._for_boiler_block,number.heatsource_ahs1_blockhyst,17,19,1,25,1 -"AM200",heatsource,228,ahs1.releasewait,boiler release wait time,uint8 (>=0<=240),minutes,true,number.heatsource_ahs1_boiler_release_wait_time,number.heatsource_ahs1_releasewait,17,19,1,26,1 -"AM200",heatsource,228,ahs1.burner,burner,boolean, ,false,binary_sensor.heatsource_ahs1_burner,binary_sensor.heatsource_ahs1_burner,17,19,1,27,1 -"AM200",heatsource,228,ahs1.apump,alternative hs pump,boolean, ,false,binary_sensor.heatsource_ahs1_alternative_hs_pump,binary_sensor.heatsource_ahs1_apump,17,19,1,28,1 -"AM200",heatsource,228,ahs1.heatrequest,heat request,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_heat_request,sensor.heatsource_ahs1_heatrequest,17,19,1,29,1 -"AM200",heatsource,228,ahs1.blockremain,remaining blocktime,uint8 (>=0<=254),minutes,false,sensor.heatsource_ahs1_remaining_blocktime,sensor.heatsource_ahs1_blockremain,17,19,1,30,1 -"AM200",heatsource,228,ahs1.blockremaindhw,remaining blocktime dhw,uint8 (>=0<=254),minutes,false,sensor.heatsource_ahs1_remaining_blocktime_dhw,sensor.heatsource_ahs1_blockremaindhw,17,19,1,31,1 -"Logavent HRV176",ventilation,231,outfresh,outdoor fresh air,int16 (>=-3199<=3199),C,false,sensor.ventilation_outdoor_fresh_air,sensor.ventilation_outfresh,18,0,1/10,0,1 -"Logavent HRV176",ventilation,231,infresh,indoor fresh air,int16 (>=-3199<=3199),C,false,sensor.ventilation_indoor_fresh_air,sensor.ventilation_infresh,18,0,1/10,1,1 -"Logavent HRV176",ventilation,231,outexhaust,outdoor exhaust air,int16 (>=-3199<=3199),C,false,sensor.ventilation_outdoor_exhaust_air,sensor.ventilation_outexhaust,18,0,1/10,2,1 -"Logavent HRV176",ventilation,231,inexhaust,indoor exhaust air,int16 (>=-3199<=3199),C,false,sensor.ventilation_indoor_exhaust_air,sensor.ventilation_inexhaust,18,0,1/10,3,1 -"Logavent HRV176",ventilation,231,ventinspeed,in blower speed,uint8 (>=0<=100),%,false,sensor.ventilation_in_blower_speed,sensor.ventilation_ventinspeed,18,0,1,4,1 -"Logavent HRV176",ventilation,231,ventoutspeed,out blower speed,uint8 (>=0<=100),%,false,sensor.ventilation_out_blower_speed,sensor.ventilation_ventoutspeed,18,0,1,5,1 -"Logavent HRV176",ventilation,231,ventmode,ventilation mode,enum [auto\|off\|L1\|L2\|L3\|L4\|demand\|sleep\|intense\|bypass\|party\|fireplace], ,true,select.ventilation_ventilation_mode,select.ventilation_ventmode,18,0,1,6,1 -"Logavent HRV176",ventilation,231,airquality,air quality (voc),uint16 (>=0<=31999), ,false,sensor.ventilation_air_quality_(voc),sensor.ventilation_airquality,18,0,1,7,1 -"Logavent HRV176",ventilation,231,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.ventilation_relative_air_humidity,sensor.ventilation_airhumidity,18,0,1,8,1 -"Logavent HRV176",ventilation,231,bypass,bypass,boolean, ,true,switch.ventilation_bypass,switch.ventilation_bypass,18,0,1,9,1 -"IPM",water,100,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 -"IPM",water,100,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 -"IPM",water,100,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_extern_temperature,sensor.water_dhw_curtemp2,19,9,1/10,2,1 -"IPM",water,100,dhw.hydrTemp,hydraulic header temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_hydraulic_header_temperature,sensor.water_dhw_hydrTemp,19,9,1/10,3,1 -"IPM",water,100,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 -"IPM",water,100,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=254),C,true,number.water_dhw_flow_temperature_offset,number.water_dhw_flowtempoffset,19,9,1,5,1 -"IPM",water,100,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_on_temperature,number.water_dhw_hyston,19,9,1,6,1 -"IPM",water,100,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_off_temperature,number.water_dhw_hystoff,19,9,1,7,1 -"IPM",water,100,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 -"IPM",water,100,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 -"IPM",water,100,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 -"IPM2",water,102,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 -"IPM2",water,102,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 -"IPM2",water,102,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_extern_temperature,sensor.water_dhw_curtemp2,19,9,1/10,2,1 -"IPM2",water,102,dhw.hydrTemp,hydraulic header temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_hydraulic_header_temperature,sensor.water_dhw_hydrTemp,19,9,1/10,3,1 -"IPM2",water,102,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 -"IPM2",water,102,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=254),C,true,number.water_dhw_flow_temperature_offset,number.water_dhw_flowtempoffset,19,9,1,5,1 -"IPM2",water,102,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_on_temperature,number.water_dhw_hyston,19,9,1,6,1 -"IPM2",water,102,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_off_temperature,number.water_dhw_hystoff,19,9,1,7,1 -"IPM2",water,102,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 -"IPM2",water,102,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 -"IPM2",water,102,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 -"MM100",water,160,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 -"MM100",water,160,dhw.tempstatus,temperature switch in assigned dhw (MC1),int8 (>=-126<=126), ,false,sensor.water_dhw_temperature_switch_in_assigned_dhw_(MC1),sensor.water_dhw_tempstatus,19,9,1,11,1 -"MM100",water,160,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 -"MM100",water,160,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 -"MM100",water,160,dhw.difftemp,start differential temperature,int8 (>=-126<=126),C,true,number.water_dhw_start_differential_temperature,number.water_dhw_difftemp,19,9,1,13,1 -"MM100",water,160,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 -"MM100",water,160,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 -"MM100",water,160,dhw.requiredtemp,required temperature,uint8 (>=0<=254),C,true,number.water_dhw_required_temperature,number.water_dhw_requiredtemp,19,9,1,15,1 -"MM100",water,160,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 -"MM100",water,160,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 -"MM200",water,161,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 -"MM200",water,161,dhw.tempstatus,temperature switch in assigned dhw (MC1),int8 (>=-126<=126), ,false,sensor.water_dhw_temperature_switch_in_assigned_dhw_(MC1),sensor.water_dhw_tempstatus,19,9,1,11,1 -"MM200",water,161,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 -"MM200",water,161,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 -"MM200",water,161,dhw.difftemp,start differential temperature,int8 (>=-126<=126),C,true,number.water_dhw_start_differential_temperature,number.water_dhw_difftemp,19,9,1,13,1 -"MM200",water,161,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 -"MM200",water,161,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 -"MM200",water,161,dhw.requiredtemp,required temperature,uint8 (>=0<=254),C,true,number.water_dhw_required_temperature,number.water_dhw_requiredtemp,19,9,1,15,1 -"MM200",water,161,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 -"MM200",water,161,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 -"SM100, MS100",water,163,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 -"SM100, MS100",water,163,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_storage_intern_temperature,sensor.water_dhw_storagetemp1,19,9,1/10,16,1 -"SM100, MS100",water,163,dhw.coldtemp,cold water,uint16 (>=0<=3199),C,false,sensor.water_dhw_cold_water,sensor.water_dhw_coldtemp,19,9,1/10,17,1 -"SM100, MS100",water,163,dhw.temp5,temperature 5,uint16 (>=0<=3199),C,false,sensor.water_dhw_temperature_5,sensor.water_dhw_temp5,19,9,1/10,18,1 -"SM100, MS100",water,163,dhw.rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_return_temperature,sensor.water_dhw_rettemp,19,9,1/10,19,1 -"SM100, MS100",water,163,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 -"SM100, MS100",water,163,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 -"SM100, MS100",water,163,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 -"SM100, MS100",water,163,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 -"SM100, MS100",water,163,dhw.hottemp,extra hot temperature,uint8 (>=0<=254),C,true,number.water_dhw_extra_hot_temperature,number.water_dhw_hottemp,19,9,1,20,1 -"SM100, MS100",water,163,dhw.dailytemp,daily temperature,uint8 (>=0<=254),C,true,number.water_dhw_daily_temperature,number.water_dhw_dailytemp,19,9,1,21,1 -"SM100, MS100",water,163,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 -"SM100, MS100",water,163,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 -"SM100, MS100",water,163,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 -"SM100, MS100",water,163,dhw.circtc,circulation time controled,boolean, ,true,switch.water_dhw_circulation_time_controled,switch.water_dhw_circtc,19,9,1,22,1 -"SM100, MS100",water,163,dhw.keepwarm,keep warm,boolean, ,true,switch.water_dhw_keep_warm,switch.water_dhw_keepwarm,19,9,1,23,1 -"SM100, MS100",water,163,dhw.status2,status 2,enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold], ,false,sensor.water_dhw_status_2,sensor.water_dhw_status2,19,9,1,24,1 -"SM100, MS100",water,163,dhw.pumpmod,pump modulation,uint8 (>=0<=100),%,false,sensor.water_dhw_pump_modulation,sensor.water_dhw_pumpmod,19,9,1,25,1 -"SM100, MS100",water,163,dhw.flow,flow rate,uint16 (>=0<=3199),l/min,false,sensor.water_dhw_flow_rate,sensor.water_dhw_flow,19,9,1/10,26,1 -"SM100, MS100",water,163,dhw.valvereturn,return valve,uint8 (>=0<=100),%,true,number.water_dhw_return_valve,number.water_dhw_valvereturn,19,9,1,27,1 -"SM100, MS100",water,163,dhw.deltatret,temp. diff. return valve,uint8 (>=0<=254),K,true,number.water_dhw_temp._diff._return_valve,number.water_dhw_deltatret,19,9,1,28,1 -"SM100, MS100",water,163,dhw.errordisp,error display,enum [off\|normal\|inverted], ,true,select.water_dhw_error_display,select.water_dhw_errordisp,19,9,1,29,1 -"SM200, MS200",water,164,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 -"SM200, MS200",water,164,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_storage_intern_temperature,sensor.water_dhw_storagetemp1,19,9,1/10,16,1 -"SM200, MS200",water,164,dhw.coldtemp,cold water,uint16 (>=0<=3199),C,false,sensor.water_dhw_cold_water,sensor.water_dhw_coldtemp,19,9,1/10,17,1 -"SM200, MS200",water,164,dhw.temp5,temperature 5,uint16 (>=0<=3199),C,false,sensor.water_dhw_temperature_5,sensor.water_dhw_temp5,19,9,1/10,18,1 -"SM200, MS200",water,164,dhw.rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_return_temperature,sensor.water_dhw_rettemp,19,9,1/10,19,1 -"SM200, MS200",water,164,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 -"SM200, MS200",water,164,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 -"SM200, MS200",water,164,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 -"SM200, MS200",water,164,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 -"SM200, MS200",water,164,dhw.hottemp,extra hot temperature,uint8 (>=0<=254),C,true,number.water_dhw_extra_hot_temperature,number.water_dhw_hottemp,19,9,1,20,1 -"SM200, MS200",water,164,dhw.dailytemp,daily temperature,uint8 (>=0<=254),C,true,number.water_dhw_daily_temperature,number.water_dhw_dailytemp,19,9,1,21,1 -"SM200, MS200",water,164,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 -"SM200, MS200",water,164,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 -"SM200, MS200",water,164,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 -"SM200, MS200",water,164,dhw.circtc,circulation time controled,boolean, ,true,switch.water_dhw_circulation_time_controled,switch.water_dhw_circtc,19,9,1,22,1 -"SM200, MS200",water,164,dhw.keepwarm,keep warm,boolean, ,true,switch.water_dhw_keep_warm,switch.water_dhw_keepwarm,19,9,1,23,1 -"SM200, MS200",water,164,dhw.status2,status 2,enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold], ,false,sensor.water_dhw_status_2,sensor.water_dhw_status2,19,9,1,24,1 -"SM200, MS200",water,164,dhw.pumpmod,pump modulation,uint8 (>=0<=100),%,false,sensor.water_dhw_pump_modulation,sensor.water_dhw_pumpmod,19,9,1,25,1 -"SM200, MS200",water,164,dhw.flow,flow rate,uint16 (>=0<=3199),l/min,false,sensor.water_dhw_flow_rate,sensor.water_dhw_flow,19,9,1/10,26,1 -"SM200, MS200",water,164,dhw.valvereturn,return valve,uint8 (>=0<=100),%,true,number.water_dhw_return_valve,number.water_dhw_valvereturn,19,9,1,27,1 -"SM200, MS200",water,164,dhw.deltatret,temp. diff. return valve,uint8 (>=0<=254),K,true,number.water_dhw_temp._diff._return_valve,number.water_dhw_deltatret,19,9,1,28,1 -"SM200, MS200",water,164,dhw.errordisp,error display,enum [off\|normal\|inverted], ,true,select.water_dhw_error_display,select.water_dhw_errordisp,19,9,1,29,1 -"MP100",pool,204,pooltemp,pool temperature,int16 (>=-3199<=3199),C,false,sensor.pool_pool_temperature,sensor.pool_pooltemp,20,0,1/10,-1,1 -"MP100",pool,204,poolshuntstatus,pool shunt status opening/closing,enum [stopped\|opening\|closing\|open\|close], ,false,sensor.pool_pool_shunt_status_opening/closing,sensor.pool_poolshuntstatus,20,0,1,-1,1 -"MP100",pool,204,poolshunt,pool shunt open/close (0% = pool / 100% = heat),uint8 (>=0<=100),%,false,sensor.pool_pool_shunt_open/close_(0%_=_pool_/_100%_=_heat),sensor.pool_poolshunt,20,0,1,-1,1 +device name,device type,product id,shortname,fullname,type [options...] \| (min/max),uom,writeable,discovery entityid v3.4,discovery entityid,modbus unit identifier,modbus block,modbus scale factor,modbus offset,modbus count +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,mandefrost,manual defrost,cmd [off\|on], ,true,sensor.boiler_manual_defrost,sensor.boiler_mandefrost,5,0,1,84,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_energy,sensor.boiler_dhw_nrg,5,9,1/100,0,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_heating,sensor.boiler_nrgheat,5,0,1/100,87,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgcool,energy cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_cooling,sensor.boiler_nrgcool,5,0,1/100,89,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_total,sensor.boiler_metertotal,5,0,1/100,91,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_compressor,sensor.boiler_metercomp,5,0,1/100,93,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_e-heater,sensor.boiler_metereheat,5,0,1/100,95,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/100,97,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,metercool,meter cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_cooling,sensor.boiler_metercool,5,0,1/100,99,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/100,2,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,uptimetotal,heatpump total uptime,time (>=0<=279620),minutes,false,sensor.boiler_heatpump_total_uptime,sensor.boiler_uptimetotal,5,0,1/60,101,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,uptimecontrol,total operating time heat,time (>=0<=279620),minutes,false,sensor.boiler_total_operating_time_heat,sensor.boiler_uptimecontrol,5,0,1/60,103,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,uptimecompheating,operating time compressor heating,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_heating,sensor.boiler_uptimecompheating,5,0,1/60,105,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,uptimecompcooling,operating time compressor cooling,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_cooling,sensor.boiler_uptimecompcooling,5,0,1/60,107,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.uptimecomp,operating time compressor,time (>=0<=279620),minutes,false,sensor.boiler_dhw_operating_time_compressor,sensor.boiler_dhw_uptimecomp,5,9,1/60,4,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,uptimecomppool,operating time compressor pool,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_pool,sensor.boiler_uptimecomppool,5,0,1/60,109,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,totalcompstarts,total compressor control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_total_compressor_control_starts,sensor.boiler_totalcompstarts,5,0,1,111,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_heating_control_starts,sensor.boiler_heatingstarts,5,0,1,113,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,coolingstarts,cooling control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_cooling_control_starts,sensor.boiler_coolingstarts,5,0,1,115,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts_hp,sensor.boiler_dhw_startshp,5,9,1,6,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,poolstarts,pool control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_pool_control_starts,sensor.boiler_poolstarts,5,0,1,117,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgconstotal,total energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption,sensor.boiler_nrgconstotal,5,0,1,119,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgconscomptotal,total energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption_compressor,sensor.boiler_nrgconscomptotal,5,0,1,121,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgconscompheating,energy consumption compressor heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_heating,sensor.boiler_nrgconscompheating,5,0,1,123,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.nrgconscomp,energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_energy_consumption_compressor,sensor.boiler_dhw_nrgconscomp,5,9,1,8,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgconscompcooling,energy consumption compressor cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_cooling,sensor.boiler_nrgconscompcooling,5,0,1,125,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgconscomppool,energy consumption compressor pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_pool,sensor.boiler_nrgconscomppool,5,0,1,127,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxelecheatnrgconstotal,total aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_aux_elec._heater_energy_consumption,sensor.boiler_auxelecheatnrgconstotal,5,0,1,129,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxelecheatnrgconsheating,aux elec. heater energy consumption heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_heating,sensor.boiler_auxelecheatnrgconsheating,5,0,1,131,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.auxelecheatnrgcons,aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_aux_elec._heater_energy_consumption,sensor.boiler_dhw_auxelecheatnrgcons,5,9,1,10,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxelecheatnrgconspool,aux elec. heater energy consumption pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_pool,sensor.boiler_auxelecheatnrgconspool,5,0,1,133,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgsupptotal,total energy supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied,sensor.boiler_nrgsupptotal,5,0,1,135,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgsuppheating,total energy supplied heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_heating,sensor.boiler_nrgsuppheating,5,0,1,137,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.nrgsupp,total energy warm supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_total_energy_warm_supplied,sensor.boiler_dhw_nrgsupp,5,9,1,12,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgsuppcooling,total energy supplied cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_cooling,sensor.boiler_nrgsuppcooling,5,0,1,139,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,nrgsupppool,total energy supplied pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_pool,sensor.boiler_nrgsupppool,5,0,1,141,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hppower,compressor power output,uint16 (>=0<=3199),kW,false,sensor.boiler_compressor_power_output,sensor.boiler_hppower,5,0,1/10,143,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpmaxpower,compressor max power,uint8 (>=0<=100),%,true,number.boiler_compressor_max_power,number.boiler_hpmaxpower,5,0,1,144,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pvmaxcomp,pv compressor max power,uint8 (>=0<=25),kW,true,number.boiler_pv_compressor_max_power,number.boiler_pvmaxcomp,5,0,1/10,145,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,powerreduction,power reduction,uint8 (>=30<=60),%,true,number.boiler_power_reduction,number.boiler_powerreduction,5,0,10,146,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpsetdiffpress,set differential pressure,uint8 (>=150<=750),mbar,true,number.boiler_set_differential_pressure,number.boiler_hpsetdiffpress,5,0,50,147,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpcompon,hp compressor,boolean, ,false,binary_sensor.boiler_hp_compressor,binary_sensor.boiler_hpcompon,5,0,1,148,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpactivity,compressor activity,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_compressor_activity,sensor.boiler_hpactivity,5,0,1,149,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpbrinepumpspd,brine pump speed,uint8 (>=0<=100),%,false,sensor.boiler_brine_pump_speed,sensor.boiler_hpbrinepumpspd,5,0,1,150,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpswitchvalve,switch valve,boolean, ,false,binary_sensor.boiler_switch_valve,binary_sensor.boiler_hpswitchvalve,5,0,1,151,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_speed,sensor.boiler_hpcompspd,5,0,1,152,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptargetspd,compressor target speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_target_speed,sensor.boiler_hptargetspd,5,0,1,153,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpcircspd,circulation pump speed,uint8 (>=0<=100),%,false,sensor.boiler_circulation_pump_speed,sensor.boiler_hpcircspd,5,0,1,154,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,recvalve,receiver valve VR0,uint8 (>=0<=100),%,false,sensor.boiler_receiver_valve_VR0,sensor.boiler_recvalve,5,0,1,155,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,expvalve,expansion valve VR1,uint8 (>=0<=100),%,false,sensor.boiler_expansion_valve_VR1,sensor.boiler_expvalve,5,0,1,156,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpbrinein,brine in/evaporator,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_in/evaporator,sensor.boiler_hpbrinein,5,0,1/10,157,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpbrineout,brine out/condenser,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_out/condenser,sensor.boiler_hpbrineout,5,0,1/10,158,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptc0,heat carrier return (TC0),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_return_(TC0),sensor.boiler_hptc0,5,0,1/10,159,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptc1,heat carrier forward (TC1),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_forward_(TC1),sensor.boiler_hptc1,5,0,1/10,160,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptc3,condenser temperature (TC3),int16 (>=-3199<=3199),C,false,sensor.boiler_condenser_temperature_(TC3),sensor.boiler_hptc3,5,0,1/10,161,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_temperature_(TR1),sensor.boiler_hptr1,5,0,1/10,162,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.boiler_hptr3,5,0,1/10,163,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.boiler_evaporator_inlet_temperature_(TR4),sensor.boiler_hptr4,5,0,1/10,164,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_inlet_temperature_(TR5),sensor.boiler_hptr5,5,0,1/10,165,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_outlet_temperature_(TR6),sensor.boiler_hptr6,5,0,1/10,166,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptr7,refrigerant temperature gas side (condenser input) (TR7),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_gas_side_(condenser_input)_(TR7),sensor.boiler_hptr7,5,0,1/10,167,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.boiler_air_inlet_temperature_(TL2),sensor.boiler_hptl2,5,0,1/10,168,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.boiler_low_pressure_side_temperature_(PL1),sensor.boiler_hppl1,5,0,1/10,169,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.boiler_high_pressure_side_temperature_(PH1),sensor.boiler_hpph1,5,0,1/10,170,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.boiler_drain_pan_temp_(TA4),sensor.boiler_hpta4,5,0,1/10,171,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hptw1,reservoir temp (TW1),int16 (>=-3199<=3199),C,false,sensor.boiler_reservoir_temp_(TW1),sensor.boiler_hptw1,5,0,1/10,172,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,poolsettemp,pool set temperature,uint8 (>=0<=127),C,true,number.boiler_pool_set_temperature,number.boiler_poolsettemp,5,0,1/2,173,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin1,input 1 state,boolean, ,false,binary_sensor.boiler_input_1_state,binary_sensor.boiler_hpin1,5,0,1,174,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin1opt,input 1 options,string, ,true,sensor.boiler_input_1_options,sensor.boiler_hpin1opt,5,0,1,175,8 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin2,input 2 state,boolean, ,false,binary_sensor.boiler_input_2_state,binary_sensor.boiler_hpin2,5,0,1,183,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin2opt,input 2 options,string, ,true,sensor.boiler_input_2_options,sensor.boiler_hpin2opt,5,0,1,184,8 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin3,input 3 state,boolean, ,false,binary_sensor.boiler_input_3_state,binary_sensor.boiler_hpin3,5,0,1,192,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin3opt,input 3 options,string, ,true,sensor.boiler_input_3_options,sensor.boiler_hpin3opt,5,0,1,193,8 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin4,input 4 state,boolean, ,false,binary_sensor.boiler_input_4_state,binary_sensor.boiler_hpin4,5,0,1,201,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpin4opt,input 4 options,string, ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,5,0,1,202,8 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maxheatcomp,heat limit compressor,enum [0 kW\|3 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,5,0,1,210,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,maxheatheat,heat limit heating,enum [3 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,5,0,1,211,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.maxheat,heat limit,enum [3 kW\|6 kW\|9 kW], ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,5,9,1,14,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheatersource,aux heater source,enum [not installed\|electric heater\|exclusive\|parallel\|hybrid], ,true,select.boiler_aux_heater_source,select.boiler_auxheatersource,5,0,1,212,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,pvcooling,cooling only with PV,boolean, ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,5,0,1,213,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheateronly,aux heater only,boolean, ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,5,0,1,214,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheateroff,disable aux heater,boolean, ,true,switch.boiler_disable_aux_heater,switch.boiler_auxheateroff,5,0,1,215,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheaterstatus,aux heater status,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_aux_heater_status,sensor.boiler_auxheaterstatus,5,0,1,216,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheaterlevel,aux heater level,uint8 (>=0<=100),%,false,sensor.boiler_aux_heater_level,sensor.boiler_auxheaterlevel,5,0,1,217,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheaterdelay,aux heater on delay,uint16 (>=10<=1000),K*min,true,number.boiler_aux_heater_on_delay,number.boiler_auxheaterdelay,5,0,10,218,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxmaxlimit,aux heater max limit,uint8 (>=0<=10),K,true,number.boiler_aux_heater_max_limit,number.boiler_auxmaxlimit,5,0,1/10,219,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxlimitstart,aux heater limit start,uint8 (>=0<=10),K,true,number.boiler_aux_heater_limit_start,number.boiler_auxlimitstart,5,0,1/10,220,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheatrmode,aux heater mode,enum [eco\|comfort], ,true,select.boiler_aux_heater_mode,select.boiler_auxheatrmode,5,0,1,221,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hphystheat,on/off hyst heat,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_heat,number.boiler_hphystheat,5,0,5,222,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hphystcool,on/off hyst cool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_cool,number.boiler_hphystcool,5,0,5,223,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hphystpool,on/off hyst pool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_pool,number.boiler_hphystpool,5,0,5,224,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,silentmode,silent mode,enum [off\|auto\|on], ,true,select.boiler_silent_mode,select.boiler_silentmode,5,0,1,225,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,silentfrom,silent mode from,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_from,number.boiler_silentfrom,5,0,15,226,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,silentto,silent mode to,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_to,number.boiler_silentto,5,0,15,227,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,mintempsilent,min outside temp for silent mode,int8 (>=-126<=126),C,true,number.boiler_min_outside_temp_for_silent_mode,number.boiler_mintempsilent,5,0,1,228,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,tempparmode,outside temp parallel mode,int8 (>=-126<=126),C,true,number.boiler_outside_temp_parallel_mode,number.boiler_tempparmode,5,0,1,229,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,auxheatmix,aux heater mixing valve,int8 (>=-100<=100),%,false,sensor.boiler_aux_heater_mixing_valve,sensor.boiler_auxheatmix,5,0,1,230,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,tempdiffheat,temp diff TC3/TC0 heat,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_heat,number.boiler_tempdiffheat,5,0,1/10,231,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,tempdiffcool,temp diff TC3/TC0 cool,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_cool,number.boiler_tempdiffcool,5,0,1/10,232,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,vpcooling,valve/pump cooling,boolean, ,true,switch.boiler_valve/pump_cooling,switch.boiler_vpcooling,5,0,1,233,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,heatcable,heating cable,boolean, ,true,switch.boiler_heating_cable,switch.boiler_heatcable,5,0,1,234,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,vc0valve,VC0 valve,boolean, ,true,switch.boiler_VC0_valve,switch.boiler_vc0valve,5,0,1,235,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,primepump,primary heatpump,boolean, ,true,switch.boiler_primary_heatpump,switch.boiler_primepump,5,0,1,236,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,primepumpmod,primary heatpump modulation,uint8 (>=0<=100),%,true,number.boiler_primary_heatpump_modulation,number.boiler_primepumpmod,5,0,1,237,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hp3way,3-way valve,boolean, ,true,switch.boiler_3-way_valve,switch.boiler_hp3way,5,0,1,238,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,elheatstep1,el. heater step 1,boolean, ,true,switch.boiler_el._heater_step_1,switch.boiler_elheatstep1,5,0,1,239,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,elheatstep2,el. heater step 2,boolean, ,true,switch.boiler_el._heater_step_2,switch.boiler_elheatstep2,5,0,1,240,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,elheatstep3,el. heater step 3,boolean, ,true,switch.boiler_el._heater_step_3,switch.boiler_elheatstep3,5,0,1,241,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpea0,condensate reservoir heating (EA0),boolean, ,false,binary_sensor.boiler_condensate_reservoir_heating_(EA0),binary_sensor.boiler_hpea0,5,0,1,242,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hppumpmode,primary heatpump mode,enum [auto\|continuous], ,true,select.boiler_primary_heatpump_mode,select.boiler_hppumpmode,5,0,1,243,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,fan,fan,uint8 (>=20<=100),%,true,number.boiler_fan,number.boiler_fan,5,0,1,244,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,fanspd,fan speed,uint8 (>=0<=100),%,false,sensor.boiler_fan_speed,sensor.boiler_fanspd,5,0,1,245,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,shutdown,shutdown,cmd [off\|on], ,true,sensor.boiler_shutdown,sensor.boiler_shutdown,5,0,1,246,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hpcurrpower,compressor current power,uint16 (>=0<=31999),W,false,sensor.boiler_compressor_current_power,sensor.boiler_hpcurrpower,5,0,1,247,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,hppowerlimit,power limit,uint16 (>=0<=31999),W,true,number.boiler_power_limit,number.boiler_hppowerlimit,5,0,1,248,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.alternatingop,alternating operation,boolean, ,true,switch.boiler_dhw_alternating_operation,switch.boiler_dhw_alternatingop,5,9,1,15,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.altopprioheat,prioritise heating during dhw,uint8 (>=20<=120),minutes,true,number.boiler_dhw_prioritise_heating_during_dhw,number.boiler_dhw_altopprioheat,5,9,1,16,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.altopprio,prioritise dhw during heating,uint8 (>=30<=120),minutes,true,number.boiler_dhw_prioritise_dhw_during_heating,number.boiler_dhw_altopprio,5,9,1,17,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,5,9,1,18,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,5,9,1,19,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,5,9,1,20,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfdiff,comfort diff,uint8 (>=4<=15),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,5,9,1,21,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecodiff,eco diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,5,9,1,22,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusdiff,eco+ diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,5,9,1,23,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfstop,comfort stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,5,9,1,24,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecostop,eco stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,5,9,1,25,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,5,9,1,26,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.hpcircpump,circulation pump available during dhw,boolean, ,true,switch.boiler_dhw_circulation_pump_available_during_dhw,switch.boiler_dhw_hpcircpump,5,9,1,27,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"CS5800i, CS6800i, WLW176i, WLW186i",boiler,8,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Greenstar 2000",boiler,11,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Greenstar 2000",boiler,11,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Greenstar 2000",boiler,11,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Greenstar 2000",boiler,11,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Greenstar 2000",boiler,11,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Greenstar 2000",boiler,11,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Greenstar 2000",boiler,11,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Greenstar 2000",boiler,11,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Greenstar 2000",boiler,11,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Greenstar 2000",boiler,11,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Greenstar 2000",boiler,11,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Greenstar 2000",boiler,11,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Greenstar 2000",boiler,11,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Greenstar 2000",boiler,11,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Greenstar 2000",boiler,11,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Greenstar 2000",boiler,11,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Greenstar 2000",boiler,11,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Greenstar 2000",boiler,11,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Greenstar 2000",boiler,11,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Greenstar 2000",boiler,11,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Greenstar 2000",boiler,11,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Greenstar 2000",boiler,11,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Greenstar 2000",boiler,11,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Greenstar 2000",boiler,11,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Greenstar 2000",boiler,11,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Greenstar 2000",boiler,11,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Greenstar 2000",boiler,11,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Greenstar 2000",boiler,11,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Greenstar 2000",boiler,11,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Greenstar 2000",boiler,11,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Greenstar 2000",boiler,11,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Greenstar 2000",boiler,11,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Greenstar 2000",boiler,11,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Greenstar 2000",boiler,11,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Greenstar 2000",boiler,11,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Greenstar 2000",boiler,11,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Greenstar 2000",boiler,11,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Greenstar 2000",boiler,11,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Greenstar 2000",boiler,11,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Greenstar 2000",boiler,11,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Greenstar 2000",boiler,11,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Greenstar 2000",boiler,11,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Greenstar 2000",boiler,11,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Greenstar 2000",boiler,11,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Greenstar 2000",boiler,11,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Greenstar 2000",boiler,11,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Greenstar 2000",boiler,11,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Greenstar 2000",boiler,11,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Greenstar 2000",boiler,11,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Greenstar 2000",boiler,11,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Greenstar 2000",boiler,11,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Greenstar 2000",boiler,11,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Greenstar 2000",boiler,11,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Greenstar 2000",boiler,11,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Greenstar 2000",boiler,11,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Greenstar 2000",boiler,11,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Greenstar 2000",boiler,11,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Greenstar 2000",boiler,11,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Greenstar 2000",boiler,11,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Greenstar 2000",boiler,11,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Greenstar 2000",boiler,11,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Greenstar 2000",boiler,11,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Greenstar 2000",boiler,11,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Greenstar 2000",boiler,11,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Greenstar 2000",boiler,11,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Greenstar 2000",boiler,11,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Greenstar 2000",boiler,11,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Greenstar 2000",boiler,11,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Greenstar 2000",boiler,11,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Greenstar 2000",boiler,11,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Greenstar 2000",boiler,11,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Greenstar 2000",boiler,11,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Greenstar 2000",boiler,11,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Greenstar 2000",boiler,11,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Greenstar 2000",boiler,11,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Greenstar 2000",boiler,11,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Greenstar 2000",boiler,11,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Greenstar 2000",boiler,11,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Greenstar 2000",boiler,11,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Greenstar 2000",boiler,11,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Greenstar 2000",boiler,11,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Greenstar 2000",boiler,11,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Greenstar 2000",boiler,11,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Greenstar 2000",boiler,11,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Greenstar 2000",boiler,11,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Greenstar 2000",boiler,11,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Greenstar 2000",boiler,11,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Greenstar 2000",boiler,11,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Greenstar 2000",boiler,11,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Greenstar 2000",boiler,11,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Greenstar 2000",boiler,11,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Greenstar 2000",boiler,11,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Greenstar 2000",boiler,11,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Greenstar 2000",boiler,11,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Greenstar 2000",boiler,11,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Greenstar 2000",boiler,11,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Greenstar 2000",boiler,11,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Greenstar 2000",boiler,11,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Greenstar 2000",boiler,11,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Greenstar 2000",boiler,11,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Greenstar 2000",boiler,11,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Greenstar 2000",boiler,11,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Greenstar 2000",boiler,11,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Greenstar 2000",boiler,11,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Greenstar 2000",boiler,11,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Greenstar 2000",boiler,11,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Greenstar 2000",boiler,11,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Greenstar 2000",boiler,11,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Greenstar 2000",boiler,11,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Greenstar 2000",boiler,11,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Greenstar 2000",boiler,11,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Greenstar 2000",boiler,11,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Greenstar 2000",boiler,11,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Greenstar 2000",boiler,11,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Greenstar 2000",boiler,11,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Greenstar 2000",boiler,11,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Greenstar 2000",boiler,11,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"C1200W",boiler,12,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"C1200W",boiler,12,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"C1200W",boiler,12,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"C1200W",boiler,12,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"C1200W",boiler,12,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"C1200W",boiler,12,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"C1200W",boiler,12,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"C1200W",boiler,12,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"C1200W",boiler,12,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"C1200W",boiler,12,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"C1200W",boiler,12,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"C1200W",boiler,12,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"C1200W",boiler,12,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"C1200W",boiler,12,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"C1200W",boiler,12,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"C1200W",boiler,12,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"C1200W",boiler,12,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"C1200W",boiler,12,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"C1200W",boiler,12,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"C1200W",boiler,12,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"C1200W",boiler,12,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"C1200W",boiler,12,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"C1200W",boiler,12,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"C1200W",boiler,12,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"C1200W",boiler,12,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"C1200W",boiler,12,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"C1200W",boiler,12,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"C1200W",boiler,12,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"C1200W",boiler,12,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"C1200W",boiler,12,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"C1200W",boiler,12,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"C1200W",boiler,12,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"C1200W",boiler,12,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"C1200W",boiler,12,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"C1200W",boiler,12,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"C1200W",boiler,12,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"C1200W",boiler,12,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"C1200W",boiler,12,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"C1200W",boiler,12,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"C1200W",boiler,12,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"C1200W",boiler,12,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"C1200W",boiler,12,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"C1200W",boiler,12,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"C1200W",boiler,12,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"C1200W",boiler,12,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"C1200W",boiler,12,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"C1200W",boiler,12,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"C1200W",boiler,12,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"C1200W",boiler,12,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"C1200W",boiler,12,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"C1200W",boiler,12,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"C1200W",boiler,12,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"C1200W",boiler,12,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"C1200W",boiler,12,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"C1200W",boiler,12,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"C1200W",boiler,12,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"C1200W",boiler,12,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"C1200W",boiler,12,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"C1200W",boiler,12,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"C1200W",boiler,12,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"C1200W",boiler,12,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"C1200W",boiler,12,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"C1200W",boiler,12,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"C1200W",boiler,12,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"C1200W",boiler,12,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"C1200W",boiler,12,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"C1200W",boiler,12,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"C1200W",boiler,12,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"C1200W",boiler,12,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"C1200W",boiler,12,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"C1200W",boiler,12,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"C1200W",boiler,12,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"C1200W",boiler,12,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"C1200W",boiler,12,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"C1200W",boiler,12,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"C1200W",boiler,12,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"C1200W",boiler,12,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"C1200W",boiler,12,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"C1200W",boiler,12,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"C1200W",boiler,12,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"C1200W",boiler,12,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"C1200W",boiler,12,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"C1200W",boiler,12,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"C1200W",boiler,12,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"C1200W",boiler,12,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"C1200W",boiler,12,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"C1200W",boiler,12,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"C1200W",boiler,12,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"C1200W",boiler,12,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"C1200W",boiler,12,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"C1200W",boiler,12,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"C1200W",boiler,12,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"C1200W",boiler,12,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"C1200W",boiler,12,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"C1200W",boiler,12,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"C1200W",boiler,12,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"C1200W",boiler,12,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"C1200W",boiler,12,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"C1200W",boiler,12,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"C1200W",boiler,12,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"C1200W",boiler,12,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"C1200W",boiler,12,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"C1200W",boiler,12,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"C1200W",boiler,12,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"C1200W",boiler,12,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"C1200W",boiler,12,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"C1200W",boiler,12,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"C1200W",boiler,12,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"C1200W",boiler,12,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"C1200W",boiler,12,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"C1200W",boiler,12,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"C1200W",boiler,12,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"C1200W",boiler,12,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"C1200W",boiler,12,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"C1200W",boiler,12,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"C1200W",boiler,12,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"C1200W",boiler,12,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"CS5800iG",boiler,16,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"CS5800iG",boiler,16,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"CS5800iG",boiler,16,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"CS5800iG",boiler,16,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"CS5800iG",boiler,16,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"CS5800iG",boiler,16,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"CS5800iG",boiler,16,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"CS5800iG",boiler,16,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"CS5800iG",boiler,16,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"CS5800iG",boiler,16,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"CS5800iG",boiler,16,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"CS5800iG",boiler,16,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"CS5800iG",boiler,16,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"CS5800iG",boiler,16,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"CS5800iG",boiler,16,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"CS5800iG",boiler,16,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"CS5800iG",boiler,16,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"CS5800iG",boiler,16,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"CS5800iG",boiler,16,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"CS5800iG",boiler,16,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"CS5800iG",boiler,16,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"CS5800iG",boiler,16,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"CS5800iG",boiler,16,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"CS5800iG",boiler,16,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"CS5800iG",boiler,16,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"CS5800iG",boiler,16,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"CS5800iG",boiler,16,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"CS5800iG",boiler,16,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"CS5800iG",boiler,16,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"CS5800iG",boiler,16,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"CS5800iG",boiler,16,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"CS5800iG",boiler,16,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"CS5800iG",boiler,16,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"CS5800iG",boiler,16,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"CS5800iG",boiler,16,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"CS5800iG",boiler,16,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"CS5800iG",boiler,16,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"CS5800iG",boiler,16,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"CS5800iG",boiler,16,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"CS5800iG",boiler,16,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"CS5800iG",boiler,16,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"CS5800iG",boiler,16,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"CS5800iG",boiler,16,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"CS5800iG",boiler,16,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"CS5800iG",boiler,16,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"CS5800iG",boiler,16,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"CS5800iG",boiler,16,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"CS5800iG",boiler,16,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"CS5800iG",boiler,16,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"CS5800iG",boiler,16,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"CS5800iG",boiler,16,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"CS5800iG",boiler,16,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"CS5800iG",boiler,16,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"CS5800iG",boiler,16,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"CS5800iG",boiler,16,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"CS5800iG",boiler,16,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"CS5800iG",boiler,16,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"CS5800iG",boiler,16,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"CS5800iG",boiler,16,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"CS5800iG",boiler,16,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"CS5800iG",boiler,16,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"CS5800iG",boiler,16,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"CS5800iG",boiler,16,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"CS5800iG",boiler,16,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"CS5800iG",boiler,16,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"CS5800iG",boiler,16,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"CS5800iG",boiler,16,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"CS5800iG",boiler,16,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"CS5800iG",boiler,16,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"CS5800iG",boiler,16,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"CS5800iG",boiler,16,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"CS5800iG",boiler,16,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"CS5800iG",boiler,16,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"CS5800iG",boiler,16,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"CS5800iG",boiler,16,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"CS5800iG",boiler,16,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"CS5800iG",boiler,16,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"CS5800iG",boiler,16,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"CS5800iG",boiler,16,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"CS5800iG",boiler,16,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"CS5800iG",boiler,16,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"CS5800iG",boiler,16,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"CS5800iG",boiler,16,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"CS5800iG",boiler,16,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"CS5800iG",boiler,16,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"CS5800iG",boiler,16,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"CS5800iG",boiler,16,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"CS5800iG",boiler,16,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"CS5800iG",boiler,16,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"CS5800iG",boiler,16,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"CS5800iG",boiler,16,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"CS5800iG",boiler,16,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"CS5800iG",boiler,16,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"CS5800iG",boiler,16,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"CS5800iG",boiler,16,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"CS5800iG",boiler,16,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"CS5800iG",boiler,16,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"CS5800iG",boiler,16,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"CS5800iG",boiler,16,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"CS5800iG",boiler,16,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"CS5800iG",boiler,16,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"CS5800iG",boiler,16,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"CS5800iG",boiler,16,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"CS5800iG",boiler,16,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"CS5800iG",boiler,16,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"CS5800iG",boiler,16,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"CS5800iG",boiler,16,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"CS5800iG",boiler,16,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"CS5800iG",boiler,16,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"CS5800iG",boiler,16,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"CS5800iG",boiler,16,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"CS5800iG",boiler,16,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"CS5800iG",boiler,16,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"CS5800iG",boiler,16,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"CS5800iG",boiler,16,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"CS5800iG",boiler,16,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"CS5800iG",boiler,16,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"BK13/BK15, Smartline, GB1*2",boiler,64,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"BK13/BK15, Smartline, GB1*2",boiler,64,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"BK13/BK15, Smartline, GB1*2",boiler,64,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"BK13/BK15, Smartline, GB1*2",boiler,64,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logano GB1*5, Logamatic MC10",boiler,72,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logano GB1*5, Logamatic MC10",boiler,72,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logano GB1*5, Logamatic MC10",boiler,72,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logano GB1*5, Logamatic MC10",boiler,72,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logano GB1*5, Logamatic MC10",boiler,72,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logano GB1*5, Logamatic MC10",boiler,72,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logano GB1*5, Logamatic MC10",boiler,72,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logano GB1*5, Logamatic MC10",boiler,72,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logano GB1*5, Logamatic MC10",boiler,72,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logano GB1*5, Logamatic MC10",boiler,72,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logano GB1*5, Logamatic MC10",boiler,72,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logano GB1*5, Logamatic MC10",boiler,72,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logano GB1*5, Logamatic MC10",boiler,72,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logano GB1*5, Logamatic MC10",boiler,72,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logano GB1*5, Logamatic MC10",boiler,72,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logano GB1*5, Logamatic MC10",boiler,72,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logano GB1*5, Logamatic MC10",boiler,72,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logano GB1*5, Logamatic MC10",boiler,72,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logano GB1*5, Logamatic MC10",boiler,72,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logano GB1*5, Logamatic MC10",boiler,72,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logano GB1*5, Logamatic MC10",boiler,72,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logano GB1*5, Logamatic MC10",boiler,72,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logano GB1*5, Logamatic MC10",boiler,72,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logano GB1*5, Logamatic MC10",boiler,72,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logano GB1*5, Logamatic MC10",boiler,72,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logano GB1*5, Logamatic MC10",boiler,72,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logano GB1*5, Logamatic MC10",boiler,72,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logano GB1*5, Logamatic MC10",boiler,72,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logano GB1*5, Logamatic MC10",boiler,72,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logano GB1*5, Logamatic MC10",boiler,72,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logano GB1*5, Logamatic MC10",boiler,72,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logano GB1*5, Logamatic MC10",boiler,72,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logano GB1*5, Logamatic MC10",boiler,72,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logano GB1*5, Logamatic MC10",boiler,72,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logano GB1*5, Logamatic MC10",boiler,72,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logano GB1*5, Logamatic MC10",boiler,72,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logano GB1*5, Logamatic MC10",boiler,72,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logano GB1*5, Logamatic MC10",boiler,72,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logano GB1*5, Logamatic MC10",boiler,72,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logano GB1*5, Logamatic MC10",boiler,72,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logano GB1*5, Logamatic MC10",boiler,72,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logano GB1*5, Logamatic MC10",boiler,72,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logano GB1*5, Logamatic MC10",boiler,72,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logano GB1*5, Logamatic MC10",boiler,72,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logano GB1*5, Logamatic MC10",boiler,72,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logano GB1*5, Logamatic MC10",boiler,72,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logano GB1*5, Logamatic MC10",boiler,72,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logano GB1*5, Logamatic MC10",boiler,72,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logano GB1*5, Logamatic MC10",boiler,72,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logano GB1*5, Logamatic MC10",boiler,72,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logano GB1*5, Logamatic MC10",boiler,72,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logano GB1*5, Logamatic MC10",boiler,72,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logano GB1*5, Logamatic MC10",boiler,72,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logano GB1*5, Logamatic MC10",boiler,72,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logano GB1*5, Logamatic MC10",boiler,72,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logano GB1*5, Logamatic MC10",boiler,72,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logano GB1*5, Logamatic MC10",boiler,72,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logano GB1*5, Logamatic MC10",boiler,72,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Cascade CM10",boiler,81,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Cascade CM10",boiler,81,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Cascade CM10",boiler,81,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Cascade CM10",boiler,81,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Cascade CM10",boiler,81,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Cascade CM10",boiler,81,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Cascade CM10",boiler,81,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Cascade CM10",boiler,81,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Cascade CM10",boiler,81,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Cascade CM10",boiler,81,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Cascade CM10",boiler,81,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Cascade CM10",boiler,81,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Cascade CM10",boiler,81,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Cascade CM10",boiler,81,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Cascade CM10",boiler,81,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Cascade CM10",boiler,81,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Cascade CM10",boiler,81,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Cascade CM10",boiler,81,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Cascade CM10",boiler,81,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Cascade CM10",boiler,81,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Cascade CM10",boiler,81,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Cascade CM10",boiler,81,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Cascade CM10",boiler,81,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Cascade CM10",boiler,81,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Cascade CM10",boiler,81,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Cascade CM10",boiler,81,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Cascade CM10",boiler,81,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Cascade CM10",boiler,81,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Cascade CM10",boiler,81,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Cascade CM10",boiler,81,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Cascade CM10",boiler,81,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Cascade CM10",boiler,81,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Cascade CM10",boiler,81,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Cascade CM10",boiler,81,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Cascade CM10",boiler,81,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Cascade CM10",boiler,81,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Cascade CM10",boiler,81,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Cascade CM10",boiler,81,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Cascade CM10",boiler,81,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Cascade CM10",boiler,81,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Cascade CM10",boiler,81,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Cascade CM10",boiler,81,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Cascade CM10",boiler,81,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Cascade CM10",boiler,81,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Cascade CM10",boiler,81,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Cascade CM10",boiler,81,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Cascade CM10",boiler,81,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Cascade CM10",boiler,81,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Cascade CM10",boiler,81,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Cascade CM10",boiler,81,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Cascade CM10",boiler,81,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Cascade CM10",boiler,81,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Cascade CM10",boiler,81,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Cascade CM10",boiler,81,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Cascade CM10",boiler,81,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Cascade CM10",boiler,81,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Cascade CM10",boiler,81,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Cascade CM10",boiler,81,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Cascade CM10",boiler,81,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Cascade CM10",boiler,81,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Cascade CM10",boiler,81,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Cascade CM10",boiler,81,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Cascade CM10",boiler,81,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Cascade CM10",boiler,81,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Cascade CM10",boiler,81,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Cascade CM10",boiler,81,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Cascade CM10",boiler,81,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Cascade CM10",boiler,81,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Cascade CM10",boiler,81,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Cascade CM10",boiler,81,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Cascade CM10",boiler,81,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Cascade CM10",boiler,81,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Cascade CM10",boiler,81,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Cascade CM10",boiler,81,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Cascade CM10",boiler,81,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Cascade CM10",boiler,81,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Cascade CM10",boiler,81,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Cascade CM10",boiler,81,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Cascade CM10",boiler,81,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Cascade CM10",boiler,81,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Cascade CM10",boiler,81,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Cascade CM10",boiler,81,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Cascade CM10",boiler,81,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Cascade CM10",boiler,81,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Cascade CM10",boiler,81,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Cascade CM10",boiler,81,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Cascade CM10",boiler,81,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Cascade CM10",boiler,81,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Cascade CM10",boiler,81,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Cascade CM10",boiler,81,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Cascade CM10",boiler,81,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Cascade CM10",boiler,81,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Cascade CM10",boiler,81,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Cascade CM10",boiler,81,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Cascade CM10",boiler,81,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Cascade CM10",boiler,81,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Cascade CM10",boiler,81,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Cascade CM10",boiler,81,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Cascade CM10",boiler,81,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Cascade CM10",boiler,81,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Cascade CM10",boiler,81,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Cascade CM10",boiler,81,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Cascade CM10",boiler,81,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Cascade CM10",boiler,81,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Cascade CM10",boiler,81,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Cascade CM10",boiler,81,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Cascade CM10",boiler,81,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Cascade CM10",boiler,81,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Cascade CM10",boiler,81,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Cascade CM10",boiler,81,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Cascade CM10",boiler,81,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Cascade CM10",boiler,81,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Cascade CM10",boiler,81,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Cascade CM10",boiler,81,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Cascade CM10",boiler,81,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Cascade CM10",boiler,81,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Cascade CM10",boiler,81,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logamax Plus GB022",boiler,84,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logamax Plus GB022",boiler,84,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logamax Plus GB022",boiler,84,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logamax Plus GB022",boiler,84,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logamax Plus GB022",boiler,84,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logamax Plus GB022",boiler,84,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logamax Plus GB022",boiler,84,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logamax Plus GB022",boiler,84,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logamax Plus GB022",boiler,84,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logamax Plus GB022",boiler,84,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logamax Plus GB022",boiler,84,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logamax Plus GB022",boiler,84,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logamax Plus GB022",boiler,84,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logamax Plus GB022",boiler,84,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logamax Plus GB022",boiler,84,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logamax Plus GB022",boiler,84,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logamax Plus GB022",boiler,84,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logamax Plus GB022",boiler,84,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logamax Plus GB022",boiler,84,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logamax Plus GB022",boiler,84,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logamax Plus GB022",boiler,84,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logamax Plus GB022",boiler,84,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logamax Plus GB022",boiler,84,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logamax Plus GB022",boiler,84,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logamax Plus GB022",boiler,84,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logamax Plus GB022",boiler,84,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logamax Plus GB022",boiler,84,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logamax Plus GB022",boiler,84,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logamax Plus GB022",boiler,84,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logamax Plus GB022",boiler,84,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logamax Plus GB022",boiler,84,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logamax Plus GB022",boiler,84,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logamax Plus GB022",boiler,84,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logamax Plus GB022",boiler,84,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logamax Plus GB022",boiler,84,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logamax Plus GB022",boiler,84,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logamax Plus GB022",boiler,84,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logamax Plus GB022",boiler,84,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logamax Plus GB022",boiler,84,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logamax Plus GB022",boiler,84,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logamax Plus GB022",boiler,84,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logamax Plus GB022",boiler,84,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logamax Plus GB022",boiler,84,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logamax Plus GB022",boiler,84,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logamax Plus GB022",boiler,84,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logamax Plus GB022",boiler,84,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logamax Plus GB022",boiler,84,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logamax Plus GB022",boiler,84,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logamax Plus GB022",boiler,84,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logamax Plus GB022",boiler,84,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logamax Plus GB022",boiler,84,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logamax Plus GB022",boiler,84,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logamax Plus GB022",boiler,84,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logamax Plus GB022",boiler,84,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logamax Plus GB022",boiler,84,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logamax Plus GB022",boiler,84,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logamax Plus GB022",boiler,84,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logamax Plus GB022",boiler,84,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logamax Plus GB022",boiler,84,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logamax Plus GB022",boiler,84,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logamax Plus GB022",boiler,84,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logamax Plus GB022",boiler,84,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logamax Plus GB022",boiler,84,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logamax Plus GB022",boiler,84,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logamax Plus GB022",boiler,84,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logamax Plus GB022",boiler,84,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logamax Plus GB022",boiler,84,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logamax Plus GB022",boiler,84,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logamax Plus GB022",boiler,84,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logamax Plus GB022",boiler,84,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logamax Plus GB022",boiler,84,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logamax Plus GB022",boiler,84,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logamax Plus GB022",boiler,84,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logamax Plus GB022",boiler,84,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logamax Plus GB022",boiler,84,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logamax Plus GB022",boiler,84,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logamax Plus GB022",boiler,84,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logamax Plus GB022",boiler,84,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logamax Plus GB022",boiler,84,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logamax Plus GB022",boiler,84,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logamax Plus GB022",boiler,84,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logamax Plus GB022",boiler,84,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logamax Plus GB022",boiler,84,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logamax Plus GB022",boiler,84,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logamax Plus GB022",boiler,84,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logamax Plus GB022",boiler,84,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logamax Plus GB022",boiler,84,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logamax Plus GB022",boiler,84,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logamax Plus GB022",boiler,84,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logamax Plus GB022",boiler,84,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logamax Plus GB022",boiler,84,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logamax Plus GB022",boiler,84,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logamax Plus GB022",boiler,84,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logamax Plus GB022",boiler,84,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logamax Plus GB022",boiler,84,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logamax Plus GB022",boiler,84,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logamax Plus GB022",boiler,84,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logamax Plus GB022",boiler,84,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logamax Plus GB022",boiler,84,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logamax Plus GB022",boiler,84,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logamax Plus GB022",boiler,84,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logamax Plus GB022",boiler,84,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logamax Plus GB022",boiler,84,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logamax Plus GB022",boiler,84,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logamax Plus GB022",boiler,84,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logamax Plus GB022",boiler,84,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logamax Plus GB022",boiler,84,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logamax Plus GB022",boiler,84,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logamax Plus GB022",boiler,84,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logamax Plus GB022",boiler,84,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logamax Plus GB022",boiler,84,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logamax Plus GB022",boiler,84,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logamax Plus GB022",boiler,84,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logamax Plus GB022",boiler,84,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logamax Plus GB022",boiler,84,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logamax Plus GB022",boiler,84,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logamax Plus GB022",boiler,84,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpmode,boiler pump mode,enum [pumpstep\|const.high\|const.medium\|const.low\|prop.high\|propo.low], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Condens, Logamax/Logomatic, Cerapur Top, Greenstar, Generic HT3",boiler,95,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Topline, GB162",boiler,115,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Topline, GB162",boiler,115,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Topline, GB162",boiler,115,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Topline, GB162",boiler,115,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Topline, GB162",boiler,115,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Topline, GB162",boiler,115,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Topline, GB162",boiler,115,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Topline, GB162",boiler,115,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Topline, GB162",boiler,115,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Topline, GB162",boiler,115,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Topline, GB162",boiler,115,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Topline, GB162",boiler,115,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Topline, GB162",boiler,115,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Topline, GB162",boiler,115,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Topline, GB162",boiler,115,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Topline, GB162",boiler,115,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Topline, GB162",boiler,115,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Topline, GB162",boiler,115,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Topline, GB162",boiler,115,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Topline, GB162",boiler,115,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Topline, GB162",boiler,115,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Topline, GB162",boiler,115,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Topline, GB162",boiler,115,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Topline, GB162",boiler,115,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Topline, GB162",boiler,115,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Topline, GB162",boiler,115,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Topline, GB162",boiler,115,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Topline, GB162",boiler,115,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Topline, GB162",boiler,115,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Topline, GB162",boiler,115,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Topline, GB162",boiler,115,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Topline, GB162",boiler,115,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Topline, GB162",boiler,115,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Topline, GB162",boiler,115,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Topline, GB162",boiler,115,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Topline, GB162",boiler,115,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Topline, GB162",boiler,115,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Topline, GB162",boiler,115,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Topline, GB162",boiler,115,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Topline, GB162",boiler,115,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Topline, GB162",boiler,115,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Topline, GB162",boiler,115,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Topline, GB162",boiler,115,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Topline, GB162",boiler,115,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Topline, GB162",boiler,115,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Topline, GB162",boiler,115,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Topline, GB162",boiler,115,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Topline, GB162",boiler,115,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Topline, GB162",boiler,115,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Topline, GB162",boiler,115,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Topline, GB162",boiler,115,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Topline, GB162",boiler,115,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Topline, GB162",boiler,115,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Topline, GB162",boiler,115,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Topline, GB162",boiler,115,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Topline, GB162",boiler,115,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Topline, GB162",boiler,115,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Topline, GB162",boiler,115,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Topline, GB162",boiler,115,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Topline, GB162",boiler,115,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Topline, GB162",boiler,115,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Topline, GB162",boiler,115,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Topline, GB162",boiler,115,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Topline, GB162",boiler,115,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Topline, GB162",boiler,115,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Topline, GB162",boiler,115,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Topline, GB162",boiler,115,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Topline, GB162",boiler,115,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Topline, GB162",boiler,115,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Topline, GB162",boiler,115,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Topline, GB162",boiler,115,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Topline, GB162",boiler,115,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Topline, GB162",boiler,115,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Topline, GB162",boiler,115,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Topline, GB162",boiler,115,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Topline, GB162",boiler,115,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Topline, GB162",boiler,115,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Topline, GB162",boiler,115,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Topline, GB162",boiler,115,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Topline, GB162",boiler,115,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Topline, GB162",boiler,115,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Topline, GB162",boiler,115,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Topline, GB162",boiler,115,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Topline, GB162",boiler,115,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Topline, GB162",boiler,115,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Topline, GB162",boiler,115,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Topline, GB162",boiler,115,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Topline, GB162",boiler,115,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Topline, GB162",boiler,115,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Topline, GB162",boiler,115,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Topline, GB162",boiler,115,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Topline, GB162",boiler,115,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Topline, GB162",boiler,115,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Topline, GB162",boiler,115,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Topline, GB162",boiler,115,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Topline, GB162",boiler,115,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Topline, GB162",boiler,115,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Topline, GB162",boiler,115,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Topline, GB162",boiler,115,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Topline, GB162",boiler,115,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Topline, GB162",boiler,115,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Topline, GB162",boiler,115,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Topline, GB162",boiler,115,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Topline, GB162",boiler,115,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Topline, GB162",boiler,115,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Topline, GB162",boiler,115,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Topline, GB162",boiler,115,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Topline, GB162",boiler,115,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Topline, GB162",boiler,115,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Topline, GB162",boiler,115,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Topline, GB162",boiler,115,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Topline, GB162",boiler,115,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Topline, GB162",boiler,115,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Topline, GB162",boiler,115,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Topline, GB162",boiler,115,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Topline, GB162",boiler,115,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Topline, GB162",boiler,115,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Cascade MCM10",boiler,121,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Cascade MCM10",boiler,121,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Cascade MCM10",boiler,121,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Cascade MCM10",boiler,121,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Cascade MCM10",boiler,121,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Cascade MCM10",boiler,121,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Cascade MCM10",boiler,121,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Cascade MCM10",boiler,121,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Cascade MCM10",boiler,121,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Cascade MCM10",boiler,121,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Cascade MCM10",boiler,121,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Cascade MCM10",boiler,121,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Cascade MCM10",boiler,121,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Cascade MCM10",boiler,121,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Cascade MCM10",boiler,121,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Cascade MCM10",boiler,121,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Cascade MCM10",boiler,121,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Cascade MCM10",boiler,121,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Cascade MCM10",boiler,121,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Cascade MCM10",boiler,121,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Cascade MCM10",boiler,121,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Cascade MCM10",boiler,121,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Cascade MCM10",boiler,121,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Cascade MCM10",boiler,121,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Cascade MCM10",boiler,121,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Cascade MCM10",boiler,121,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Cascade MCM10",boiler,121,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Cascade MCM10",boiler,121,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Cascade MCM10",boiler,121,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Cascade MCM10",boiler,121,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Cascade MCM10",boiler,121,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Cascade MCM10",boiler,121,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Cascade MCM10",boiler,121,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Cascade MCM10",boiler,121,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Cascade MCM10",boiler,121,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Cascade MCM10",boiler,121,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Cascade MCM10",boiler,121,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Cascade MCM10",boiler,121,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Cascade MCM10",boiler,121,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Cascade MCM10",boiler,121,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Cascade MCM10",boiler,121,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Cascade MCM10",boiler,121,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Cascade MCM10",boiler,121,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Cascade MCM10",boiler,121,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Cascade MCM10",boiler,121,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Cascade MCM10",boiler,121,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Cascade MCM10",boiler,121,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Cascade MCM10",boiler,121,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Cascade MCM10",boiler,121,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Cascade MCM10",boiler,121,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Cascade MCM10",boiler,121,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Cascade MCM10",boiler,121,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Cascade MCM10",boiler,121,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Cascade MCM10",boiler,121,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Cascade MCM10",boiler,121,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Cascade MCM10",boiler,121,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Cascade MCM10",boiler,121,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Cascade MCM10",boiler,121,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Cascade MCM10",boiler,121,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Cascade MCM10",boiler,121,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Cascade MCM10",boiler,121,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Cascade MCM10",boiler,121,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Cascade MCM10",boiler,121,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Cascade MCM10",boiler,121,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Cascade MCM10",boiler,121,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Cascade MCM10",boiler,121,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Cascade MCM10",boiler,121,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Cascade MCM10",boiler,121,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Cascade MCM10",boiler,121,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Cascade MCM10",boiler,121,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Cascade MCM10",boiler,121,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Cascade MCM10",boiler,121,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Cascade MCM10",boiler,121,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Cascade MCM10",boiler,121,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Cascade MCM10",boiler,121,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Cascade MCM10",boiler,121,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Cascade MCM10",boiler,121,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Cascade MCM10",boiler,121,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Cascade MCM10",boiler,121,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Cascade MCM10",boiler,121,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Cascade MCM10",boiler,121,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Cascade MCM10",boiler,121,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Cascade MCM10",boiler,121,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Cascade MCM10",boiler,121,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Cascade MCM10",boiler,121,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Cascade MCM10",boiler,121,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Cascade MCM10",boiler,121,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Cascade MCM10",boiler,121,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Cascade MCM10",boiler,121,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Cascade MCM10",boiler,121,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Cascade MCM10",boiler,121,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Cascade MCM10",boiler,121,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Cascade MCM10",boiler,121,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Cascade MCM10",boiler,121,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Cascade MCM10",boiler,121,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Cascade MCM10",boiler,121,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Cascade MCM10",boiler,121,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Cascade MCM10",boiler,121,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Cascade MCM10",boiler,121,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Cascade MCM10",boiler,121,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Cascade MCM10",boiler,121,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Cascade MCM10",boiler,121,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Cascade MCM10",boiler,121,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Cascade MCM10",boiler,121,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Cascade MCM10",boiler,121,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Cascade MCM10",boiler,121,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Cascade MCM10",boiler,121,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Cascade MCM10",boiler,121,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Cascade MCM10",boiler,121,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Cascade MCM10",boiler,121,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Cascade MCM10",boiler,121,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Cascade MCM10",boiler,121,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Cascade MCM10",boiler,121,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Cascade MCM10",boiler,121,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Cascade MCM10",boiler,121,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Cascade MCM10",boiler,121,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Cascade MCM10",boiler,121,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Proline",boiler,122,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Proline",boiler,122,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Proline",boiler,122,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Proline",boiler,122,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Proline",boiler,122,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Proline",boiler,122,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Proline",boiler,122,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Proline",boiler,122,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Proline",boiler,122,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Proline",boiler,122,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Proline",boiler,122,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Proline",boiler,122,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Proline",boiler,122,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Proline",boiler,122,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Proline",boiler,122,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Proline",boiler,122,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Proline",boiler,122,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Proline",boiler,122,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Proline",boiler,122,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Proline",boiler,122,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Proline",boiler,122,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Proline",boiler,122,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Proline",boiler,122,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Proline",boiler,122,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Proline",boiler,122,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Proline",boiler,122,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Proline",boiler,122,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Proline",boiler,122,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Proline",boiler,122,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Proline",boiler,122,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Proline",boiler,122,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Proline",boiler,122,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Proline",boiler,122,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Proline",boiler,122,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Proline",boiler,122,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Proline",boiler,122,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Proline",boiler,122,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Proline",boiler,122,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Proline",boiler,122,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Proline",boiler,122,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Proline",boiler,122,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Proline",boiler,122,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Proline",boiler,122,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Proline",boiler,122,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Proline",boiler,122,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Proline",boiler,122,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Proline",boiler,122,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Proline",boiler,122,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Proline",boiler,122,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Proline",boiler,122,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Proline",boiler,122,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Proline",boiler,122,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Proline",boiler,122,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Proline",boiler,122,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Proline",boiler,122,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Proline",boiler,122,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Proline",boiler,122,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Proline",boiler,122,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Proline",boiler,122,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Proline",boiler,122,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Proline",boiler,122,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Proline",boiler,122,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Proline",boiler,122,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Proline",boiler,122,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Proline",boiler,122,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Proline",boiler,122,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Proline",boiler,122,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Proline",boiler,122,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Proline",boiler,122,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Proline",boiler,122,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Proline",boiler,122,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Proline",boiler,122,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Proline",boiler,122,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Proline",boiler,122,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Proline",boiler,122,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Proline",boiler,122,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Proline",boiler,122,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Proline",boiler,122,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Proline",boiler,122,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Proline",boiler,122,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Proline",boiler,122,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Proline",boiler,122,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Proline",boiler,122,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Proline",boiler,122,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Proline",boiler,122,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Proline",boiler,122,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Proline",boiler,122,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Proline",boiler,122,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Proline",boiler,122,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Proline",boiler,122,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Proline",boiler,122,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Proline",boiler,122,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Proline",boiler,122,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Proline",boiler,122,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Proline",boiler,122,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Proline",boiler,122,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Proline",boiler,122,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Proline",boiler,122,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Proline",boiler,122,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Proline",boiler,122,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Proline",boiler,122,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Proline",boiler,122,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Proline",boiler,122,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Proline",boiler,122,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Proline",boiler,122,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Proline",boiler,122,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Proline",boiler,122,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Proline",boiler,122,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Proline",boiler,122,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Proline",boiler,122,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Proline",boiler,122,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Proline",boiler,122,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Proline",boiler,122,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Proline",boiler,122,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Proline",boiler,122,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Proline",boiler,122,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Proline",boiler,122,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"GB*72, Trendline, Cerapur, Greenstar Si",boiler,123,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"GB212",boiler,131,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"GB212",boiler,131,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"GB212",boiler,131,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"GB212",boiler,131,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"GB212",boiler,131,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"GB212",boiler,131,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"GB212",boiler,131,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"GB212",boiler,131,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"GB212",boiler,131,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"GB212",boiler,131,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"GB212",boiler,131,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"GB212",boiler,131,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"GB212",boiler,131,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"GB212",boiler,131,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"GB212",boiler,131,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"GB212",boiler,131,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"GB212",boiler,131,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"GB212",boiler,131,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"GB212",boiler,131,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"GB212",boiler,131,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"GB212",boiler,131,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"GB212",boiler,131,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"GB212",boiler,131,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"GB212",boiler,131,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"GB212",boiler,131,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"GB212",boiler,131,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"GB212",boiler,131,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"GB212",boiler,131,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"GB212",boiler,131,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"GB212",boiler,131,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"GB212",boiler,131,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"GB212",boiler,131,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"GB212",boiler,131,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"GB212",boiler,131,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"GB212",boiler,131,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"GB212",boiler,131,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"GB212",boiler,131,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"GB212",boiler,131,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"GB212",boiler,131,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"GB212",boiler,131,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"GB212",boiler,131,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"GB212",boiler,131,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"GB212",boiler,131,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"GB212",boiler,131,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"GB212",boiler,131,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"GB212",boiler,131,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"GB212",boiler,131,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"GB212",boiler,131,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"GB212",boiler,131,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"GB212",boiler,131,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"GB212",boiler,131,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"GB212",boiler,131,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"GB212",boiler,131,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"GB212",boiler,131,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"GB212",boiler,131,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"GB212",boiler,131,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"GB212",boiler,131,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"GB212",boiler,131,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"GB212",boiler,131,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"GB212",boiler,131,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"GB212",boiler,131,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"GB212",boiler,131,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"GB212",boiler,131,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"GB212",boiler,131,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"GB212",boiler,131,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"GB212",boiler,131,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"GB212",boiler,131,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"GB212",boiler,131,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"GB212",boiler,131,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"GB212",boiler,131,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"GB212",boiler,131,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"GB212",boiler,131,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"GB212",boiler,131,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"GB212",boiler,131,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"GB212",boiler,131,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"GB212",boiler,131,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"GB212",boiler,131,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"GB212",boiler,131,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"GB212",boiler,131,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"GB212",boiler,131,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"GB212",boiler,131,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"GB212",boiler,131,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"GB212",boiler,131,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"GB212",boiler,131,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"GB212",boiler,131,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"GB212",boiler,131,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"GB212",boiler,131,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"GB212",boiler,131,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"GB212",boiler,131,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"GB212",boiler,131,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"GB212",boiler,131,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"GB212",boiler,131,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"GB212",boiler,131,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"GB212",boiler,131,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"GB212",boiler,131,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"GB212",boiler,131,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"GB212",boiler,131,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"GB212",boiler,131,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"GB212",boiler,131,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"GB212",boiler,131,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"GB212",boiler,131,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"GB212",boiler,131,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"GB212",boiler,131,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"GB212",boiler,131,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"GB212",boiler,131,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"GB212",boiler,131,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"GB212",boiler,131,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"GB212",boiler,131,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"GB212",boiler,131,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"GB212",boiler,131,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"GB212",boiler,131,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"GB212",boiler,131,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"GB212",boiler,131,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"GB212",boiler,131,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"GB212",boiler,131,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"GB212",boiler,131,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"GB212",boiler,131,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"GC7000F",boiler,132,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"GC7000F",boiler,132,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"GC7000F",boiler,132,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"GC7000F",boiler,132,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"GC7000F",boiler,132,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"GC7000F",boiler,132,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"GC7000F",boiler,132,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"GC7000F",boiler,132,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"GC7000F",boiler,132,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"GC7000F",boiler,132,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"GC7000F",boiler,132,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"GC7000F",boiler,132,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"GC7000F",boiler,132,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"GC7000F",boiler,132,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"GC7000F",boiler,132,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"GC7000F",boiler,132,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"GC7000F",boiler,132,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"GC7000F",boiler,132,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"GC7000F",boiler,132,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"GC7000F",boiler,132,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"GC7000F",boiler,132,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"GC7000F",boiler,132,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"GC7000F",boiler,132,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"GC7000F",boiler,132,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"GC7000F",boiler,132,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"GC7000F",boiler,132,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"GC7000F",boiler,132,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"GC7000F",boiler,132,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"GC7000F",boiler,132,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"GC7000F",boiler,132,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"GC7000F",boiler,132,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"GC7000F",boiler,132,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"GC7000F",boiler,132,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"GC7000F",boiler,132,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"GC7000F",boiler,132,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"GC7000F",boiler,132,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"GC7000F",boiler,132,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"GC7000F",boiler,132,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"GC7000F",boiler,132,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"GC7000F",boiler,132,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"GC7000F",boiler,132,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"GC7000F",boiler,132,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"GC7000F",boiler,132,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"GC7000F",boiler,132,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"GC7000F",boiler,132,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"GC7000F",boiler,132,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"GC7000F",boiler,132,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"GC7000F",boiler,132,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"GC7000F",boiler,132,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"GC7000F",boiler,132,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"GC7000F",boiler,132,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"GC7000F",boiler,132,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"GC7000F",boiler,132,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"GC7000F",boiler,132,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"GC7000F",boiler,132,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"GC7000F",boiler,132,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"GC7000F",boiler,132,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"GC7000F",boiler,132,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"GC7000F",boiler,132,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"GC7000F",boiler,132,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"GC7000F",boiler,132,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"GC7000F",boiler,132,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"GC7000F",boiler,132,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"GC7000F",boiler,132,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"GC7000F",boiler,132,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"GC7000F",boiler,132,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"GC7000F",boiler,132,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"GC7000F",boiler,132,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"GC7000F",boiler,132,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"GC7000F",boiler,132,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"GC7000F",boiler,132,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"GC7000F",boiler,132,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"GC7000F",boiler,132,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"GC7000F",boiler,132,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"GC7000F",boiler,132,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"GC7000F",boiler,132,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"GC7000F",boiler,132,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"GC7000F",boiler,132,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"GC7000F",boiler,132,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"GC7000F",boiler,132,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"GC7000F",boiler,132,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"GC7000F",boiler,132,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"GC7000F",boiler,132,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"GC7000F",boiler,132,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"GC7000F",boiler,132,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"GC7000F",boiler,132,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"GC7000F",boiler,132,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"GC7000F",boiler,132,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"GC7000F",boiler,132,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"GC7000F",boiler,132,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"GC7000F",boiler,132,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"GC7000F",boiler,132,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"GC7000F",boiler,132,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"GC7000F",boiler,132,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"GC7000F",boiler,132,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"GC7000F",boiler,132,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"GC7000F",boiler,132,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"GC7000F",boiler,132,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"GC7000F",boiler,132,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"GC7000F",boiler,132,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"GC7000F",boiler,132,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"GC7000F",boiler,132,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"GC7000F",boiler,132,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"GC7000F",boiler,132,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"GC7000F",boiler,132,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"GC7000F",boiler,132,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"GC7000F",boiler,132,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"GC7000F",boiler,132,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"GC7000F",boiler,132,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"GC7000F",boiler,132,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"GC7000F",boiler,132,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"GC7000F",boiler,132,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"GC7000F",boiler,132,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"GC7000F",boiler,132,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"GC7000F",boiler,132,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"GC7000F",boiler,132,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"GC7000F",boiler,132,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logano GB125/KB195i, Logamatic MC110",boiler,133,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Greenstar 30Ri Compact",boiler,154,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Greenstar 30Ri Compact",boiler,154,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Greenstar 30Ri Compact",boiler,154,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Greenstar 30Ri Compact",boiler,154,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Greenstar 30Ri Compact",boiler,154,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Greenstar 30Ri Compact",boiler,154,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Greenstar 30Ri Compact",boiler,154,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Greenstar 30Ri Compact",boiler,154,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Greenstar 30Ri Compact",boiler,154,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Greenstar 30Ri Compact",boiler,154,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Greenstar 30Ri Compact",boiler,154,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Greenstar 30Ri Compact",boiler,154,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Greenstar 30Ri Compact",boiler,154,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Greenstar 30Ri Compact",boiler,154,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Greenstar 30Ri Compact",boiler,154,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Greenstar 30Ri Compact",boiler,154,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Greenstar 30Ri Compact",boiler,154,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Greenstar 30Ri Compact",boiler,154,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Greenstar 30Ri Compact",boiler,154,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Greenstar 30Ri Compact",boiler,154,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Greenstar 30Ri Compact",boiler,154,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Greenstar 30Ri Compact",boiler,154,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Greenstar 30Ri Compact",boiler,154,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Greenstar 30Ri Compact",boiler,154,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Greenstar 30Ri Compact",boiler,154,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Greenstar 30Ri Compact",boiler,154,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Greenstar 30Ri Compact",boiler,154,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Greenstar 30Ri Compact",boiler,154,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Greenstar 30Ri Compact",boiler,154,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Greenstar 30Ri Compact",boiler,154,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Greenstar 30Ri Compact",boiler,154,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Greenstar 30Ri Compact",boiler,154,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Greenstar 30Ri Compact",boiler,154,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Greenstar 30Ri Compact",boiler,154,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Greenstar 30Ri Compact",boiler,154,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Greenstar 30Ri Compact",boiler,154,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Greenstar 30Ri Compact",boiler,154,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Greenstar 30Ri Compact",boiler,154,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Greenstar 30Ri Compact",boiler,154,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Greenstar 30Ri Compact",boiler,154,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Greenstar 30Ri Compact",boiler,154,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Greenstar 30Ri Compact",boiler,154,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Greenstar 30Ri Compact",boiler,154,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Greenstar 30Ri Compact",boiler,154,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Greenstar 30Ri Compact",boiler,154,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Greenstar 30Ri Compact",boiler,154,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Greenstar 30Ri Compact",boiler,154,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Greenstar 30Ri Compact",boiler,154,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Greenstar 30Ri Compact",boiler,154,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Greenstar 30Ri Compact",boiler,154,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Greenstar 30Ri Compact",boiler,154,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Greenstar 30Ri Compact",boiler,154,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Greenstar 30Ri Compact",boiler,154,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Greenstar 30Ri Compact",boiler,154,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Greenstar 30Ri Compact",boiler,154,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Greenstar 30Ri Compact",boiler,154,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Greenstar 30Ri Compact",boiler,154,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Greenstar 30Ri Compact",boiler,154,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Greenstar 30Ri Compact",boiler,154,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Greenstar 30Ri Compact",boiler,154,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Greenstar 30Ri Compact",boiler,154,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Greenstar 30Ri Compact",boiler,154,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Greenstar 30Ri Compact",boiler,154,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Greenstar 30Ri Compact",boiler,154,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Greenstar 30Ri Compact",boiler,154,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Greenstar 30Ri Compact",boiler,154,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Greenstar 30Ri Compact",boiler,154,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Greenstar 30Ri Compact",boiler,154,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Greenstar 30Ri Compact",boiler,154,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Greenstar 30Ri Compact",boiler,154,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Greenstar 30Ri Compact",boiler,154,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Greenstar 30Ri Compact",boiler,154,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Greenstar 30Ri Compact",boiler,154,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Greenstar 30Ri Compact",boiler,154,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Greenstar 30Ri Compact",boiler,154,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Greenstar 30Ri Compact",boiler,154,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Greenstar 30Ri Compact",boiler,154,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Greenstar 30Ri Compact",boiler,154,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Greenstar 30Ri Compact",boiler,154,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Greenstar 30Ri Compact",boiler,154,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Greenstar 30Ri Compact",boiler,154,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Greenstar 30Ri Compact",boiler,154,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Greenstar 30Ri Compact",boiler,154,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Greenstar 30Ri Compact",boiler,154,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Greenstar 30Ri Compact",boiler,154,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Greenstar 30Ri Compact",boiler,154,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Greenstar 30Ri Compact",boiler,154,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Greenstar 30Ri Compact",boiler,154,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Greenstar 30Ri Compact",boiler,154,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Greenstar 30Ri Compact",boiler,154,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Greenstar 30Ri Compact",boiler,154,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Greenstar 30Ri Compact",boiler,154,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Greenstar 30Ri Compact",boiler,154,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Greenstar 30Ri Compact",boiler,154,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Greenstar 30Ri Compact",boiler,154,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Greenstar 30Ri Compact",boiler,154,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Greenstar 30Ri Compact",boiler,154,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Greenstar 30Ri Compact",boiler,154,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Greenstar 30Ri Compact",boiler,154,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Greenstar 30Ri Compact",boiler,154,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Greenstar 30Ri Compact",boiler,154,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Greenstar 30Ri Compact",boiler,154,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Greenstar 30Ri Compact",boiler,154,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Greenstar 30Ri Compact",boiler,154,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Greenstar 30Ri Compact",boiler,154,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Greenstar 30Ri Compact",boiler,154,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Greenstar 30Ri Compact",boiler,154,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Greenstar 30Ri Compact",boiler,154,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Greenstar 30Ri Compact",boiler,154,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Greenstar 30Ri Compact",boiler,154,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Greenstar 30Ri Compact",boiler,154,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Greenstar 30Ri Compact",boiler,154,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Greenstar 30Ri Compact",boiler,154,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Greenstar 30Ri Compact",boiler,154,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Greenstar 30Ri Compact",boiler,154,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Greenstar 30Ri Compact",boiler,154,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Greenstar 30Ri Compact",boiler,154,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Suprapur-o",boiler,155,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Suprapur-o",boiler,155,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Suprapur-o",boiler,155,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Suprapur-o",boiler,155,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Suprapur-o",boiler,155,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Suprapur-o",boiler,155,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Suprapur-o",boiler,155,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Suprapur-o",boiler,155,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Suprapur-o",boiler,155,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Suprapur-o",boiler,155,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Suprapur-o",boiler,155,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Suprapur-o",boiler,155,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Suprapur-o",boiler,155,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Suprapur-o",boiler,155,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Suprapur-o",boiler,155,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Suprapur-o",boiler,155,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Suprapur-o",boiler,155,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Suprapur-o",boiler,155,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Suprapur-o",boiler,155,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Suprapur-o",boiler,155,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Suprapur-o",boiler,155,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Suprapur-o",boiler,155,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Suprapur-o",boiler,155,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Suprapur-o",boiler,155,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Suprapur-o",boiler,155,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Suprapur-o",boiler,155,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Suprapur-o",boiler,155,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Suprapur-o",boiler,155,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Suprapur-o",boiler,155,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Suprapur-o",boiler,155,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Suprapur-o",boiler,155,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Suprapur-o",boiler,155,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Suprapur-o",boiler,155,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Suprapur-o",boiler,155,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Suprapur-o",boiler,155,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Suprapur-o",boiler,155,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Suprapur-o",boiler,155,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Suprapur-o",boiler,155,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Suprapur-o",boiler,155,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Suprapur-o",boiler,155,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Suprapur-o",boiler,155,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Suprapur-o",boiler,155,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Suprapur-o",boiler,155,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Suprapur-o",boiler,155,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Suprapur-o",boiler,155,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Suprapur-o",boiler,155,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Suprapur-o",boiler,155,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Suprapur-o",boiler,155,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Suprapur-o",boiler,155,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Suprapur-o",boiler,155,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Suprapur-o",boiler,155,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Suprapur-o",boiler,155,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Suprapur-o",boiler,155,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Suprapur-o",boiler,155,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Suprapur-o",boiler,155,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Suprapur-o",boiler,155,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Suprapur-o",boiler,155,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Suprapur-o",boiler,155,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Suprapur-o",boiler,155,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Suprapur-o",boiler,155,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Suprapur-o",boiler,155,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Suprapur-o",boiler,155,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Suprapur-o",boiler,155,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Suprapur-o",boiler,155,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Suprapur-o",boiler,155,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Suprapur-o",boiler,155,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Suprapur-o",boiler,155,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Suprapur-o",boiler,155,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Suprapur-o",boiler,155,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Suprapur-o",boiler,155,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Suprapur-o",boiler,155,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Suprapur-o",boiler,155,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Suprapur-o",boiler,155,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Suprapur-o",boiler,155,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Suprapur-o",boiler,155,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Suprapur-o",boiler,155,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Suprapur-o",boiler,155,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Suprapur-o",boiler,155,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Suprapur-o",boiler,155,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Suprapur-o",boiler,155,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Suprapur-o",boiler,155,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Suprapur-o",boiler,155,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Suprapur-o",boiler,155,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Suprapur-o",boiler,155,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Suprapur-o",boiler,155,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Suprapur-o",boiler,155,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Suprapur-o",boiler,155,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Suprapur-o",boiler,155,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Suprapur-o",boiler,155,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Suprapur-o",boiler,155,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Suprapur-o",boiler,155,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Suprapur-o",boiler,155,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Suprapur-o",boiler,155,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Suprapur-o",boiler,155,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Suprapur-o",boiler,155,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Suprapur-o",boiler,155,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Suprapur-o",boiler,155,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Suprapur-o",boiler,155,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Suprapur-o",boiler,155,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Suprapur-o",boiler,155,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Suprapur-o",boiler,155,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Suprapur-o",boiler,155,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Suprapur-o",boiler,155,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Suprapur-o",boiler,155,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Suprapur-o",boiler,155,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Suprapur-o",boiler,155,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Suprapur-o",boiler,155,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Suprapur-o",boiler,155,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Suprapur-o",boiler,155,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Suprapur-o",boiler,155,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Suprapur-o",boiler,155,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Suprapur-o",boiler,155,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Suprapur-o",boiler,155,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Suprapur-o",boiler,155,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Suprapur-o",boiler,155,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Suprapur-o",boiler,155,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Suprapur-o",boiler,155,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Cerapur Aero",boiler,167,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Cerapur Aero",boiler,167,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Cerapur Aero",boiler,167,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Cerapur Aero",boiler,167,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Cerapur Aero",boiler,167,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Cerapur Aero",boiler,167,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Cerapur Aero",boiler,167,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Cerapur Aero",boiler,167,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Cerapur Aero",boiler,167,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Cerapur Aero",boiler,167,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Cerapur Aero",boiler,167,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Cerapur Aero",boiler,167,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Cerapur Aero",boiler,167,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Cerapur Aero",boiler,167,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Cerapur Aero",boiler,167,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Cerapur Aero",boiler,167,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Cerapur Aero",boiler,167,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Cerapur Aero",boiler,167,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Cerapur Aero",boiler,167,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Cerapur Aero",boiler,167,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Cerapur Aero",boiler,167,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Cerapur Aero",boiler,167,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Cerapur Aero",boiler,167,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Cerapur Aero",boiler,167,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Cerapur Aero",boiler,167,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Cerapur Aero",boiler,167,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Cerapur Aero",boiler,167,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Cerapur Aero",boiler,167,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Cerapur Aero",boiler,167,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Cerapur Aero",boiler,167,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Cerapur Aero",boiler,167,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Cerapur Aero",boiler,167,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Cerapur Aero",boiler,167,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Cerapur Aero",boiler,167,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Cerapur Aero",boiler,167,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Cerapur Aero",boiler,167,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Cerapur Aero",boiler,167,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Cerapur Aero",boiler,167,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Cerapur Aero",boiler,167,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Cerapur Aero",boiler,167,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Cerapur Aero",boiler,167,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Cerapur Aero",boiler,167,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Cerapur Aero",boiler,167,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Cerapur Aero",boiler,167,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Cerapur Aero",boiler,167,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Cerapur Aero",boiler,167,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Cerapur Aero",boiler,167,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Cerapur Aero",boiler,167,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Cerapur Aero",boiler,167,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Cerapur Aero",boiler,167,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Cerapur Aero",boiler,167,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Cerapur Aero",boiler,167,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Cerapur Aero",boiler,167,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Cerapur Aero",boiler,167,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Cerapur Aero",boiler,167,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Cerapur Aero",boiler,167,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Cerapur Aero",boiler,167,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Cerapur Aero",boiler,167,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Cerapur Aero",boiler,167,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Cerapur Aero",boiler,167,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Cerapur Aero",boiler,167,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Cerapur Aero",boiler,167,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Cerapur Aero",boiler,167,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Cerapur Aero",boiler,167,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Cerapur Aero",boiler,167,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Cerapur Aero",boiler,167,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Cerapur Aero",boiler,167,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Cerapur Aero",boiler,167,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Cerapur Aero",boiler,167,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Cerapur Aero",boiler,167,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Cerapur Aero",boiler,167,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Cerapur Aero",boiler,167,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Cerapur Aero",boiler,167,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Cerapur Aero",boiler,167,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Cerapur Aero",boiler,167,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Cerapur Aero",boiler,167,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Cerapur Aero",boiler,167,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Cerapur Aero",boiler,167,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Cerapur Aero",boiler,167,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Cerapur Aero",boiler,167,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Cerapur Aero",boiler,167,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Cerapur Aero",boiler,167,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Cerapur Aero",boiler,167,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Cerapur Aero",boiler,167,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Cerapur Aero",boiler,167,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Cerapur Aero",boiler,167,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Cerapur Aero",boiler,167,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Cerapur Aero",boiler,167,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Cerapur Aero",boiler,167,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Cerapur Aero",boiler,167,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Cerapur Aero",boiler,167,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Cerapur Aero",boiler,167,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Cerapur Aero",boiler,167,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Cerapur Aero",boiler,167,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Cerapur Aero",boiler,167,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Cerapur Aero",boiler,167,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Cerapur Aero",boiler,167,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Cerapur Aero",boiler,167,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Cerapur Aero",boiler,167,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Cerapur Aero",boiler,167,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Cerapur Aero",boiler,167,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Cerapur Aero",boiler,167,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Cerapur Aero",boiler,167,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Cerapur Aero",boiler,167,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Cerapur Aero",boiler,167,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Cerapur Aero",boiler,167,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Cerapur Aero",boiler,167,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Cerapur Aero",boiler,167,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Cerapur Aero",boiler,167,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Cerapur Aero",boiler,167,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Cerapur Aero",boiler,167,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Cerapur Aero",boiler,167,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Cerapur Aero",boiler,167,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Cerapur Aero",boiler,167,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Cerapur Aero",boiler,167,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Cerapur Aero",boiler,167,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Cerapur Aero",boiler,167,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Hybrid Heatpump",boiler,168,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Hybrid Heatpump",boiler,168,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Hybrid Heatpump",boiler,168,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Hybrid Heatpump",boiler,168,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Hybrid Heatpump",boiler,168,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Hybrid Heatpump",boiler,168,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Hybrid Heatpump",boiler,168,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Hybrid Heatpump",boiler,168,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Hybrid Heatpump",boiler,168,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Hybrid Heatpump",boiler,168,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Hybrid Heatpump",boiler,168,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Hybrid Heatpump",boiler,168,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Hybrid Heatpump",boiler,168,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Hybrid Heatpump",boiler,168,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Hybrid Heatpump",boiler,168,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Hybrid Heatpump",boiler,168,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Hybrid Heatpump",boiler,168,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Hybrid Heatpump",boiler,168,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Hybrid Heatpump",boiler,168,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Hybrid Heatpump",boiler,168,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Hybrid Heatpump",boiler,168,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Hybrid Heatpump",boiler,168,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Hybrid Heatpump",boiler,168,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Hybrid Heatpump",boiler,168,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Hybrid Heatpump",boiler,168,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Hybrid Heatpump",boiler,168,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Hybrid Heatpump",boiler,168,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Hybrid Heatpump",boiler,168,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Hybrid Heatpump",boiler,168,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Hybrid Heatpump",boiler,168,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Hybrid Heatpump",boiler,168,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Hybrid Heatpump",boiler,168,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Hybrid Heatpump",boiler,168,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Hybrid Heatpump",boiler,168,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Hybrid Heatpump",boiler,168,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Hybrid Heatpump",boiler,168,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Hybrid Heatpump",boiler,168,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Hybrid Heatpump",boiler,168,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Hybrid Heatpump",boiler,168,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Hybrid Heatpump",boiler,168,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Hybrid Heatpump",boiler,168,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Hybrid Heatpump",boiler,168,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Hybrid Heatpump",boiler,168,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Hybrid Heatpump",boiler,168,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Hybrid Heatpump",boiler,168,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Hybrid Heatpump",boiler,168,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Hybrid Heatpump",boiler,168,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Hybrid Heatpump",boiler,168,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Hybrid Heatpump",boiler,168,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Hybrid Heatpump",boiler,168,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Hybrid Heatpump",boiler,168,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Hybrid Heatpump",boiler,168,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Hybrid Heatpump",boiler,168,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Hybrid Heatpump",boiler,168,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Hybrid Heatpump",boiler,168,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Hybrid Heatpump",boiler,168,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Hybrid Heatpump",boiler,168,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Hybrid Heatpump",boiler,168,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Hybrid Heatpump",boiler,168,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Hybrid Heatpump",boiler,168,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Hybrid Heatpump",boiler,168,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Hybrid Heatpump",boiler,168,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Hybrid Heatpump",boiler,168,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Hybrid Heatpump",boiler,168,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Hybrid Heatpump",boiler,168,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Hybrid Heatpump",boiler,168,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Hybrid Heatpump",boiler,168,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Hybrid Heatpump",boiler,168,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Hybrid Heatpump",boiler,168,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Hybrid Heatpump",boiler,168,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Hybrid Heatpump",boiler,168,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Hybrid Heatpump",boiler,168,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Hybrid Heatpump",boiler,168,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Hybrid Heatpump",boiler,168,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Hybrid Heatpump",boiler,168,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Hybrid Heatpump",boiler,168,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Hybrid Heatpump",boiler,168,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Hybrid Heatpump",boiler,168,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Hybrid Heatpump",boiler,168,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Hybrid Heatpump",boiler,168,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Hybrid Heatpump",boiler,168,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Hybrid Heatpump",boiler,168,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Hybrid Heatpump",boiler,168,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Hybrid Heatpump",boiler,168,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Hybrid Heatpump",boiler,168,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Hybrid Heatpump",boiler,168,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Hybrid Heatpump",boiler,168,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Hybrid Heatpump",boiler,168,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Hybrid Heatpump",boiler,168,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Hybrid Heatpump",boiler,168,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Hybrid Heatpump",boiler,168,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Hybrid Heatpump",boiler,168,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Hybrid Heatpump",boiler,168,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Hybrid Heatpump",boiler,168,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Hybrid Heatpump",boiler,168,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Hybrid Heatpump",boiler,168,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Hybrid Heatpump",boiler,168,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Hybrid Heatpump",boiler,168,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Hybrid Heatpump",boiler,168,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Hybrid Heatpump",boiler,168,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Hybrid Heatpump",boiler,168,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Hybrid Heatpump",boiler,168,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Hybrid Heatpump",boiler,168,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Hybrid Heatpump",boiler,168,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Hybrid Heatpump",boiler,168,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Hybrid Heatpump",boiler,168,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Hybrid Heatpump",boiler,168,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Hybrid Heatpump",boiler,168,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Hybrid Heatpump",boiler,168,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Hybrid Heatpump",boiler,168,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Hybrid Heatpump",boiler,168,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Hybrid Heatpump",boiler,168,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Hybrid Heatpump",boiler,168,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Hybrid Heatpump",boiler,168,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Hybrid Heatpump",boiler,168,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Hybrid Heatpump",boiler,168,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Hybrid Heatpump",boiler,168,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logano GB212",boiler,170,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logano GB212",boiler,170,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logano GB212",boiler,170,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logano GB212",boiler,170,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logano GB212",boiler,170,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logano GB212",boiler,170,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logano GB212",boiler,170,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logano GB212",boiler,170,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logano GB212",boiler,170,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logano GB212",boiler,170,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logano GB212",boiler,170,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logano GB212",boiler,170,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logano GB212",boiler,170,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logano GB212",boiler,170,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logano GB212",boiler,170,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logano GB212",boiler,170,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logano GB212",boiler,170,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logano GB212",boiler,170,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logano GB212",boiler,170,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logano GB212",boiler,170,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logano GB212",boiler,170,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logano GB212",boiler,170,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logano GB212",boiler,170,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logano GB212",boiler,170,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logano GB212",boiler,170,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logano GB212",boiler,170,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logano GB212",boiler,170,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logano GB212",boiler,170,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logano GB212",boiler,170,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logano GB212",boiler,170,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logano GB212",boiler,170,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logano GB212",boiler,170,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logano GB212",boiler,170,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logano GB212",boiler,170,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logano GB212",boiler,170,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logano GB212",boiler,170,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logano GB212",boiler,170,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logano GB212",boiler,170,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logano GB212",boiler,170,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logano GB212",boiler,170,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logano GB212",boiler,170,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logano GB212",boiler,170,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logano GB212",boiler,170,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logano GB212",boiler,170,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logano GB212",boiler,170,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logano GB212",boiler,170,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logano GB212",boiler,170,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logano GB212",boiler,170,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logano GB212",boiler,170,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logano GB212",boiler,170,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logano GB212",boiler,170,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logano GB212",boiler,170,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logano GB212",boiler,170,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logano GB212",boiler,170,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logano GB212",boiler,170,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logano GB212",boiler,170,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logano GB212",boiler,170,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logano GB212",boiler,170,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logano GB212",boiler,170,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logano GB212",boiler,170,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logano GB212",boiler,170,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logano GB212",boiler,170,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logano GB212",boiler,170,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logano GB212",boiler,170,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logano GB212",boiler,170,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logano GB212",boiler,170,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logano GB212",boiler,170,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logano GB212",boiler,170,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logano GB212",boiler,170,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logano GB212",boiler,170,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logano GB212",boiler,170,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logano GB212",boiler,170,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logano GB212",boiler,170,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logano GB212",boiler,170,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logano GB212",boiler,170,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logano GB212",boiler,170,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logano GB212",boiler,170,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logano GB212",boiler,170,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logano GB212",boiler,170,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logano GB212",boiler,170,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logano GB212",boiler,170,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logano GB212",boiler,170,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logano GB212",boiler,170,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logano GB212",boiler,170,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logano GB212",boiler,170,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logano GB212",boiler,170,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logano GB212",boiler,170,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logano GB212",boiler,170,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logano GB212",boiler,170,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logano GB212",boiler,170,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logano GB212",boiler,170,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logano GB212",boiler,170,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logano GB212",boiler,170,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logano GB212",boiler,170,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logano GB212",boiler,170,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logano GB212",boiler,170,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logano GB212",boiler,170,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logano GB212",boiler,170,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logano GB212",boiler,170,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logano GB212",boiler,170,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logano GB212",boiler,170,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logano GB212",boiler,170,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logano GB212",boiler,170,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logano GB212",boiler,170,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logano GB212",boiler,170,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logano GB212",boiler,170,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logano GB212",boiler,170,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logano GB212",boiler,170,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logano GB212",boiler,170,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logano GB212",boiler,170,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logano GB212",boiler,170,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logano GB212",boiler,170,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logano GB212",boiler,170,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logano GB212",boiler,170,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logano GB212",boiler,170,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logano GB212",boiler,170,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logano GB212",boiler,170,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,mandefrost,manual defrost,cmd [off\|on], ,true,sensor.boiler_manual_defrost,sensor.boiler_mandefrost,5,0,1,84,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_energy,sensor.boiler_dhw_nrg,5,9,1/100,0,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_heating,sensor.boiler_nrgheat,5,0,1/100,87,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgcool,energy cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_cooling,sensor.boiler_nrgcool,5,0,1/100,89,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_total,sensor.boiler_metertotal,5,0,1/100,91,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_compressor,sensor.boiler_metercomp,5,0,1/100,93,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_e-heater,sensor.boiler_metereheat,5,0,1/100,95,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/100,97,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,metercool,meter cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_cooling,sensor.boiler_metercool,5,0,1/100,99,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/100,2,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimetotal,heatpump total uptime,time (>=0<=279620),minutes,false,sensor.boiler_heatpump_total_uptime,sensor.boiler_uptimetotal,5,0,1/60,101,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecontrol,total operating time heat,time (>=0<=279620),minutes,false,sensor.boiler_total_operating_time_heat,sensor.boiler_uptimecontrol,5,0,1/60,103,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecompheating,operating time compressor heating,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_heating,sensor.boiler_uptimecompheating,5,0,1/60,105,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecompcooling,operating time compressor cooling,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_cooling,sensor.boiler_uptimecompcooling,5,0,1/60,107,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.uptimecomp,operating time compressor,time (>=0<=279620),minutes,false,sensor.boiler_dhw_operating_time_compressor,sensor.boiler_dhw_uptimecomp,5,9,1/60,4,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,uptimecomppool,operating time compressor pool,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_pool,sensor.boiler_uptimecomppool,5,0,1/60,109,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,totalcompstarts,total compressor control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_total_compressor_control_starts,sensor.boiler_totalcompstarts,5,0,1,111,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_heating_control_starts,sensor.boiler_heatingstarts,5,0,1,113,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,coolingstarts,cooling control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_cooling_control_starts,sensor.boiler_coolingstarts,5,0,1,115,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts_hp,sensor.boiler_dhw_startshp,5,9,1,6,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,poolstarts,pool control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_pool_control_starts,sensor.boiler_poolstarts,5,0,1,117,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconstotal,total energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption,sensor.boiler_nrgconstotal,5,0,1,119,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscomptotal,total energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption_compressor,sensor.boiler_nrgconscomptotal,5,0,1,121,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscompheating,energy consumption compressor heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_heating,sensor.boiler_nrgconscompheating,5,0,1,123,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.nrgconscomp,energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_energy_consumption_compressor,sensor.boiler_dhw_nrgconscomp,5,9,1,8,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscompcooling,energy consumption compressor cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_cooling,sensor.boiler_nrgconscompcooling,5,0,1,125,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgconscomppool,energy consumption compressor pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_pool,sensor.boiler_nrgconscomppool,5,0,1,127,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxelecheatnrgconstotal,total aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_aux_elec._heater_energy_consumption,sensor.boiler_auxelecheatnrgconstotal,5,0,1,129,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxelecheatnrgconsheating,aux elec. heater energy consumption heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_heating,sensor.boiler_auxelecheatnrgconsheating,5,0,1,131,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.auxelecheatnrgcons,aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_aux_elec._heater_energy_consumption,sensor.boiler_dhw_auxelecheatnrgcons,5,9,1,10,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxelecheatnrgconspool,aux elec. heater energy consumption pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_pool,sensor.boiler_auxelecheatnrgconspool,5,0,1,133,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsupptotal,total energy supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied,sensor.boiler_nrgsupptotal,5,0,1,135,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsuppheating,total energy supplied heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_heating,sensor.boiler_nrgsuppheating,5,0,1,137,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.nrgsupp,total energy warm supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_total_energy_warm_supplied,sensor.boiler_dhw_nrgsupp,5,9,1,12,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsuppcooling,total energy supplied cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_cooling,sensor.boiler_nrgsuppcooling,5,0,1,139,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,nrgsupppool,total energy supplied pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_pool,sensor.boiler_nrgsupppool,5,0,1,141,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppower,compressor power output,uint16 (>=0<=3199),kW,false,sensor.boiler_compressor_power_output,sensor.boiler_hppower,5,0,1/10,143,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpmaxpower,compressor max power,uint8 (>=0<=100),%,true,number.boiler_compressor_max_power,number.boiler_hpmaxpower,5,0,1,144,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pvmaxcomp,pv compressor max power,uint8 (>=0<=25),kW,true,number.boiler_pv_compressor_max_power,number.boiler_pvmaxcomp,5,0,1/10,145,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,powerreduction,power reduction,uint8 (>=30<=60),%,true,number.boiler_power_reduction,number.boiler_powerreduction,5,0,10,146,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpsetdiffpress,set differential pressure,uint8 (>=150<=750),mbar,true,number.boiler_set_differential_pressure,number.boiler_hpsetdiffpress,5,0,50,147,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcompon,hp compressor,boolean, ,false,binary_sensor.boiler_hp_compressor,binary_sensor.boiler_hpcompon,5,0,1,148,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpactivity,compressor activity,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_compressor_activity,sensor.boiler_hpactivity,5,0,1,149,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpbrinepumpspd,brine pump speed,uint8 (>=0<=100),%,false,sensor.boiler_brine_pump_speed,sensor.boiler_hpbrinepumpspd,5,0,1,150,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpswitchvalve,switch valve,boolean, ,false,binary_sensor.boiler_switch_valve,binary_sensor.boiler_hpswitchvalve,5,0,1,151,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_speed,sensor.boiler_hpcompspd,5,0,1,152,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptargetspd,compressor target speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_target_speed,sensor.boiler_hptargetspd,5,0,1,153,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcircspd,circulation pump speed,uint8 (>=0<=100),%,false,sensor.boiler_circulation_pump_speed,sensor.boiler_hpcircspd,5,0,1,154,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,recvalve,receiver valve VR0,uint8 (>=0<=100),%,false,sensor.boiler_receiver_valve_VR0,sensor.boiler_recvalve,5,0,1,155,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,expvalve,expansion valve VR1,uint8 (>=0<=100),%,false,sensor.boiler_expansion_valve_VR1,sensor.boiler_expvalve,5,0,1,156,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpbrinein,brine in/evaporator,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_in/evaporator,sensor.boiler_hpbrinein,5,0,1/10,157,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpbrineout,brine out/condenser,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_out/condenser,sensor.boiler_hpbrineout,5,0,1/10,158,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptc0,heat carrier return (TC0),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_return_(TC0),sensor.boiler_hptc0,5,0,1/10,159,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptc1,heat carrier forward (TC1),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_forward_(TC1),sensor.boiler_hptc1,5,0,1/10,160,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptc3,condenser temperature (TC3),int16 (>=-3199<=3199),C,false,sensor.boiler_condenser_temperature_(TC3),sensor.boiler_hptc3,5,0,1/10,161,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_temperature_(TR1),sensor.boiler_hptr1,5,0,1/10,162,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.boiler_hptr3,5,0,1/10,163,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.boiler_evaporator_inlet_temperature_(TR4),sensor.boiler_hptr4,5,0,1/10,164,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_inlet_temperature_(TR5),sensor.boiler_hptr5,5,0,1/10,165,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_outlet_temperature_(TR6),sensor.boiler_hptr6,5,0,1/10,166,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptr7,refrigerant temperature gas side (condenser input) (TR7),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_gas_side_(condenser_input)_(TR7),sensor.boiler_hptr7,5,0,1/10,167,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.boiler_air_inlet_temperature_(TL2),sensor.boiler_hptl2,5,0,1/10,168,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.boiler_low_pressure_side_temperature_(PL1),sensor.boiler_hppl1,5,0,1/10,169,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.boiler_high_pressure_side_temperature_(PH1),sensor.boiler_hpph1,5,0,1/10,170,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.boiler_drain_pan_temp_(TA4),sensor.boiler_hpta4,5,0,1/10,171,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hptw1,reservoir temp (TW1),int16 (>=-3199<=3199),C,false,sensor.boiler_reservoir_temp_(TW1),sensor.boiler_hptw1,5,0,1/10,172,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,poolsettemp,pool set temperature,uint8 (>=0<=127),C,true,number.boiler_pool_set_temperature,number.boiler_poolsettemp,5,0,1/2,173,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin1,input 1 state,boolean, ,false,binary_sensor.boiler_input_1_state,binary_sensor.boiler_hpin1,5,0,1,174,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin1opt,input 1 options,string, ,true,sensor.boiler_input_1_options,sensor.boiler_hpin1opt,5,0,1,175,8 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin2,input 2 state,boolean, ,false,binary_sensor.boiler_input_2_state,binary_sensor.boiler_hpin2,5,0,1,183,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin2opt,input 2 options,string, ,true,sensor.boiler_input_2_options,sensor.boiler_hpin2opt,5,0,1,184,8 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin3,input 3 state,boolean, ,false,binary_sensor.boiler_input_3_state,binary_sensor.boiler_hpin3,5,0,1,192,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin3opt,input 3 options,string, ,true,sensor.boiler_input_3_options,sensor.boiler_hpin3opt,5,0,1,193,8 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin4,input 4 state,boolean, ,false,binary_sensor.boiler_input_4_state,binary_sensor.boiler_hpin4,5,0,1,201,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpin4opt,input 4 options,string, ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,5,0,1,202,8 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maxheatcomp,heat limit compressor,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,5,0,1,210,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,maxheatheat,heat limit heating,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,5,0,1,211,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.maxheat,heat limit,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,5,9,1,14,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheatersource,aux heater source,enum [not installed\|electric heater\|exclusive\|parallel\|hybrid], ,true,select.boiler_aux_heater_source,select.boiler_auxheatersource,5,0,1,212,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,pvcooling,cooling only with PV,boolean, ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,5,0,1,213,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheateronly,aux heater only,boolean, ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,5,0,1,214,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheateroff,disable aux heater,boolean, ,true,switch.boiler_disable_aux_heater,switch.boiler_auxheateroff,5,0,1,215,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheaterstatus,aux heater status,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_aux_heater_status,sensor.boiler_auxheaterstatus,5,0,1,216,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheaterlevel,aux heater level,uint8 (>=0<=100),%,false,sensor.boiler_aux_heater_level,sensor.boiler_auxheaterlevel,5,0,1,217,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheaterdelay,aux heater on delay,uint16 (>=10<=1000),K*min,true,number.boiler_aux_heater_on_delay,number.boiler_auxheaterdelay,5,0,10,218,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxmaxlimit,aux heater max limit,uint8 (>=0<=10),K,true,number.boiler_aux_heater_max_limit,number.boiler_auxmaxlimit,5,0,1/10,219,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxlimitstart,aux heater limit start,uint8 (>=0<=10),K,true,number.boiler_aux_heater_limit_start,number.boiler_auxlimitstart,5,0,1/10,220,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheatrmode,aux heater mode,enum [eco\|comfort], ,true,select.boiler_aux_heater_mode,select.boiler_auxheatrmode,5,0,1,221,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hphystheat,on/off hyst heat,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_heat,number.boiler_hphystheat,5,0,5,222,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hphystcool,on/off hyst cool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_cool,number.boiler_hphystcool,5,0,5,223,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hphystpool,on/off hyst pool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_pool,number.boiler_hphystpool,5,0,5,224,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,silentmode,silent mode,enum [off\|auto\|on], ,true,select.boiler_silent_mode,select.boiler_silentmode,5,0,1,225,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,silentfrom,silent mode from,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_from,number.boiler_silentfrom,5,0,15,226,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,silentto,silent mode to,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_to,number.boiler_silentto,5,0,15,227,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,mintempsilent,min outside temp for silent mode,int8 (>=-126<=126),C,true,number.boiler_min_outside_temp_for_silent_mode,number.boiler_mintempsilent,5,0,1,228,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tempparmode,outside temp parallel mode,int8 (>=-126<=126),C,true,number.boiler_outside_temp_parallel_mode,number.boiler_tempparmode,5,0,1,229,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,auxheatmix,aux heater mixing valve,int8 (>=-100<=100),%,false,sensor.boiler_aux_heater_mixing_valve,sensor.boiler_auxheatmix,5,0,1,230,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tempdiffheat,temp diff TC3/TC0 heat,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_heat,number.boiler_tempdiffheat,5,0,1/10,231,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,tempdiffcool,temp diff TC3/TC0 cool,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_cool,number.boiler_tempdiffcool,5,0,1/10,232,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,vpcooling,valve/pump cooling,boolean, ,true,switch.boiler_valve/pump_cooling,switch.boiler_vpcooling,5,0,1,233,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,heatcable,heating cable,boolean, ,true,switch.boiler_heating_cable,switch.boiler_heatcable,5,0,1,234,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,vc0valve,VC0 valve,boolean, ,true,switch.boiler_VC0_valve,switch.boiler_vc0valve,5,0,1,235,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,primepump,primary heatpump,boolean, ,true,switch.boiler_primary_heatpump,switch.boiler_primepump,5,0,1,236,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,primepumpmod,primary heatpump modulation,uint8 (>=0<=100),%,true,number.boiler_primary_heatpump_modulation,number.boiler_primepumpmod,5,0,1,237,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hp3way,3-way valve,boolean, ,true,switch.boiler_3-way_valve,switch.boiler_hp3way,5,0,1,238,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,elheatstep1,el. heater step 1,boolean, ,true,switch.boiler_el._heater_step_1,switch.boiler_elheatstep1,5,0,1,239,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,elheatstep2,el. heater step 2,boolean, ,true,switch.boiler_el._heater_step_2,switch.boiler_elheatstep2,5,0,1,240,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,elheatstep3,el. heater step 3,boolean, ,true,switch.boiler_el._heater_step_3,switch.boiler_elheatstep3,5,0,1,241,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpea0,condensate reservoir heating (EA0),boolean, ,false,binary_sensor.boiler_condensate_reservoir_heating_(EA0),binary_sensor.boiler_hpea0,5,0,1,242,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppumpmode,primary heatpump mode,enum [auto\|continuous], ,true,select.boiler_primary_heatpump_mode,select.boiler_hppumpmode,5,0,1,243,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,fan,fan,uint8 (>=20<=100),%,true,number.boiler_fan,number.boiler_fan,5,0,1,244,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,fanspd,fan speed,uint8 (>=0<=100),%,false,sensor.boiler_fan_speed,sensor.boiler_fanspd,5,0,1,245,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,shutdown,shutdown,cmd [off\|on], ,true,sensor.boiler_shutdown,sensor.boiler_shutdown,5,0,1,246,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hpcurrpower,compressor current power,uint16 (>=0<=31999),W,false,sensor.boiler_compressor_current_power,sensor.boiler_hpcurrpower,5,0,1,247,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,hppowerlimit,power limit,uint16 (>=0<=31999),W,true,number.boiler_power_limit,number.boiler_hppowerlimit,5,0,1,248,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.alternatingop,alternating operation,boolean, ,true,switch.boiler_dhw_alternating_operation,switch.boiler_dhw_alternatingop,5,9,1,15,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.altopprioheat,prioritise heating during dhw,uint8 (>=20<=120),minutes,true,number.boiler_dhw_prioritise_heating_during_dhw,number.boiler_dhw_altopprioheat,5,9,1,16,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.altopprio,prioritise dhw during heating,uint8 (>=30<=120),minutes,true,number.boiler_dhw_prioritise_dhw_during_heating,number.boiler_dhw_altopprio,5,9,1,17,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,5,9,1,18,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,5,9,1,19,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,5,9,1,20,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfdiff,comfort diff,uint8 (>=4<=15),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,5,9,1,21,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecodiff,eco diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,5,9,1,22,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusdiff,eco+ diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,5,9,1,23,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfstop,comfort stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,5,9,1,24,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecostop,eco stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,5,9,1,25,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,5,9,1,26,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.hpcircpump,circulation pump available during dhw,boolean, ,true,switch.boiler_dhw_circulation_pump_available_during_dhw,switch.boiler_dhw_hpcircpump,5,9,1,27,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Enviline, Compress 6000AW, Hybrid 3000-7000iAW, SupraEco/Geo 5xx, WLW196i/WSW196i",boiler,172,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Geo 5xx",boiler,173,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Geo 5xx",boiler,173,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Geo 5xx",boiler,173,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Geo 5xx",boiler,173,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Geo 5xx",boiler,173,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Geo 5xx",boiler,173,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Geo 5xx",boiler,173,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Geo 5xx",boiler,173,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Geo 5xx",boiler,173,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Geo 5xx",boiler,173,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Geo 5xx",boiler,173,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Geo 5xx",boiler,173,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Geo 5xx",boiler,173,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Geo 5xx",boiler,173,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Geo 5xx",boiler,173,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Geo 5xx",boiler,173,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Geo 5xx",boiler,173,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Geo 5xx",boiler,173,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Geo 5xx",boiler,173,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Geo 5xx",boiler,173,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Geo 5xx",boiler,173,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Geo 5xx",boiler,173,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Geo 5xx",boiler,173,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Geo 5xx",boiler,173,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Geo 5xx",boiler,173,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Geo 5xx",boiler,173,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Geo 5xx",boiler,173,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Geo 5xx",boiler,173,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Geo 5xx",boiler,173,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Geo 5xx",boiler,173,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Geo 5xx",boiler,173,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Geo 5xx",boiler,173,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Geo 5xx",boiler,173,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Geo 5xx",boiler,173,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Geo 5xx",boiler,173,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Geo 5xx",boiler,173,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Geo 5xx",boiler,173,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Geo 5xx",boiler,173,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Geo 5xx",boiler,173,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Geo 5xx",boiler,173,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Geo 5xx",boiler,173,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Geo 5xx",boiler,173,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Geo 5xx",boiler,173,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Geo 5xx",boiler,173,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Geo 5xx",boiler,173,mandefrost,manual defrost,cmd [off\|on], ,true,sensor.boiler_manual_defrost,sensor.boiler_mandefrost,5,0,1,84,1 +"Geo 5xx",boiler,173,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Geo 5xx",boiler,173,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_energy,sensor.boiler_dhw_nrg,5,9,1/100,0,2 +"Geo 5xx",boiler,173,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_heating,sensor.boiler_nrgheat,5,0,1/100,87,2 +"Geo 5xx",boiler,173,nrgcool,energy cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_energy_cooling,sensor.boiler_nrgcool,5,0,1/100,89,2 +"Geo 5xx",boiler,173,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_total,sensor.boiler_metertotal,5,0,1/100,91,2 +"Geo 5xx",boiler,173,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_compressor,sensor.boiler_metercomp,5,0,1/100,93,2 +"Geo 5xx",boiler,173,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_e-heater,sensor.boiler_metereheat,5,0,1/100,95,2 +"Geo 5xx",boiler,173,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/100,97,2 +"Geo 5xx",boiler,173,metercool,meter cooling,uint24 (>=0<=167772),kWh,false,sensor.boiler_meter_cooling,sensor.boiler_metercool,5,0,1/100,99,2 +"Geo 5xx",boiler,173,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/100,2,2 +"Geo 5xx",boiler,173,uptimetotal,heatpump total uptime,time (>=0<=279620),minutes,false,sensor.boiler_heatpump_total_uptime,sensor.boiler_uptimetotal,5,0,1/60,101,2 +"Geo 5xx",boiler,173,uptimecontrol,total operating time heat,time (>=0<=279620),minutes,false,sensor.boiler_total_operating_time_heat,sensor.boiler_uptimecontrol,5,0,1/60,103,2 +"Geo 5xx",boiler,173,uptimecompheating,operating time compressor heating,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_heating,sensor.boiler_uptimecompheating,5,0,1/60,105,2 +"Geo 5xx",boiler,173,uptimecompcooling,operating time compressor cooling,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_cooling,sensor.boiler_uptimecompcooling,5,0,1/60,107,2 +"Geo 5xx",boiler,173,dhw.uptimecomp,operating time compressor,time (>=0<=279620),minutes,false,sensor.boiler_dhw_operating_time_compressor,sensor.boiler_dhw_uptimecomp,5,9,1/60,4,2 +"Geo 5xx",boiler,173,uptimecomppool,operating time compressor pool,time (>=0<=279620),minutes,false,sensor.boiler_operating_time_compressor_pool,sensor.boiler_uptimecomppool,5,0,1/60,109,2 +"Geo 5xx",boiler,173,totalcompstarts,total compressor control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_total_compressor_control_starts,sensor.boiler_totalcompstarts,5,0,1,111,2 +"Geo 5xx",boiler,173,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_heating_control_starts,sensor.boiler_heatingstarts,5,0,1,113,2 +"Geo 5xx",boiler,173,coolingstarts,cooling control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_cooling_control_starts,sensor.boiler_coolingstarts,5,0,1,115,2 +"Geo 5xx",boiler,173,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts_hp,sensor.boiler_dhw_startshp,5,9,1,6,2 +"Geo 5xx",boiler,173,poolstarts,pool control starts,uint24 (>=0<=16777214), ,false,sensor.boiler_pool_control_starts,sensor.boiler_poolstarts,5,0,1,117,2 +"Geo 5xx",boiler,173,nrgconstotal,total energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption,sensor.boiler_nrgconstotal,5,0,1,119,2 +"Geo 5xx",boiler,173,nrgconscomptotal,total energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_consumption_compressor,sensor.boiler_nrgconscomptotal,5,0,1,121,2 +"Geo 5xx",boiler,173,nrgconscompheating,energy consumption compressor heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_heating,sensor.boiler_nrgconscompheating,5,0,1,123,2 +"Geo 5xx",boiler,173,dhw.nrgconscomp,energy consumption compressor,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_energy_consumption_compressor,sensor.boiler_dhw_nrgconscomp,5,9,1,8,2 +"Geo 5xx",boiler,173,nrgconscompcooling,energy consumption compressor cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_cooling,sensor.boiler_nrgconscompcooling,5,0,1,125,2 +"Geo 5xx",boiler,173,nrgconscomppool,energy consumption compressor pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_energy_consumption_compressor_pool,sensor.boiler_nrgconscomppool,5,0,1,127,2 +"Geo 5xx",boiler,173,auxelecheatnrgconstotal,total aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_aux_elec._heater_energy_consumption,sensor.boiler_auxelecheatnrgconstotal,5,0,1,129,2 +"Geo 5xx",boiler,173,auxelecheatnrgconsheating,aux elec. heater energy consumption heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_heating,sensor.boiler_auxelecheatnrgconsheating,5,0,1,131,2 +"Geo 5xx",boiler,173,dhw.auxelecheatnrgcons,aux elec. heater energy consumption,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_aux_elec._heater_energy_consumption,sensor.boiler_dhw_auxelecheatnrgcons,5,9,1,10,2 +"Geo 5xx",boiler,173,auxelecheatnrgconspool,aux elec. heater energy consumption pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_aux_elec._heater_energy_consumption_pool,sensor.boiler_auxelecheatnrgconspool,5,0,1,133,2 +"Geo 5xx",boiler,173,nrgsupptotal,total energy supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied,sensor.boiler_nrgsupptotal,5,0,1,135,2 +"Geo 5xx",boiler,173,nrgsuppheating,total energy supplied heating,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_heating,sensor.boiler_nrgsuppheating,5,0,1,137,2 +"Geo 5xx",boiler,173,dhw.nrgsupp,total energy warm supplied,uint24 (>=0<=16777214),kWh,false,sensor.boiler_dhw_total_energy_warm_supplied,sensor.boiler_dhw_nrgsupp,5,9,1,12,2 +"Geo 5xx",boiler,173,nrgsuppcooling,total energy supplied cooling,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_cooling,sensor.boiler_nrgsuppcooling,5,0,1,139,2 +"Geo 5xx",boiler,173,nrgsupppool,total energy supplied pool,uint24 (>=0<=16777214),kWh,false,sensor.boiler_total_energy_supplied_pool,sensor.boiler_nrgsupppool,5,0,1,141,2 +"Geo 5xx",boiler,173,hppower,compressor power output,uint16 (>=0<=3199),kW,false,sensor.boiler_compressor_power_output,sensor.boiler_hppower,5,0,1/10,143,1 +"Geo 5xx",boiler,173,hpmaxpower,compressor max power,uint8 (>=0<=100),%,true,number.boiler_compressor_max_power,number.boiler_hpmaxpower,5,0,1,144,1 +"Geo 5xx",boiler,173,pvmaxcomp,pv compressor max power,uint8 (>=0<=25),kW,true,number.boiler_pv_compressor_max_power,number.boiler_pvmaxcomp,5,0,1/10,145,1 +"Geo 5xx",boiler,173,powerreduction,power reduction,uint8 (>=30<=60),%,true,number.boiler_power_reduction,number.boiler_powerreduction,5,0,10,146,1 +"Geo 5xx",boiler,173,hpsetdiffpress,set differential pressure,uint8 (>=150<=750),mbar,true,number.boiler_set_differential_pressure,number.boiler_hpsetdiffpress,5,0,50,147,1 +"Geo 5xx",boiler,173,hpcompon,hp compressor,boolean, ,false,binary_sensor.boiler_hp_compressor,binary_sensor.boiler_hpcompon,5,0,1,148,1 +"Geo 5xx",boiler,173,hpactivity,compressor activity,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_compressor_activity,sensor.boiler_hpactivity,5,0,1,149,1 +"Geo 5xx",boiler,173,hpbrinepumpspd,brine pump speed,uint8 (>=0<=100),%,false,sensor.boiler_brine_pump_speed,sensor.boiler_hpbrinepumpspd,5,0,1,150,1 +"Geo 5xx",boiler,173,hpswitchvalve,switch valve,boolean, ,false,binary_sensor.boiler_switch_valve,binary_sensor.boiler_hpswitchvalve,5,0,1,151,1 +"Geo 5xx",boiler,173,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_speed,sensor.boiler_hpcompspd,5,0,1,152,1 +"Geo 5xx",boiler,173,hptargetspd,compressor target speed,uint8 (>=0<=100),%,false,sensor.boiler_compressor_target_speed,sensor.boiler_hptargetspd,5,0,1,153,1 +"Geo 5xx",boiler,173,hpcircspd,circulation pump speed,uint8 (>=0<=100),%,false,sensor.boiler_circulation_pump_speed,sensor.boiler_hpcircspd,5,0,1,154,1 +"Geo 5xx",boiler,173,recvalve,receiver valve VR0,uint8 (>=0<=100),%,false,sensor.boiler_receiver_valve_VR0,sensor.boiler_recvalve,5,0,1,155,1 +"Geo 5xx",boiler,173,expvalve,expansion valve VR1,uint8 (>=0<=100),%,false,sensor.boiler_expansion_valve_VR1,sensor.boiler_expvalve,5,0,1,156,1 +"Geo 5xx",boiler,173,hpbrinein,brine in/evaporator,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_in/evaporator,sensor.boiler_hpbrinein,5,0,1/10,157,1 +"Geo 5xx",boiler,173,hpbrineout,brine out/condenser,int16 (>=-3199<=3199),C,false,sensor.boiler_brine_out/condenser,sensor.boiler_hpbrineout,5,0,1/10,158,1 +"Geo 5xx",boiler,173,hptc0,heat carrier return (TC0),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_return_(TC0),sensor.boiler_hptc0,5,0,1/10,159,1 +"Geo 5xx",boiler,173,hptc1,heat carrier forward (TC1),int16 (>=-3199<=3199),C,false,sensor.boiler_heat_carrier_forward_(TC1),sensor.boiler_hptc1,5,0,1/10,160,1 +"Geo 5xx",boiler,173,hptc3,condenser temperature (TC3),int16 (>=-3199<=3199),C,false,sensor.boiler_condenser_temperature_(TC3),sensor.boiler_hptc3,5,0,1/10,161,1 +"Geo 5xx",boiler,173,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_temperature_(TR1),sensor.boiler_hptr1,5,0,1/10,162,1 +"Geo 5xx",boiler,173,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.boiler_hptr3,5,0,1/10,163,1 +"Geo 5xx",boiler,173,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.boiler_evaporator_inlet_temperature_(TR4),sensor.boiler_hptr4,5,0,1/10,164,1 +"Geo 5xx",boiler,173,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_inlet_temperature_(TR5),sensor.boiler_hptr5,5,0,1/10,165,1 +"Geo 5xx",boiler,173,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.boiler_compressor_outlet_temperature_(TR6),sensor.boiler_hptr6,5,0,1/10,166,1 +"Geo 5xx",boiler,173,hptr7,refrigerant temperature gas side (condenser input) (TR7),int16 (>=-3199<=3199),C,false,sensor.boiler_refrigerant_temperature_gas_side_(condenser_input)_(TR7),sensor.boiler_hptr7,5,0,1/10,167,1 +"Geo 5xx",boiler,173,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.boiler_air_inlet_temperature_(TL2),sensor.boiler_hptl2,5,0,1/10,168,1 +"Geo 5xx",boiler,173,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.boiler_low_pressure_side_temperature_(PL1),sensor.boiler_hppl1,5,0,1/10,169,1 +"Geo 5xx",boiler,173,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.boiler_high_pressure_side_temperature_(PH1),sensor.boiler_hpph1,5,0,1/10,170,1 +"Geo 5xx",boiler,173,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.boiler_drain_pan_temp_(TA4),sensor.boiler_hpta4,5,0,1/10,171,1 +"Geo 5xx",boiler,173,hptw1,reservoir temp (TW1),int16 (>=-3199<=3199),C,false,sensor.boiler_reservoir_temp_(TW1),sensor.boiler_hptw1,5,0,1/10,172,1 +"Geo 5xx",boiler,173,poolsettemp,pool set temperature,uint8 (>=0<=127),C,true,number.boiler_pool_set_temperature,number.boiler_poolsettemp,5,0,1/2,173,1 +"Geo 5xx",boiler,173,hpin1,input 1 state,boolean, ,false,binary_sensor.boiler_input_1_state,binary_sensor.boiler_hpin1,5,0,1,174,1 +"Geo 5xx",boiler,173,hpin1opt,input 1 options,string, ,true,sensor.boiler_input_1_options,sensor.boiler_hpin1opt,5,0,1,175,8 +"Geo 5xx",boiler,173,hpin2,input 2 state,boolean, ,false,binary_sensor.boiler_input_2_state,binary_sensor.boiler_hpin2,5,0,1,183,1 +"Geo 5xx",boiler,173,hpin2opt,input 2 options,string, ,true,sensor.boiler_input_2_options,sensor.boiler_hpin2opt,5,0,1,184,8 +"Geo 5xx",boiler,173,hpin3,input 3 state,boolean, ,false,binary_sensor.boiler_input_3_state,binary_sensor.boiler_hpin3,5,0,1,192,1 +"Geo 5xx",boiler,173,hpin3opt,input 3 options,string, ,true,sensor.boiler_input_3_options,sensor.boiler_hpin3opt,5,0,1,193,8 +"Geo 5xx",boiler,173,hpin4,input 4 state,boolean, ,false,binary_sensor.boiler_input_4_state,binary_sensor.boiler_hpin4,5,0,1,201,1 +"Geo 5xx",boiler,173,hpin4opt,input 4 options,string, ,true,sensor.boiler_input_4_options,sensor.boiler_hpin4opt,5,0,1,202,8 +"Geo 5xx",boiler,173,maxheatcomp,heat limit compressor,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_compressor,select.boiler_maxheatcomp,5,0,1,210,1 +"Geo 5xx",boiler,173,maxheatheat,heat limit heating,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_heat_limit_heating,select.boiler_maxheatheat,5,0,1,211,1 +"Geo 5xx",boiler,173,dhw.maxheat,heat limit,enum [0 kW\|2 kW\|3 kW\|4 kW\|6 kW\|9 kW], ,true,select.boiler_dhw_heat_limit,select.boiler_dhw_maxheat,5,9,1,14,1 +"Geo 5xx",boiler,173,auxheatersource,aux heater source,enum [not installed\|electric heater\|exclusive\|parallel\|hybrid], ,true,select.boiler_aux_heater_source,select.boiler_auxheatersource,5,0,1,212,1 +"Geo 5xx",boiler,173,pvcooling,cooling only with PV,boolean, ,true,switch.boiler_cooling_only_with_PV,switch.boiler_pvcooling,5,0,1,213,1 +"Geo 5xx",boiler,173,auxheateronly,aux heater only,boolean, ,true,switch.boiler_aux_heater_only,switch.boiler_auxheateronly,5,0,1,214,1 +"Geo 5xx",boiler,173,auxheateroff,disable aux heater,boolean, ,true,switch.boiler_disable_aux_heater,switch.boiler_auxheateroff,5,0,1,215,1 +"Geo 5xx",boiler,173,auxheaterstatus,aux heater status,enum [off\|heating\|cooling\|hot water\|pool\|pool heating\|defrost\|compressor alarm], ,false,sensor.boiler_aux_heater_status,sensor.boiler_auxheaterstatus,5,0,1,216,1 +"Geo 5xx",boiler,173,auxheaterlevel,aux heater level,uint8 (>=0<=100),%,false,sensor.boiler_aux_heater_level,sensor.boiler_auxheaterlevel,5,0,1,217,1 +"Geo 5xx",boiler,173,auxheaterdelay,aux heater on delay,uint16 (>=10<=1000),K*min,true,number.boiler_aux_heater_on_delay,number.boiler_auxheaterdelay,5,0,10,218,1 +"Geo 5xx",boiler,173,auxmaxlimit,aux heater max limit,uint8 (>=0<=10),K,true,number.boiler_aux_heater_max_limit,number.boiler_auxmaxlimit,5,0,1/10,219,1 +"Geo 5xx",boiler,173,auxlimitstart,aux heater limit start,uint8 (>=0<=10),K,true,number.boiler_aux_heater_limit_start,number.boiler_auxlimitstart,5,0,1/10,220,1 +"Geo 5xx",boiler,173,auxheatrmode,aux heater mode,enum [eco\|comfort], ,true,select.boiler_aux_heater_mode,select.boiler_auxheatrmode,5,0,1,221,1 +"Geo 5xx",boiler,173,hphystheat,on/off hyst heat,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_heat,number.boiler_hphystheat,5,0,5,222,1 +"Geo 5xx",boiler,173,hphystcool,on/off hyst cool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_cool,number.boiler_hphystcool,5,0,5,223,1 +"Geo 5xx",boiler,173,hphystpool,on/off hyst pool,uint16 (>=50<=1500),K*min,true,number.boiler_on/off_hyst_pool,number.boiler_hphystpool,5,0,5,224,1 +"Geo 5xx",boiler,173,silentmode,silent mode,enum [off\|auto\|on], ,true,select.boiler_silent_mode,select.boiler_silentmode,5,0,1,225,1 +"Geo 5xx",boiler,173,silentfrom,silent mode from,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_from,number.boiler_silentfrom,5,0,15,226,1 +"Geo 5xx",boiler,173,silentto,silent mode to,uint8 (>=0<=3810),minutes,true,number.boiler_silent_mode_to,number.boiler_silentto,5,0,15,227,1 +"Geo 5xx",boiler,173,mintempsilent,min outside temp for silent mode,int8 (>=-126<=126),C,true,number.boiler_min_outside_temp_for_silent_mode,number.boiler_mintempsilent,5,0,1,228,1 +"Geo 5xx",boiler,173,tempparmode,outside temp parallel mode,int8 (>=-126<=126),C,true,number.boiler_outside_temp_parallel_mode,number.boiler_tempparmode,5,0,1,229,1 +"Geo 5xx",boiler,173,auxheatmix,aux heater mixing valve,int8 (>=-100<=100),%,false,sensor.boiler_aux_heater_mixing_valve,sensor.boiler_auxheatmix,5,0,1,230,1 +"Geo 5xx",boiler,173,tempdiffheat,temp diff TC3/TC0 heat,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_heat,number.boiler_tempdiffheat,5,0,1/10,231,1 +"Geo 5xx",boiler,173,tempdiffcool,temp diff TC3/TC0 cool,uint8 (>=2<=10),K,true,number.boiler_temp_diff_TC3/TC0_cool,number.boiler_tempdiffcool,5,0,1/10,232,1 +"Geo 5xx",boiler,173,vpcooling,valve/pump cooling,boolean, ,true,switch.boiler_valve/pump_cooling,switch.boiler_vpcooling,5,0,1,233,1 +"Geo 5xx",boiler,173,heatcable,heating cable,boolean, ,true,switch.boiler_heating_cable,switch.boiler_heatcable,5,0,1,234,1 +"Geo 5xx",boiler,173,vc0valve,VC0 valve,boolean, ,true,switch.boiler_VC0_valve,switch.boiler_vc0valve,5,0,1,235,1 +"Geo 5xx",boiler,173,primepump,primary heatpump,boolean, ,true,switch.boiler_primary_heatpump,switch.boiler_primepump,5,0,1,236,1 +"Geo 5xx",boiler,173,primepumpmod,primary heatpump modulation,uint8 (>=0<=100),%,true,number.boiler_primary_heatpump_modulation,number.boiler_primepumpmod,5,0,1,237,1 +"Geo 5xx",boiler,173,hp3way,3-way valve,boolean, ,true,switch.boiler_3-way_valve,switch.boiler_hp3way,5,0,1,238,1 +"Geo 5xx",boiler,173,elheatstep1,el. heater step 1,boolean, ,true,switch.boiler_el._heater_step_1,switch.boiler_elheatstep1,5,0,1,239,1 +"Geo 5xx",boiler,173,elheatstep2,el. heater step 2,boolean, ,true,switch.boiler_el._heater_step_2,switch.boiler_elheatstep2,5,0,1,240,1 +"Geo 5xx",boiler,173,elheatstep3,el. heater step 3,boolean, ,true,switch.boiler_el._heater_step_3,switch.boiler_elheatstep3,5,0,1,241,1 +"Geo 5xx",boiler,173,hpea0,condensate reservoir heating (EA0),boolean, ,false,binary_sensor.boiler_condensate_reservoir_heating_(EA0),binary_sensor.boiler_hpea0,5,0,1,242,1 +"Geo 5xx",boiler,173,hppumpmode,primary heatpump mode,enum [auto\|continuous], ,true,select.boiler_primary_heatpump_mode,select.boiler_hppumpmode,5,0,1,243,1 +"Geo 5xx",boiler,173,fan,fan,uint8 (>=20<=100),%,true,number.boiler_fan,number.boiler_fan,5,0,1,244,1 +"Geo 5xx",boiler,173,fanspd,fan speed,uint8 (>=0<=100),%,false,sensor.boiler_fan_speed,sensor.boiler_fanspd,5,0,1,245,1 +"Geo 5xx",boiler,173,shutdown,shutdown,cmd [off\|on], ,true,sensor.boiler_shutdown,sensor.boiler_shutdown,5,0,1,246,1 +"Geo 5xx",boiler,173,hpcurrpower,compressor current power,uint16 (>=0<=31999),W,false,sensor.boiler_compressor_current_power,sensor.boiler_hpcurrpower,5,0,1,247,1 +"Geo 5xx",boiler,173,hppowerlimit,power limit,uint16 (>=0<=31999),W,true,number.boiler_power_limit,number.boiler_hppowerlimit,5,0,1,248,1 +"Geo 5xx",boiler,173,dhw.alternatingop,alternating operation,boolean, ,true,switch.boiler_dhw_alternating_operation,switch.boiler_dhw_alternatingop,5,9,1,15,1 +"Geo 5xx",boiler,173,dhw.altopprioheat,prioritise heating during dhw,uint8 (>=20<=120),minutes,true,number.boiler_dhw_prioritise_heating_during_dhw,number.boiler_dhw_altopprioheat,5,9,1,16,1 +"Geo 5xx",boiler,173,dhw.altopprio,prioritise dhw during heating,uint8 (>=30<=120),minutes,true,number.boiler_dhw_prioritise_dhw_during_heating,number.boiler_dhw_altopprio,5,9,1,17,1 +"Geo 5xx",boiler,173,dhw.comfoff,comfort switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_comfort_switch_off,number.boiler_dhw_comfoff,5,9,1,18,1 +"Geo 5xx",boiler,173,dhw.ecooff,eco switch off,uint8 (>=15<=65),C,true,number.boiler_dhw_eco_switch_off,number.boiler_dhw_ecooff,5,9,1,19,1 +"Geo 5xx",boiler,173,dhw.ecoplusoff,eco+ switch off,uint8 (>=48<=63),C,true,number.boiler_dhw_eco+_switch_off,number.boiler_dhw_ecoplusoff,5,9,1,20,1 +"Geo 5xx",boiler,173,dhw.comfdiff,comfort diff,uint8 (>=4<=15),K,true,number.boiler_dhw_comfort_diff,number.boiler_dhw_comfdiff,5,9,1,21,1 +"Geo 5xx",boiler,173,dhw.ecodiff,eco diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco_diff,number.boiler_dhw_ecodiff,5,9,1,22,1 +"Geo 5xx",boiler,173,dhw.ecoplusdiff,eco+ diff,uint8 (>=4<=15),K,true,number.boiler_dhw_eco+_diff,number.boiler_dhw_ecoplusdiff,5,9,1,23,1 +"Geo 5xx",boiler,173,dhw.comfstop,comfort stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_comfort_stop_temp,number.boiler_dhw_comfstop,5,9,1,24,1 +"Geo 5xx",boiler,173,dhw.ecostop,eco stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco_stop_temp,number.boiler_dhw_ecostop,5,9,1,25,1 +"Geo 5xx",boiler,173,dhw.ecoplusstop,eco+ stop temp,uint8 (>=0<=254),C,true,number.boiler_dhw_eco+_stop_temp,number.boiler_dhw_ecoplusstop,5,9,1,26,1 +"Geo 5xx",boiler,173,dhw.hpcircpump,circulation pump available during dhw,boolean, ,true,switch.boiler_dhw_circulation_pump_available_during_dhw,switch.boiler_dhw_hpcircpump,5,9,1,27,1 +"Geo 5xx",boiler,173,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Geo 5xx",boiler,173,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Geo 5xx",boiler,173,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Geo 5xx",boiler,173,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Geo 5xx",boiler,173,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Geo 5xx",boiler,173,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Geo 5xx",boiler,173,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Geo 5xx",boiler,173,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Geo 5xx",boiler,173,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Geo 5xx",boiler,173,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Geo 5xx",boiler,173,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Geo 5xx",boiler,173,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Geo 5xx",boiler,173,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Geo 5xx",boiler,173,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Geo 5xx",boiler,173,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Geo 5xx",boiler,173,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Geo 5xx",boiler,173,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Geo 5xx",boiler,173,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Geo 5xx",boiler,173,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Geo 5xx",boiler,173,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Geo 5xx",boiler,173,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Geo 5xx",boiler,173,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Geo 5xx",boiler,173,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Geo 5xx",boiler,173,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Geo 5xx",boiler,173,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Geo 5xx",boiler,173,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Geo 5xx",boiler,173,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Geo 5xx",boiler,173,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Geo 5xx",boiler,173,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Geo 5xx",boiler,173,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Geo 5xx",boiler,173,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Geo 5xx",boiler,173,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Geo 5xx",boiler,173,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Geo 5xx",boiler,173,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Geo 5xx",boiler,173,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Geo 5xx",boiler,173,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Geo 5xx",boiler,173,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Geo 5xx",boiler,173,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Geo 5xx",boiler,173,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Geo 5xx",boiler,173,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Geo 5xx",boiler,173,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Condens 5000i, Greenstar 8000/GC9800IW, GB192i*2",boiler,195,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logamax U122, Cerapur",boiler,203,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logamax U122, Cerapur",boiler,203,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logamax U122, Cerapur",boiler,203,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logamax U122, Cerapur",boiler,203,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logamax U122, Cerapur",boiler,203,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logamax U122, Cerapur",boiler,203,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logamax U122, Cerapur",boiler,203,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logamax U122, Cerapur",boiler,203,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logamax U122, Cerapur",boiler,203,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logamax U122, Cerapur",boiler,203,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logamax U122, Cerapur",boiler,203,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logamax U122, Cerapur",boiler,203,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logamax U122, Cerapur",boiler,203,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logamax U122, Cerapur",boiler,203,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logamax U122, Cerapur",boiler,203,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logamax U122, Cerapur",boiler,203,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logamax U122, Cerapur",boiler,203,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logamax U122, Cerapur",boiler,203,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logamax U122, Cerapur",boiler,203,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logamax U122, Cerapur",boiler,203,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logamax U122, Cerapur",boiler,203,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logamax U122, Cerapur",boiler,203,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logamax U122, Cerapur",boiler,203,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logamax U122, Cerapur",boiler,203,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logamax U122, Cerapur",boiler,203,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logamax U122, Cerapur",boiler,203,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logamax U122, Cerapur",boiler,203,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logamax U122, Cerapur",boiler,203,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logamax U122, Cerapur",boiler,203,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logamax U122, Cerapur",boiler,203,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logamax U122, Cerapur",boiler,203,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logamax U122, Cerapur",boiler,203,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logamax U122, Cerapur",boiler,203,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logamax U122, Cerapur",boiler,203,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logamax U122, Cerapur",boiler,203,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logamax U122, Cerapur",boiler,203,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logamax U122, Cerapur",boiler,203,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logamax U122, Cerapur",boiler,203,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logamax U122, Cerapur",boiler,203,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logamax U122, Cerapur",boiler,203,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logamax U122, Cerapur",boiler,203,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logamax U122, Cerapur",boiler,203,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logamax U122, Cerapur",boiler,203,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logamax U122, Cerapur",boiler,203,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logamax U122, Cerapur",boiler,203,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logamax U122, Cerapur",boiler,203,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logamax U122, Cerapur",boiler,203,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logamax U122, Cerapur",boiler,203,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logamax U122, Cerapur",boiler,203,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logamax U122, Cerapur",boiler,203,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logamax U122, Cerapur",boiler,203,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logamax U122, Cerapur",boiler,203,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logamax U122, Cerapur",boiler,203,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logamax U122, Cerapur",boiler,203,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logamax U122, Cerapur",boiler,203,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logamax U122, Cerapur",boiler,203,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logamax U122, Cerapur",boiler,203,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logamax U122, Cerapur",boiler,203,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logamax U122, Cerapur",boiler,203,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logamax U122, Cerapur",boiler,203,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logamax U122, Cerapur",boiler,203,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logamax U122, Cerapur",boiler,203,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logamax U122, Cerapur",boiler,203,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logamax U122, Cerapur",boiler,203,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logamax U122, Cerapur",boiler,203,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logamax U122, Cerapur",boiler,203,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logamax U122, Cerapur",boiler,203,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logamax U122, Cerapur",boiler,203,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logamax U122, Cerapur",boiler,203,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logamax U122, Cerapur",boiler,203,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logamax U122, Cerapur",boiler,203,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logamax U122, Cerapur",boiler,203,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logamax U122, Cerapur",boiler,203,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logamax U122, Cerapur",boiler,203,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logamax U122, Cerapur",boiler,203,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logamax U122, Cerapur",boiler,203,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logamax U122, Cerapur",boiler,203,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logamax U122, Cerapur",boiler,203,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logamax U122, Cerapur",boiler,203,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logamax U122, Cerapur",boiler,203,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logamax U122, Cerapur",boiler,203,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logamax U122, Cerapur",boiler,203,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logamax U122, Cerapur",boiler,203,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logamax U122, Cerapur",boiler,203,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logamax U122, Cerapur",boiler,203,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logamax U122, Cerapur",boiler,203,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logamax U122, Cerapur",boiler,203,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logamax U122, Cerapur",boiler,203,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logamax U122, Cerapur",boiler,203,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logamax U122, Cerapur",boiler,203,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logamax U122, Cerapur",boiler,203,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logamax U122, Cerapur",boiler,203,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logamax U122, Cerapur",boiler,203,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logamax U122, Cerapur",boiler,203,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logamax U122, Cerapur",boiler,203,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logamax U122, Cerapur",boiler,203,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logamax U122, Cerapur",boiler,203,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logamax U122, Cerapur",boiler,203,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logamax U122, Cerapur",boiler,203,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logamax U122, Cerapur",boiler,203,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logamax U122, Cerapur",boiler,203,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logamax U122, Cerapur",boiler,203,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logamax U122, Cerapur",boiler,203,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logamax U122, Cerapur",boiler,203,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logamax U122, Cerapur",boiler,203,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logamax U122, Cerapur",boiler,203,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logamax U122, Cerapur",boiler,203,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logamax U122, Cerapur",boiler,203,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logamax U122, Cerapur",boiler,203,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logamax U122, Cerapur",boiler,203,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logamax U122, Cerapur",boiler,203,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logamax U122, Cerapur",boiler,203,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logamax U122, Cerapur",boiler,203,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logamax U122, Cerapur",boiler,203,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logamax U122, Cerapur",boiler,203,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logamax U122, Cerapur",boiler,203,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logamax U122, Cerapur",boiler,203,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Ecomline Excellent",boiler,206,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Ecomline Excellent",boiler,206,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Ecomline Excellent",boiler,206,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Ecomline Excellent",boiler,206,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Ecomline Excellent",boiler,206,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Ecomline Excellent",boiler,206,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Ecomline Excellent",boiler,206,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Ecomline Excellent",boiler,206,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Ecomline Excellent",boiler,206,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Ecomline Excellent",boiler,206,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Ecomline Excellent",boiler,206,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Ecomline Excellent",boiler,206,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Ecomline Excellent",boiler,206,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Ecomline Excellent",boiler,206,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Ecomline Excellent",boiler,206,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Ecomline Excellent",boiler,206,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Ecomline Excellent",boiler,206,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Ecomline Excellent",boiler,206,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Ecomline Excellent",boiler,206,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Ecomline Excellent",boiler,206,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Ecomline Excellent",boiler,206,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Ecomline Excellent",boiler,206,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Ecomline Excellent",boiler,206,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Ecomline Excellent",boiler,206,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Ecomline Excellent",boiler,206,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Ecomline Excellent",boiler,206,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Ecomline Excellent",boiler,206,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Ecomline Excellent",boiler,206,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Ecomline Excellent",boiler,206,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Ecomline Excellent",boiler,206,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Ecomline Excellent",boiler,206,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Ecomline Excellent",boiler,206,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Ecomline Excellent",boiler,206,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Ecomline Excellent",boiler,206,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Ecomline Excellent",boiler,206,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Ecomline Excellent",boiler,206,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Ecomline Excellent",boiler,206,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Ecomline Excellent",boiler,206,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Ecomline Excellent",boiler,206,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Ecomline Excellent",boiler,206,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Ecomline Excellent",boiler,206,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Ecomline Excellent",boiler,206,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Ecomline Excellent",boiler,206,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Ecomline Excellent",boiler,206,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Ecomline Excellent",boiler,206,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Ecomline Excellent",boiler,206,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Ecomline Excellent",boiler,206,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Ecomline Excellent",boiler,206,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Ecomline Excellent",boiler,206,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Ecomline Excellent",boiler,206,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Ecomline Excellent",boiler,206,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Ecomline Excellent",boiler,206,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Ecomline Excellent",boiler,206,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Ecomline Excellent",boiler,206,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Ecomline Excellent",boiler,206,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Ecomline Excellent",boiler,206,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Ecomline Excellent",boiler,206,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Ecomline Excellent",boiler,206,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Ecomline Excellent",boiler,206,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Ecomline Excellent",boiler,206,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Ecomline Excellent",boiler,206,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Ecomline Excellent",boiler,206,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Ecomline Excellent",boiler,206,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Ecomline Excellent",boiler,206,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Ecomline Excellent",boiler,206,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Ecomline Excellent",boiler,206,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Ecomline Excellent",boiler,206,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Ecomline Excellent",boiler,206,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Ecomline Excellent",boiler,206,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Ecomline Excellent",boiler,206,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Ecomline Excellent",boiler,206,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Ecomline Excellent",boiler,206,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Ecomline Excellent",boiler,206,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Ecomline Excellent",boiler,206,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Ecomline Excellent",boiler,206,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Ecomline Excellent",boiler,206,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Ecomline Excellent",boiler,206,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Ecomline Excellent",boiler,206,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Ecomline Excellent",boiler,206,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Ecomline Excellent",boiler,206,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Ecomline Excellent",boiler,206,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Ecomline Excellent",boiler,206,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Ecomline Excellent",boiler,206,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Ecomline Excellent",boiler,206,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Ecomline Excellent",boiler,206,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Ecomline Excellent",boiler,206,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Ecomline Excellent",boiler,206,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Ecomline Excellent",boiler,206,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Ecomline Excellent",boiler,206,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Ecomline Excellent",boiler,206,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Ecomline Excellent",boiler,206,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Ecomline Excellent",boiler,206,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Ecomline Excellent",boiler,206,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Ecomline Excellent",boiler,206,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Ecomline Excellent",boiler,206,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Ecomline Excellent",boiler,206,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Ecomline Excellent",boiler,206,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Ecomline Excellent",boiler,206,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Ecomline Excellent",boiler,206,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Ecomline Excellent",boiler,206,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Ecomline Excellent",boiler,206,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Ecomline Excellent",boiler,206,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Ecomline Excellent",boiler,206,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Ecomline Excellent",boiler,206,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Ecomline Excellent",boiler,206,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Ecomline Excellent",boiler,206,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Ecomline Excellent",boiler,206,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Ecomline Excellent",boiler,206,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Ecomline Excellent",boiler,206,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Ecomline Excellent",boiler,206,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Ecomline Excellent",boiler,206,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Ecomline Excellent",boiler,206,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Ecomline Excellent",boiler,206,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Ecomline Excellent",boiler,206,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Ecomline Excellent",boiler,206,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Ecomline Excellent",boiler,206,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Ecomline Excellent",boiler,206,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logamax Plus, GB192, Condens GC9000, Greenstar ErP",boiler,208,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Cascade MC400",boiler,210,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Cascade MC400",boiler,210,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Cascade MC400",boiler,210,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Cascade MC400",boiler,210,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Cascade MC400",boiler,210,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Cascade MC400",boiler,210,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Cascade MC400",boiler,210,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Cascade MC400",boiler,210,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Cascade MC400",boiler,210,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Cascade MC400",boiler,210,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Cascade MC400",boiler,210,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Cascade MC400",boiler,210,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Cascade MC400",boiler,210,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Cascade MC400",boiler,210,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Cascade MC400",boiler,210,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Cascade MC400",boiler,210,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Cascade MC400",boiler,210,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Cascade MC400",boiler,210,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Cascade MC400",boiler,210,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Cascade MC400",boiler,210,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Cascade MC400",boiler,210,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Cascade MC400",boiler,210,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Cascade MC400",boiler,210,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Cascade MC400",boiler,210,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Cascade MC400",boiler,210,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Cascade MC400",boiler,210,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Cascade MC400",boiler,210,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Cascade MC400",boiler,210,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Cascade MC400",boiler,210,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Cascade MC400",boiler,210,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Cascade MC400",boiler,210,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Cascade MC400",boiler,210,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Cascade MC400",boiler,210,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Cascade MC400",boiler,210,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Cascade MC400",boiler,210,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Cascade MC400",boiler,210,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Cascade MC400",boiler,210,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Cascade MC400",boiler,210,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Cascade MC400",boiler,210,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Cascade MC400",boiler,210,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Cascade MC400",boiler,210,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Cascade MC400",boiler,210,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Cascade MC400",boiler,210,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Cascade MC400",boiler,210,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Cascade MC400",boiler,210,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Cascade MC400",boiler,210,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Cascade MC400",boiler,210,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Cascade MC400",boiler,210,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Cascade MC400",boiler,210,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Cascade MC400",boiler,210,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Cascade MC400",boiler,210,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Cascade MC400",boiler,210,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Cascade MC400",boiler,210,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Cascade MC400",boiler,210,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Cascade MC400",boiler,210,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Cascade MC400",boiler,210,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Cascade MC400",boiler,210,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Cascade MC400",boiler,210,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Cascade MC400",boiler,210,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Cascade MC400",boiler,210,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Cascade MC400",boiler,210,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Cascade MC400",boiler,210,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Cascade MC400",boiler,210,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Cascade MC400",boiler,210,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Cascade MC400",boiler,210,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Cascade MC400",boiler,210,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Cascade MC400",boiler,210,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Cascade MC400",boiler,210,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Cascade MC400",boiler,210,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Cascade MC400",boiler,210,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Cascade MC400",boiler,210,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Cascade MC400",boiler,210,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Cascade MC400",boiler,210,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Cascade MC400",boiler,210,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Cascade MC400",boiler,210,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Cascade MC400",boiler,210,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Cascade MC400",boiler,210,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Cascade MC400",boiler,210,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Cascade MC400",boiler,210,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Cascade MC400",boiler,210,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Cascade MC400",boiler,210,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Cascade MC400",boiler,210,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Cascade MC400",boiler,210,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Cascade MC400",boiler,210,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Cascade MC400",boiler,210,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Cascade MC400",boiler,210,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Cascade MC400",boiler,210,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Cascade MC400",boiler,210,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Cascade MC400",boiler,210,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Cascade MC400",boiler,210,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Cascade MC400",boiler,210,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Cascade MC400",boiler,210,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Cascade MC400",boiler,210,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Cascade MC400",boiler,210,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Cascade MC400",boiler,210,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Cascade MC400",boiler,210,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Cascade MC400",boiler,210,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Cascade MC400",boiler,210,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Cascade MC400",boiler,210,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Cascade MC400",boiler,210,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Cascade MC400",boiler,210,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Cascade MC400",boiler,210,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Cascade MC400",boiler,210,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Cascade MC400",boiler,210,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Cascade MC400",boiler,210,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Cascade MC400",boiler,210,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Cascade MC400",boiler,210,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Cascade MC400",boiler,210,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Cascade MC400",boiler,210,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Cascade MC400",boiler,210,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Cascade MC400",boiler,210,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Cascade MC400",boiler,210,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Cascade MC400",boiler,210,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Cascade MC400",boiler,210,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Cascade MC400",boiler,210,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Cascade MC400",boiler,210,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Cascade MC400",boiler,210,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"EasyControl Adapter",boiler,211,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"EasyControl Adapter",boiler,211,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"EasyControl Adapter",boiler,211,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"EasyControl Adapter",boiler,211,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"EasyControl Adapter",boiler,211,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"EasyControl Adapter",boiler,211,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"EasyControl Adapter",boiler,211,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"EasyControl Adapter",boiler,211,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"EasyControl Adapter",boiler,211,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"EasyControl Adapter",boiler,211,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"EasyControl Adapter",boiler,211,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"EasyControl Adapter",boiler,211,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"EasyControl Adapter",boiler,211,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"EasyControl Adapter",boiler,211,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"EasyControl Adapter",boiler,211,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"EasyControl Adapter",boiler,211,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"EasyControl Adapter",boiler,211,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"EasyControl Adapter",boiler,211,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"EasyControl Adapter",boiler,211,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"EasyControl Adapter",boiler,211,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"EasyControl Adapter",boiler,211,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"EasyControl Adapter",boiler,211,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"EasyControl Adapter",boiler,211,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"EasyControl Adapter",boiler,211,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"EasyControl Adapter",boiler,211,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"EasyControl Adapter",boiler,211,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"EasyControl Adapter",boiler,211,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"EasyControl Adapter",boiler,211,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"EasyControl Adapter",boiler,211,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"EasyControl Adapter",boiler,211,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"EasyControl Adapter",boiler,211,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"EasyControl Adapter",boiler,211,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"EasyControl Adapter",boiler,211,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"EasyControl Adapter",boiler,211,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"EasyControl Adapter",boiler,211,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"EasyControl Adapter",boiler,211,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"EasyControl Adapter",boiler,211,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"EasyControl Adapter",boiler,211,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"EasyControl Adapter",boiler,211,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"EasyControl Adapter",boiler,211,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"EasyControl Adapter",boiler,211,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"EasyControl Adapter",boiler,211,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"EasyControl Adapter",boiler,211,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"EasyControl Adapter",boiler,211,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"EasyControl Adapter",boiler,211,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"EasyControl Adapter",boiler,211,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"EasyControl Adapter",boiler,211,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"EasyControl Adapter",boiler,211,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"EasyControl Adapter",boiler,211,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"EasyControl Adapter",boiler,211,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"EasyControl Adapter",boiler,211,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"EasyControl Adapter",boiler,211,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"EasyControl Adapter",boiler,211,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"EasyControl Adapter",boiler,211,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"EasyControl Adapter",boiler,211,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"EasyControl Adapter",boiler,211,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"EasyControl Adapter",boiler,211,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"EasyControl Adapter",boiler,211,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"EasyControl Adapter",boiler,211,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"EasyControl Adapter",boiler,211,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"EasyControl Adapter",boiler,211,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"EasyControl Adapter",boiler,211,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"EasyControl Adapter",boiler,211,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"EasyControl Adapter",boiler,211,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"EasyControl Adapter",boiler,211,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"EasyControl Adapter",boiler,211,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"EasyControl Adapter",boiler,211,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"EasyControl Adapter",boiler,211,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"EasyControl Adapter",boiler,211,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"EasyControl Adapter",boiler,211,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"EasyControl Adapter",boiler,211,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"EasyControl Adapter",boiler,211,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"EasyControl Adapter",boiler,211,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"EasyControl Adapter",boiler,211,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"EasyControl Adapter",boiler,211,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"EasyControl Adapter",boiler,211,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"EasyControl Adapter",boiler,211,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"EasyControl Adapter",boiler,211,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"EasyControl Adapter",boiler,211,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"EasyControl Adapter",boiler,211,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"EasyControl Adapter",boiler,211,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"EasyControl Adapter",boiler,211,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"EasyControl Adapter",boiler,211,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"EasyControl Adapter",boiler,211,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"EasyControl Adapter",boiler,211,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"EasyControl Adapter",boiler,211,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"EasyControl Adapter",boiler,211,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"EasyControl Adapter",boiler,211,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"EasyControl Adapter",boiler,211,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"EasyControl Adapter",boiler,211,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"EasyControl Adapter",boiler,211,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"EasyControl Adapter",boiler,211,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"EasyControl Adapter",boiler,211,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"EasyControl Adapter",boiler,211,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"EasyControl Adapter",boiler,211,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"EasyControl Adapter",boiler,211,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"EasyControl Adapter",boiler,211,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"EasyControl Adapter",boiler,211,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"EasyControl Adapter",boiler,211,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"EasyControl Adapter",boiler,211,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"EasyControl Adapter",boiler,211,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"EasyControl Adapter",boiler,211,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"EasyControl Adapter",boiler,211,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"EasyControl Adapter",boiler,211,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"EasyControl Adapter",boiler,211,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"EasyControl Adapter",boiler,211,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"EasyControl Adapter",boiler,211,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"EasyControl Adapter",boiler,211,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"EasyControl Adapter",boiler,211,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"EasyControl Adapter",boiler,211,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"EasyControl Adapter",boiler,211,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"EasyControl Adapter",boiler,211,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"EasyControl Adapter",boiler,211,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"EasyControl Adapter",boiler,211,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"EasyControl Adapter",boiler,211,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"EasyControl Adapter",boiler,211,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"EasyControl Adapter",boiler,211,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,netflowtemp,heat network flow temp,uint16 (>=0<=3199),C,false,sensor.boiler_heat_network_flow_temp,sensor.boiler_netflowtemp,5,0,1/10,276,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatvalve,heating valve,uint8 (>=0<=100),%,false,sensor.boiler_heating_valve,sensor.boiler_heatvalve,5,0,1,277,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.dhwvalve,valve,uint8 (>=0<=100),%,false,sensor.boiler_dhw_valve,sensor.boiler_dhw_dhwvalve,5,9,1,75,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,keepwarmtemp,keep warm temperature,uint8 (>=0<=254),C,true,number.boiler_keep_warm_temperature,number.boiler_keepwarmtemp,5,0,1,278,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,setreturntemp,set temp return,uint8 (>=0<=254),C,true,number.boiler_set_temp_return,number.boiler_setreturntemp,5,0,1,279,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heating,heating,boolean, ,false,binary_sensor.boiler_heating,binary_sensor.boiler_heating,5,0,1,280,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Greenstar HIU, Logamax kompakt WS170",boiler,219,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,reset,reset,cmd [-\|maintenance\|error\|history\|message], ,true,sensor.boiler_reset,sensor.boiler_reset,5,0,1,0,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,chimneysweeper,chimney sweeper,cmd [off\|on], ,true,sensor.boiler_chimney_sweeper,sensor.boiler_chimneysweeper,5,0,1,1,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingoff,force heating off,boolean, ,true,switch.boiler_force_heating_off,switch.boiler_heatingoff,5,0,1,2,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingactive,heating active,boolean, ,false,binary_sensor.boiler_heating_active,binary_sensor.boiler_heatingactive,5,0,1,3,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,tapwateractive,tapwater active,boolean, ,false,binary_sensor.boiler_tapwater_active,binary_sensor.boiler_tapwateractive,5,0,1,4,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,selflowtemp,selected flow temperature,uint8 (>=0<=90),C,true,number.boiler_selected_flow_temperature,number.boiler_selflowtemp,5,0,1,5,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.boiler_heating_pump_modulation,sensor.boiler_heatingpumpmod,5,0,1,6,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.boiler_outside_temperature,sensor.boiler_outdoortemp,5,0,1/10,7,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curflowtemp,current flow temperature,uint16 (>=0<=3199),C,false,sensor.boiler_current_flow_temperature,sensor.boiler_curflowtemp,5,0,1/10,8,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.boiler_return_temperature,sensor.boiler_rettemp,5,0,1/10,9,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,switchtemp,mixing switch temperature,uint16 (>=0<=3199),C,false,sensor.boiler_mixing_switch_temperature,sensor.boiler_switchtemp,5,0,1/10,10,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,syspress,system pressure,uint8 (>=0<=25),bar,false,sensor.boiler_system_pressure,sensor.boiler_syspress,5,0,1/10,11,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boiltemp,actual boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_actual_boiler_temperature,sensor.boiler_boiltemp,5,0,1/10,12,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,headertemp,low loss header,uint16 (>=0<=3199),C,false,sensor.boiler_low_loss_header,sensor.boiler_headertemp,5,0,1/10,13,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,exhausttemp,exhaust temperature,uint16 (>=0<=3199),C,false,sensor.boiler_exhaust_temperature,sensor.boiler_exhausttemp,5,0,1/10,249,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burngas,gas,boolean, ,false,binary_sensor.boiler_gas,binary_sensor.boiler_burngas,5,0,1,250,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burngas2,gas stage 2,boolean, ,false,binary_sensor.boiler_gas_stage_2,binary_sensor.boiler_burngas2,5,0,1,251,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,flamecurr,flame current,uint16 (>=0<=3199),µA,false,sensor.boiler_flame_current,sensor.boiler_flamecurr,5,0,1/10,252,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,fanwork,fan,boolean, ,false,binary_sensor.boiler_fan,binary_sensor.boiler_fanwork,5,0,1,253,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,ignwork,ignition,boolean, ,false,binary_sensor.boiler_ignition,binary_sensor.boiler_ignwork,5,0,1,254,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,oilpreheat,oil preheating,boolean, ,false,binary_sensor.boiler_oil_preheating,binary_sensor.boiler_oilpreheat,5,0,1,255,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminpower,burner min power,uint8 (>=0<=100),%,true,number.boiler_burner_min_power,number.boiler_burnminpower,5,0,1,256,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnmaxpower,burner max power,uint8 (>=0<=254),%,true,number.boiler_burner_max_power,number.boiler_burnmaxpower,5,0,1,257,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnminperiod,burner min period,uint8 (>=0<=120),minutes,true,number.boiler_burner_min_period,number.boiler_burnminperiod,5,0,1,258,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,absburnpow,burner current power (absolute),uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power_(absolute),sensor.boiler_absburnpow,5,0,1,259,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatblock,heating block,uint16 (>=0<=3199),C,false,sensor.boiler_heating_block,sensor.boiler_heatblock,5,0,1/10,260,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhyston,hysteresis on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_on_temperature,number.boiler_boilhyston,5,0,1,261,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boilhystoff,hysteresis off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_off_temperature,number.boiler_boilhystoff,5,0,1,262,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hyston,hysteresis stage 2 on temperature,int8 (>=-20<=0),C,true,number.boiler_hysteresis_stage_2_on_temperature,number.boiler_boil2hyston,5,0,1,263,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,boil2hystoff,hysteresis stage 2 off temperature,int8 (>=0<=20),C,true,number.boiler_hysteresis_stage_2_off_temperature,number.boiler_boil2hystoff,5,0,1,264,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curveon,heatingcurve on,boolean, ,true,switch.boiler_heatingcurve_on,switch.boiler_curveon,5,0,1,265,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curvebase,heatingcurve base,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_base,number.boiler_curvebase,5,0,1,266,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curveend,heatingcurve end,uint8 (>=20<=90),C,true,number.boiler_heatingcurve_end,number.boiler_curveend,5,0,1,267,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,summertemp,summer temperature,uint8 (>=0<=45),C,true,number.boiler_summer_temperature,number.boiler_summertemp,5,0,1,268,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nofrostmode,nofrost mode,boolean, ,true,switch.boiler_nofrost_mode,switch.boiler_nofrostmode,5,0,1,269,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nofrosttemp,nofrost temperature,uint8 (>=0<=10),C,true,number.boiler_nofrost_temperature,number.boiler_nofrosttemp,5,0,1,270,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingactivated,heating activated,boolean, ,true,switch.boiler_heating_activated,switch.boiler_heatingactivated,5,0,1,14,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingtemp,heating temperature,uint8 (>=0<=90),C,true,number.boiler_heating_temperature,number.boiler_heatingtemp,5,0,1,15,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatingpump,heating pump,boolean, ,false,binary_sensor.boiler_heating_pump,binary_sensor.boiler_heatingpump,5,0,1,16,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpmodmax,boiler pump max power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_max_power,number.boiler_pumpmodmax,5,0,1,17,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpmodmin,boiler pump min power,uint8 (>=0<=100),%,true,number.boiler_boiler_pump_min_power,number.boiler_pumpmodmin,5,0,1,18,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpmode,boiler pump mode,enum [proportional\|deltaP-1\|deltaP-2\|deltaP-3\|deltaP-4], ,true,select.boiler_boiler_pump_mode,select.boiler_pumpmode,5,0,1,19,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpcharacter,boiler pump characteristic,enum [proportional\|150mbar\|200mbar\|250mbar\|300mbar\|350mbar\|400mbar], ,true,select.boiler_boiler_pump_characteristic,select.boiler_pumpcharacter,5,0,1,20,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpdelay,pump delay,uint8 (>=0<=60),minutes,true,number.boiler_pump_delay,number.boiler_pumpdelay,5,0,1,21,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pumpontemp,pump logic temperature,uint8 (>=0<=60),C,true,number.boiler_pump_logic_temperature,number.boiler_pumpontemp,5,0,1,22,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,selburnpow,burner selected max power,uint8 (>=0<=254),%,true,number.boiler_burner_selected_max_power,number.boiler_selburnpow,5,0,1,23,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,curburnpow,burner current power,uint8 (>=0<=100),%,false,sensor.boiler_burner_current_power,sensor.boiler_curburnpow,5,0,1,24,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnstarts,burner starts,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts,sensor.boiler_burnstarts,5,0,1,25,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burnworkmin,total burner operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_burner_operating_time,sensor.boiler_burnworkmin,5,0,1,27,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,burn2workmin,burner stage 2 operating time,time (>=0<=16777214),minutes,false,sensor.boiler_burner_stage_2_operating_time,sensor.boiler_burn2workmin,5,0,1,29,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatworkmin,total heat operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_heat_operating_time,sensor.boiler_heatworkmin,5,0,1,31,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,heatstarts,burner starts heating,uint24 (>=0<=16777214), ,false,sensor.boiler_burner_starts_heating,sensor.boiler_heatstarts,5,0,1,33,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,ubauptime,total UBA operating time,time (>=0<=16777214),minutes,false,sensor.boiler_total_UBA_operating_time,sensor.boiler_ubauptime,5,0,1,35,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,lastcode,last error code,string, ,false,sensor.boiler_last_error_code,sensor.boiler_lastcode,5,0,1,37,28 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,servicecode,service code,string, ,false,sensor.boiler_service_code,sensor.boiler_servicecode,5,0,1,65,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,servicecodenumber,service code number,uint16 (>=0<=31999), ,false,sensor.boiler_service_code_number,sensor.boiler_servicecodenumber,5,0,1,67,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenancemessage,maintenance message,string, ,false,sensor.boiler_maintenance_message,sensor.boiler_maintenancemessage,5,0,1,68,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenance,maintenance scheduled,enum [off\|time\|date\|manual], ,true,select.boiler_maintenance_scheduled,select.boiler_maintenance,5,0,1,70,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenancetime,time to next maintenance,uint16 (>=0<=31999),hours,true,number.boiler_time_to_next_maintenance,number.boiler_maintenancetime,5,0,1,71,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,maintenancedate,next maintenance date,string, ,true,sensor.boiler_next_maintenance_date,sensor.boiler_maintenancedate,5,0,1,72,6 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,emergencyops,emergency operation,boolean, ,true,switch.boiler_emergency_operation,switch.boiler_emergencyops,5,0,1,78,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,emergencytemp,emergency temperature,uint8 (>=15<=70),C,true,number.boiler_emergency_temperature,number.boiler_emergencytemp,5,0,1,79,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc0flow,Flow PC0,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC0,sensor.boiler_pc0flow,5,0,1,80,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc1flow,Flow PC1,int16 (>=-31999<=31999),l/h,false,sensor.boiler_Flow_PC1,sensor.boiler_pc1flow,5,0,1,81,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc1on,PC1,boolean, ,false,binary_sensor.boiler_PC1,binary_sensor.boiler_pc1on,5,0,1,82,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,pc1rate,PC1 rate,uint8 (>=0<=100),%,false,sensor.boiler_PC1_rate,sensor.boiler_pc1rate,5,0,1,83,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,meterheat,meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_meter_heating,sensor.boiler_meterheat,5,0,1/10,97,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.meter,meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_meter,sensor.boiler_dhw_meter,5,9,1/10,2,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,gasmeterheat,gas meter heating,uint24 (>=0<=1677721),kWh,false,sensor.boiler_gas_meter_heating,sensor.boiler_gasmeterheat,5,0,1/10,271,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.gasmeter,gas meter,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_gas_meter,sensor.boiler_dhw_gasmeter,5,9,1/10,71,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nrgheat2,energy heating 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_energy_heating_2,sensor.boiler_nrgheat2,5,0,1/10,273,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.nrg2,energy 2,uint24 (>=0<=1677721),kWh,false,sensor.boiler_dhw_energy_2,sensor.boiler_dhw_nrg2,5,9,1/10,73,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.tapactivated,turn on/off,boolean, ,true,switch.boiler_dhw_turn_on/off,switch.boiler_dhw_tapactivated,5,9,1,28,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.settemp,set temperature,uint8 (>=0<=254),C,false,sensor.boiler_dhw_set_temperature,sensor.boiler_dhw_settemp,5,9,1,29,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_temperature,number.boiler_dhw_seltemp,5,9,1,30,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltemplow,selected lower temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_lower_temperature,number.boiler_dhw_seltemplow,5,9,1,31,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.tempecoplus,selected eco+ temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_selected_eco+_temperature,number.boiler_dhw_tempecoplus,5,9,1,32,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltempoff,selected temperature for off,uint8 (>=0<=254),C,false,sensor.boiler_dhw_selected_temperature_for_off,sensor.boiler_dhw_seltempoff,5,9,1,33,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.seltempsingle,single charge temperature,uint8 (>=0<=254),C,true,number.boiler_dhw_single_charge_temperature,number.boiler_dhw_seltempsingle,5,9,1,34,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.solartemp,solar boiler temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_solar_boiler_temperature,sensor.boiler_dhw_solartemp,5,9,1/10,35,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.type,type,enum [off\|flow\|buffered flow\|buffer\|layered buffer], ,false,sensor.boiler_dhw_type,sensor.boiler_dhw_type,5,9,1,36,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.comfort,comfort,enum [hot\|eco\|intelligent], ,true,select.boiler_dhw_comfort,select.boiler_dhw_comfort,5,9,1,37,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.comfort1,comfort mode,enum [high comfort\|eco], ,true,select.boiler_dhw_comfort_mode,select.boiler_dhw_comfort1,5,9,1,38,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=100),C,true,number.boiler_dhw_flow_temperature_offset,number.boiler_dhw_flowtempoffset,5,9,1,39,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.chargeoptimization,charge optimization,boolean, ,true,switch.boiler_dhw_charge_optimization,switch.boiler_dhw_chargeoptimization,5,9,1,40,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.maxpower,max power,uint8 (>=0<=254),%,true,number.boiler_dhw_max_power,number.boiler_dhw_maxpower,5,9,1,41,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.maxtemp,maximum temperature,uint8 (>=0<=80),C,true,number.boiler_dhw_maximum_temperature,number.boiler_dhw_maxtemp,5,9,1,42,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.circpump,circulation pump available,boolean, ,true,switch.boiler_dhw_circulation_pump_available,switch.boiler_dhw_circpump,5,9,1,43,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.chargetype,charging type,enum [chargepump\|3-way valve], ,false,sensor.boiler_dhw_charging_type,sensor.boiler_dhw_chargetype,5,9,1,44,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_on_temperature,number.boiler_dhw_hyston,5,9,1,45,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.boiler_dhw_hysteresis_off_temperature,number.boiler_dhw_hystoff,5,9,1,46,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.disinfectiontemp,disinfection temperature,uint8 (>=60<=80),C,true,number.boiler_dhw_disinfection_temperature,number.boiler_dhw_disinfectiontemp,5,9,1,47,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.boiler_dhw_circulation_pump_mode,select.boiler_dhw_circmode,5,9,1,48,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.circ,circulation active,boolean, ,true,switch.boiler_dhw_circulation_active,switch.boiler_dhw_circ,5,9,1,49,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.curtemp,current intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_intern_temperature,sensor.boiler_dhw_curtemp,5,9,1/10,50,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_current_extern_temperature,sensor.boiler_dhw_curtemp2,5,9,1/10,51,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.curflow,current tap water flow,uint8 (>=0<=25),l/min,false,sensor.boiler_dhw_current_tap_water_flow,sensor.boiler_dhw_curflow,5,9,1/10,52,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_intern_temperature,sensor.boiler_dhw_storagetemp1,5,9,1/10,53,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.storagetemp2,storage extern temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_storage_extern_temperature,sensor.boiler_dhw_storagetemp2,5,9,1/10,54,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.activated,activated,boolean, ,true,switch.boiler_dhw_activated,switch.boiler_dhw_activated,5,9,1,55,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.onetime,one time charging,boolean, ,true,switch.boiler_dhw_one_time_charging,switch.boiler_dhw_onetime,5,9,1,56,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.disinfecting,disinfecting,boolean, ,true,switch.boiler_dhw_disinfecting,switch.boiler_dhw_disinfecting,5,9,1,57,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.charging,charging,boolean, ,false,binary_sensor.boiler_dhw_charging,binary_sensor.boiler_dhw_charging,5,9,1,58,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.recharging,recharging,boolean, ,false,binary_sensor.boiler_dhw_recharging,binary_sensor.boiler_dhw_recharging,5,9,1,59,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.tempok,temperature ok,boolean, ,false,binary_sensor.boiler_dhw_temperature_ok,binary_sensor.boiler_dhw_tempok,5,9,1,60,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.active,active,boolean, ,false,binary_sensor.boiler_dhw_active,binary_sensor.boiler_dhw_active,5,9,1,61,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.3wayvalve,3-way valve active,boolean, ,false,binary_sensor.boiler_dhw_3-way_valve_active,binary_sensor.boiler_dhw_3wayvalve,5,9,1,62,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.chargepump,charge pump,boolean, ,false,binary_sensor.boiler_dhw_charge_pump,binary_sensor.boiler_dhw_chargepump,5,9,1,63,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.mixertemp,mixer temperature,uint16 (>=0<=3199),C,false,sensor.boiler_dhw_mixer_temperature,sensor.boiler_dhw_mixertemp,5,9,1/10,64,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.cylmiddletemp,cylinder middle temperature (TS3),uint16 (>=0<=3199),C,false,sensor.boiler_dhw_cylinder_middle_temperature_(TS3),sensor.boiler_dhw_cylmiddletemp,5,9,1/10,65,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.dhwprio,dhw priority,boolean, ,true,switch.boiler_dhw_dhw_priority,switch.boiler_dhw_dhwprio,5,9,1,66,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.starts,starts,uint24 (>=0<=16777214), ,false,sensor.boiler_dhw_starts,sensor.boiler_dhw_starts,5,9,1,67,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.workm,active time,time (>=0<=16777214),minutes,false,sensor.boiler_dhw_active_time,sensor.boiler_dhw_workm,5,9,1,69,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nompower,nominal Power,uint8 (>=0<=254),kW,true,number.boiler_nominal_Power,number.boiler_nompower,5,0,1,275,1 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.boiler_total_energy,sensor.boiler_nrgtotal,5,0,1/100,85,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,nrgheat,energy heating,uint24 (>=0<=10000000),kWh,true,number.boiler_energy_heating,number.boiler_nrgheat,5,0,1/100,87,2 +"Logamax Plus GB122, Condense 2300, Junkers Cerapur GC2200W",boiler,234,dhw.nrg,energy,uint24 (>=0<=10000000),kWh,true,number.boiler_dhw_energy,number.boiler_dhw_nrg,5,9,1/100,0,2 +"Logamatic TC100, Moduline Easy",thermostat,202,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Logamatic TC100, Moduline Easy",thermostat,202,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Logamatic TC100, Moduline Easy",thermostat,202,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"Logamatic TC100, Moduline Easy",thermostat,202,hc1.seltemp,selected room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/100,0,1 +"Logamatic TC100, Moduline Easy",thermostat,202,hc1.currtemp,current room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/100,1,1 +"Logamatic TC100, Moduline Easy",thermostat,202,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"EasyControl, CT200",thermostat,203,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"EasyControl, CT200",thermostat,203,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"EasyControl, CT200",thermostat,203,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"EasyControl, CT200",thermostat,203,hc1.seltemp,selected room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/100,0,1 +"EasyControl, CT200",thermostat,203,hc1.currtemp,current room temperature,int16 (>=-319<=319),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/100,1,1 +"EasyControl, CT200",thermostat,203,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"UI800, BC400",thermostat,4,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"UI800, BC400",thermostat,4,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"UI800, BC400",thermostat,4,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"UI800, BC400",thermostat,4,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"UI800, BC400",thermostat,4,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 +"UI800, BC400",thermostat,4,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 +"UI800, BC400",thermostat,4,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 +"UI800, BC400",thermostat,4,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"UI800, BC400",thermostat,4,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"UI800, BC400",thermostat,4,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"UI800, BC400",thermostat,4,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 +"UI800, BC400",thermostat,4,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"UI800, BC400",thermostat,4,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"UI800, BC400",thermostat,4,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"UI800, BC400",thermostat,4,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"UI800, BC400",thermostat,4,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"UI800, BC400",thermostat,4,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"UI800, BC400",thermostat,4,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"UI800, BC400",thermostat,4,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 +"UI800, BC400",thermostat,4,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 +"UI800, BC400",thermostat,4,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 +"UI800, BC400",thermostat,4,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 +"UI800, BC400",thermostat,4,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"UI800, BC400",thermostat,4,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"UI800, BC400",thermostat,4,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"UI800, BC400",thermostat,4,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"UI800, BC400",thermostat,4,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"UI800, BC400",thermostat,4,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"UI800, BC400",thermostat,4,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"UI800, BC400",thermostat,4,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 +"UI800, BC400",thermostat,4,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"UI800, BC400",thermostat,4,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"UI800, BC400",thermostat,4,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 +"UI800, BC400",thermostat,4,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"UI800, BC400",thermostat,4,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"UI800, BC400",thermostat,4,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"UI800, BC400",thermostat,4,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 +"UI800, BC400",thermostat,4,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 +"UI800, BC400",thermostat,4,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"UI800, BC400",thermostat,4,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"UI800, BC400",thermostat,4,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"UI800, BC400",thermostat,4,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"UI800, BC400",thermostat,4,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 +"UI800, BC400",thermostat,4,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 +"UI800, BC400",thermostat,4,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"UI800, BC400",thermostat,4,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 +"UI800, BC400",thermostat,4,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 +"UI800, BC400",thermostat,4,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"UI800, BC400",thermostat,4,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"UI800, BC400",thermostat,4,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"UI800, BC400",thermostat,4,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 +"UI800, BC400",thermostat,4,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 +"UI800, BC400",thermostat,4,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"UI800, BC400",thermostat,4,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"UI800, BC400",thermostat,4,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"UI800, BC400",thermostat,4,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"UI800, BC400",thermostat,4,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"UI800, BC400",thermostat,4,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 +"UI800, BC400",thermostat,4,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 +"UI800, BC400",thermostat,4,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 +"UI800, BC400",thermostat,4,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 +"UI800, BC400",thermostat,4,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 +"UI800, BC400",thermostat,4,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 +"UI800, BC400",thermostat,4,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"UI800, BC400",thermostat,4,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"UI800, BC400",thermostat,4,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 +"UI800, BC400",thermostat,4,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 +"UI800, BC400",thermostat,4,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 +"UI800, BC400",thermostat,4,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 +"UI800, BC400",thermostat,4,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 +"UI800, BC400",thermostat,4,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 +"UI800, BC400",thermostat,4,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 +"UI800, BC400",thermostat,4,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 +"UI800, BC400",thermostat,4,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 +"UI800, BC400",thermostat,4,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 +"UI800, BC400",thermostat,4,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 +"UI800, BC400",thermostat,4,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 +"UI800, BC400",thermostat,4,hc1.currsolarinfl,current solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 +"UI800, BC400",thermostat,4,hc1.heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,56,1 +"UI800, BC400",thermostat,4,hc1.pumpopt,pump optimization,boolean, ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,57,1 +"UI800, BC400",thermostat,4,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,58,1 +"UI800, BC400",thermostat,4,hc1.inttime,integral time,uint8 (>=3<=80),minutes,true,number.thermostat_hc1_integral_time,number.thermostat_hc1_inttime,6,1,1,59,1 +"UI800, BC400",thermostat,4,dhw.mode,operating mode,enum [off\|eco+\|eco\|comfort\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"UI800, BC400",thermostat,4,dhw.modetype,mode type,enum [off\|eco\|comfort\|eco+], ,false,sensor.thermostat_dhw_mode_type,sensor.thermostat_dhw_modetype,6,9,1,1,1 +"UI800, BC400",thermostat,4,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,2,1 +"UI800, BC400",thermostat,4,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,3,1 +"UI800, BC400",thermostat,4,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"UI800, BC400",thermostat,4,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,5,1 +"UI800, BC400",thermostat,4,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"UI800, BC400",thermostat,4,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,7,1 +"UI800, BC400",thermostat,4,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"UI800, BC400",thermostat,4,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"UI800, BC400",thermostat,4,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,10,1 +"UI800, BC400",thermostat,4,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,11,1 +"UI800, BC400",thermostat,4,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,12,1 +"CR11",thermostat,10,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"CR11",thermostat,10,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"CR11",thermostat,10,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"CR11",thermostat,10,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"CR11",thermostat,10,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"CR11",thermostat,10,hc1.mode,operating mode,enum [off\|manual], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"CR11",thermostat,10,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"CR11",thermostat,10,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC10",thermostat,65,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC10",thermostat,65,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC10",thermostat,65,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC10",thermostat,65,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC10",thermostat,65,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC10",thermostat,65,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC10",thermostat,65,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC10",thermostat,65,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC10",thermostat,65,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC10",thermostat,65,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"RC10",thermostat,65,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC10",thermostat,65,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC10",thermostat,65,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC10",thermostat,65,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC10",thermostat,65,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC10",thermostat,65,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC10",thermostat,65,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC10",thermostat,65,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC30",thermostat,67,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC30",thermostat,67,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC30",thermostat,67,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC30",thermostat,67,display,display,enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"RC30",thermostat,67,language,language,enum [german\|dutch\|french\|italian], ,false,sensor.thermostat_language,sensor.thermostat_language,6,0,1,66,1 +"RC30",thermostat,67,clockoffset,clock offset,int8 (>=-126<=126),seconds,true,number.thermostat_clock_offset,number.thermostat_clockoffset,6,0,1,67,1 +"RC30",thermostat,67,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"RC30",thermostat,67,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC30",thermostat,67,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 +"RC30",thermostat,67,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 +"RC30",thermostat,67,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"RC30",thermostat,67,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 +"RC30",thermostat,67,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"RC30",thermostat,67,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC30",thermostat,67,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC30",thermostat,67,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC30",thermostat,67,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC30",thermostat,67,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC30",thermostat,67,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"RC30",thermostat,67,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC30",thermostat,67,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"RC30",thermostat,67,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 +"RC30",thermostat,67,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,62,1 +"RC30",thermostat,67,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"RC30",thermostat,67,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC30",thermostat,67,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC30",thermostat,67,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,63,1 +"RC30",thermostat,67,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"RC30",thermostat,67,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"RC30",thermostat,67,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"RC30",thermostat,67,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC30",thermostat,67,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC30",thermostat,67,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,64,1 +"RC30",thermostat,67,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC30",thermostat,67,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"RC30",thermostat,67,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"RC30",thermostat,67,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"RC30",thermostat,67,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,65,13 +"RC30",thermostat,67,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,78,13 +"RC30",thermostat,67,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC30",thermostat,67,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,91,1 +"RC30",thermostat,67,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,92,1 +"RC30",thermostat,67,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC30",thermostat,67,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"RC30",thermostat,67,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"RC30",thermostat,67,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,93,1 +"RC30",thermostat,67,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,94,1 +"RC30",thermostat,67,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"RC30",thermostat,67,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"RC30",thermostat,67,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"RC30",thermostat,67,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,95,8 +"RC30",thermostat,67,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,103,8 +"RC30",thermostat,67,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"RC30",thermostat,67,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"RC30",thermostat,67,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,13,1 +"RC30",thermostat,67,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,14,1 +"RC30",thermostat,67,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"RC30",thermostat,67,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"RC30",thermostat,67,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,15,1 +"RC30",thermostat,67,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,16,1 +"RC30",thermostat,67,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,17,1 +"RC30",thermostat,67,dhw.switchtime,program switchtime,string, ,true,sensor.thermostat_dhw_program_switchtime,sensor.thermostat_dhw_switchtime,6,9,1,18,8 +"RC30",thermostat,67,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,26,8 +"RC30",thermostat,67,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,34,13 +"RC30",thermostat,67,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,47,13 +"RC20, Moduline 300",thermostat,77,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC20, Moduline 300",thermostat,77,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC20, Moduline 300",thermostat,77,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC20, Moduline 300",thermostat,77,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC20, Moduline 300",thermostat,77,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC20, Moduline 300",thermostat,77,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC20, Moduline 300",thermostat,77,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC20, Moduline 300",thermostat,77,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"RC20, Moduline 300",thermostat,77,hc1.offtemp,temperature when mode is off,uint8 (>=0<=127),C,true,number.thermostat_hc1_temperature_when_mode_is_off,number.thermostat_hc1_offtemp,6,1,1/2,111,1 +"RC20, Moduline 300",thermostat,77,hc1.daytemp2,day temperature T2,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T2,number.thermostat_hc1_daytemp2,6,1,1/2,112,1 +"RC20, Moduline 300",thermostat,77,hc1.daytemp3,day temperature T3,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T3,number.thermostat_hc1_daytemp3,6,1,1/2,113,1 +"RC20, Moduline 300",thermostat,77,hc1.daytemp4,day temperature T4,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T4,number.thermostat_hc1_daytemp4,6,1,1/2,114,1 +"RC20, Moduline 300",thermostat,77,hc1.nighttemp,night temperature T1,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature_T1,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC20, Moduline 300",thermostat,77,hc1.switchtime,program switchtime,string, ,true,sensor.thermostat_hc1_program_switchtime,sensor.thermostat_hc1_switchtime,6,1,1,115,8 +"Moduline 400",thermostat,78,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Moduline 400",thermostat,78,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Moduline 400",thermostat,78,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"Moduline 400",thermostat,78,clockoffset,clock offset,int8 (>=-126<=126),seconds,true,number.thermostat_clock_offset,number.thermostat_clockoffset,6,0,1,67,1 +"Moduline 400",thermostat,78,autodst,automatic change daylight saving time,boolean, ,true,switch.thermostat_automatic_change_daylight_saving_time,switch.thermostat_autodst,6,0,1,70,1 +"Moduline 400",thermostat,78,language,language,enum [german\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"Moduline 400",thermostat,78,backlight,key backlight,boolean, ,true,switch.thermostat_key_backlight,switch.thermostat_backlight,6,0,1,71,1 +"Moduline 400",thermostat,78,brightness,screen brightness,int8 (>=-15<=15), ,true,number.thermostat_screen_brightness,number.thermostat_brightness,6,0,1,72,1 +"Moduline 400",thermostat,78,mixingvalves,mixing valves,uint8 (>=0<=2), ,true,number.thermostat_mixing_valves,number.thermostat_mixingvalves,6,0,1,73,1 +"Moduline 400",thermostat,78,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"Moduline 400",thermostat,78,heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_heating_PID,select.thermostat_heatingpid,6,0,1,74,1 +"Moduline 400",thermostat,78,preheating,preheating in the clock program,boolean, ,true,switch.thermostat_preheating_in_the_clock_program,switch.thermostat_preheating,6,0,1,75,1 +"Moduline 400",thermostat,78,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"Moduline 400",thermostat,78,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"Moduline 400",thermostat,78,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"Moduline 400",thermostat,78,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"Moduline 400",thermostat,78,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"Moduline 400",thermostat,78,hc1.pause,pause time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,91,1 +"Moduline 400",thermostat,78,hc1.party,party time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,92,1 +"Moduline 400",thermostat,78,hc1.vacations1,vacation dates 1,string, ,true,sensor.thermostat_hc1_vacation_dates_1,sensor.thermostat_hc1_vacations1,6,1,1,123,11 +"Moduline 400",thermostat,78,hc1.vacations2,vacation dates 2,string, ,true,sensor.thermostat_hc1_vacation_dates_2,sensor.thermostat_hc1_vacations2,6,1,1,134,11 +"Moduline 400",thermostat,78,hc1.vacations3,vacation dates 3,string, ,true,sensor.thermostat_hc1_vacation_dates_3,sensor.thermostat_hc1_vacations3,6,1,1,145,11 +"Moduline 400",thermostat,78,hc1.vacations4,vacation dates 4,string, ,true,sensor.thermostat_hc1_vacation_dates_4,sensor.thermostat_hc1_vacations4,6,1,1,156,11 +"Moduline 400",thermostat,78,hc1.vacations5,vacation dates 5,string, ,true,sensor.thermostat_hc1_vacation_dates_5,sensor.thermostat_hc1_vacations5,6,1,1,167,11 +"Moduline 400",thermostat,78,hc1.vacations6,vacation dates 6,string, ,true,sensor.thermostat_hc1_vacation_dates_6,sensor.thermostat_hc1_vacations6,6,1,1,178,11 +"Moduline 400",thermostat,78,hc1.vacations7,vacation dates 7,string, ,true,sensor.thermostat_hc1_vacation_dates_7,sensor.thermostat_hc1_vacations7,6,1,1,189,11 +"Moduline 400",thermostat,78,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"Moduline 400",thermostat,78,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,95,8 +"Moduline 400",thermostat,78,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"Moduline 400",thermostat,78,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"Moduline 400",thermostat,78,hc1.holidaytemp,holiday temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,62,1 +"Moduline 400",thermostat,78,hc1.nighttemp,night temperature T1,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature_T1,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"Moduline 400",thermostat,78,hc1.daytemp2,day temperature T2,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T2,number.thermostat_hc1_daytemp2,6,1,1/2,112,1 +"Moduline 400",thermostat,78,hc1.daytemp3,day temperature T3,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T3,number.thermostat_hc1_daytemp3,6,1,1/2,113,1 +"Moduline 400",thermostat,78,hc1.daytemp4,day temperature T4,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T4,number.thermostat_hc1_daytemp4,6,1,1/2,114,1 +"Moduline 400",thermostat,78,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"Moduline 400",thermostat,78,hc1.offtemp,temperature when mode is off,uint8 (>=0<=127),C,true,number.thermostat_hc1_temperature_when_mode_is_off,number.thermostat_hc1_offtemp,6,1,1/2,111,1 +"Moduline 400",thermostat,78,dhw.mode,operating mode,enum [on\|off\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"Moduline 400",thermostat,78,dhw.whenmodeoff,when thermostat mode off,boolean, ,true,switch.thermostat_dhw_when_thermostat_mode_off,switch.thermostat_dhw_whenmodeoff,6,9,1,60,1 +"Moduline 400",thermostat,78,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"Moduline 400",thermostat,78,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"Moduline 400",thermostat,78,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,15,1 +"RC10, Moduline 100",thermostat,79,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC10, Moduline 100",thermostat,79,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC10, Moduline 100",thermostat,79,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"RC10, Moduline 100",thermostat,79,heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_heating_PID,select.thermostat_heatingpid,6,0,1,74,1 +"RC10, Moduline 100",thermostat,79,backlight,key backlight,boolean, ,true,switch.thermostat_key_backlight,switch.thermostat_backlight,6,0,1,71,1 +"RC10, Moduline 100",thermostat,79,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC10, Moduline 100",thermostat,79,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC10, Moduline 100",thermostat,79,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC10, Moduline 100",thermostat,79,hc1.mode,operating mode,enum [nofrost\|night\|day], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC10, Moduline 100",thermostat,79,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"RC10, Moduline 100",thermostat,79,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC10, Moduline 100",thermostat,79,hc1.reducehours,duration for nighttemp,uint8 (>=0<=254),hours,true,number.thermostat_hc1_duration_for_nighttemp,number.thermostat_hc1_reducehours,6,1,1,200,1 +"RC10, Moduline 100",thermostat,79,hc1.reduceminutes,remaining time for nightmode,uint16 (>=0<=31999),minutes,false,sensor.thermostat_hc1_remaining_time_for_nightmode,sensor.thermostat_hc1_reduceminutes,6,1,1,201,1 +"RC10, Moduline 100",thermostat,79,dhw.mode,operating mode,enum [on\|off\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"Moduline 200",thermostat,80,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Moduline 200",thermostat,80,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Moduline 200",thermostat,80,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"Moduline 200",thermostat,80,heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_heating_PID,select.thermostat_heatingpid,6,0,1,74,1 +"Moduline 200",thermostat,80,backlight,key backlight,boolean, ,true,switch.thermostat_key_backlight,switch.thermostat_backlight,6,0,1,71,1 +"Moduline 200",thermostat,80,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"Moduline 200",thermostat,80,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"Moduline 200",thermostat,80,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"Moduline 200",thermostat,80,hc1.mode,operating mode,enum [nofrost\|night\|day], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"Moduline 200",thermostat,80,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"Moduline 200",thermostat,80,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"Moduline 200",thermostat,80,hc1.reducehours,duration for nighttemp,uint8 (>=0<=254),hours,true,number.thermostat_hc1_duration_for_nighttemp,number.thermostat_hc1_reducehours,6,1,1,200,1 +"Moduline 200",thermostat,80,hc1.reduceminutes,remaining time for nightmode,uint16 (>=0<=31999),minutes,false,sensor.thermostat_hc1_remaining_time_for_nightmode,sensor.thermostat_hc1_reduceminutes,6,1,1,201,1 +"Moduline 200",thermostat,80,dhw.mode,operating mode,enum [on\|off\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"RC35",thermostat,86,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC35",thermostat,86,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC35",thermostat,86,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC35",thermostat,86,intoffset,internal temperature offset,int8 (>=-5<=5),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"RC35",thermostat,86,minexttemp,minimal external temperature,int8 (>=-30<=0),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC35",thermostat,86,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 +"RC35",thermostat,86,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 +"RC35",thermostat,86,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"RC35",thermostat,86,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 +"RC35",thermostat,86,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"RC35",thermostat,86,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC35",thermostat,86,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC35",thermostat,86,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC35",thermostat,86,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC35",thermostat,86,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC35",thermostat,86,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"RC35",thermostat,86,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC35",thermostat,86,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"RC35",thermostat,86,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 +"RC35",thermostat,86,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,62,1 +"RC35",thermostat,86,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"RC35",thermostat,86,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC35",thermostat,86,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC35",thermostat,86,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,63,1 +"RC35",thermostat,86,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"RC35",thermostat,86,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"RC35",thermostat,86,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"RC35",thermostat,86,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC35",thermostat,86,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC35",thermostat,86,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,64,1 +"RC35",thermostat,86,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC35",thermostat,86,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"RC35",thermostat,86,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"RC35",thermostat,86,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"RC35",thermostat,86,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,65,13 +"RC35",thermostat,86,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,78,13 +"RC35",thermostat,86,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC35",thermostat,86,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,91,1 +"RC35",thermostat,86,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,92,1 +"RC35",thermostat,86,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC35",thermostat,86,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"RC35",thermostat,86,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"RC35",thermostat,86,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,93,1 +"RC35",thermostat,86,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,94,1 +"RC35",thermostat,86,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"RC35",thermostat,86,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"RC35",thermostat,86,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"RC35",thermostat,86,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,95,8 +"RC35",thermostat,86,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,103,8 +"RC35",thermostat,86,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"RC35",thermostat,86,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"RC35",thermostat,86,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,13,1 +"RC35",thermostat,86,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,14,1 +"RC35",thermostat,86,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"RC35",thermostat,86,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"RC35",thermostat,86,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,15,1 +"RC35",thermostat,86,dhw.maxtemp,maximum temperature,uint8 (>=60<=80),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,16,1 +"RC35",thermostat,86,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,17,1 +"RC35",thermostat,86,dhw.switchtime,program switchtime,string, ,true,sensor.thermostat_dhw_program_switchtime,sensor.thermostat_dhw_switchtime,6,9,1,18,8 +"RC35",thermostat,86,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,26,8 +"RC35",thermostat,86,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,34,13 +"RC35",thermostat,86,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,47,13 +"RC10, Moduline 100",thermostat,90,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC10, Moduline 100",thermostat,90,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC10, Moduline 100",thermostat,90,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC10, Moduline 100",thermostat,90,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC10, Moduline 100",thermostat,90,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC10, Moduline 100",thermostat,90,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC10, Moduline 100",thermostat,90,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC10, Moduline 100",thermostat,90,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC10, Moduline 100",thermostat,90,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC10, Moduline 100",thermostat,90,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"RC10, Moduline 100",thermostat,90,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC10, Moduline 100",thermostat,90,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC10, Moduline 100",thermostat,90,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC10, Moduline 100",thermostat,90,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC10, Moduline 100",thermostat,90,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC10, Moduline 100",thermostat,90,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC10, Moduline 100",thermostat,90,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC10, Moduline 100",thermostat,90,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC20RF",thermostat,93,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC20RF",thermostat,93,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC20RF",thermostat,93,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC20RF",thermostat,93,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC20RF",thermostat,93,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC20RF",thermostat,93,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC20RF",thermostat,93,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC20RF",thermostat,93,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"RC20RF",thermostat,93,hc1.offtemp,temperature when mode is off,uint8 (>=0<=127),C,true,number.thermostat_hc1_temperature_when_mode_is_off,number.thermostat_hc1_offtemp,6,1,1/2,111,1 +"RC20RF",thermostat,93,hc1.daytemp2,day temperature T2,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T2,number.thermostat_hc1_daytemp2,6,1,1/2,112,1 +"RC20RF",thermostat,93,hc1.daytemp3,day temperature T3,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T3,number.thermostat_hc1_daytemp3,6,1,1/2,113,1 +"RC20RF",thermostat,93,hc1.daytemp4,day temperature T4,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature_T4,number.thermostat_hc1_daytemp4,6,1,1/2,114,1 +"RC20RF",thermostat,93,hc1.nighttemp,night temperature T1,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature_T1,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC20RF",thermostat,93,hc1.switchtime,program switchtime,string, ,true,sensor.thermostat_hc1_program_switchtime,sensor.thermostat_hc1_switchtime,6,1,1,115,8 +"RFM20 Remote",thermostat,94,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RFM20 Remote",thermostat,94,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RFM20 Remote",thermostat,94,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RFM20 Remote",thermostat,94,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RFM20 Remote",thermostat,94,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RFM20 Remote",thermostat,94,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC25",thermostat,151,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC25",thermostat,151,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC25",thermostat,151,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC25",thermostat,151,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC25",thermostat,151,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC25",thermostat,151,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC25",thermostat,151,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC25",thermostat,151,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC25",thermostat,151,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC25",thermostat,151,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"RC25",thermostat,151,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"RC25",thermostat,151,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC25",thermostat,151,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC25",thermostat,151,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC25",thermostat,151,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC25",thermostat,151,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC25",thermostat,151,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC25",thermostat,151,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC200, CW100, CR120, CR50",thermostat,157,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC200, CW100, CR120, CR50",thermostat,157,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC200, CW100, CR120, CR50",thermostat,157,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC200, CW100, CR120, CR50",thermostat,157,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"RC200, CW100, CR120, CR50",thermostat,157,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 +"RC200, CW100, CR120, CR50",thermostat,157,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 +"RC200, CW100, CR120, CR50",thermostat,157,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 +"RC200, CW100, CR120, CR50",thermostat,157,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"RC200, CW100, CR120, CR50",thermostat,157,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC200, CW100, CR120, CR50",thermostat,157,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"RC200, CW100, CR120, CR50",thermostat,157,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 +"RC200, CW100, CR120, CR50",thermostat,157,vacations,vacation dates,string, ,true,sensor.thermostat_vacation_dates,sensor.thermostat_vacations,6,0,1,76,13 +"RC200, CW100, CR120, CR50",thermostat,157,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"RC200, CW100, CR120, CR50",thermostat,157,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"RC200, CW100, CR120, CR50",thermostat,157,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"RC200, CW100, CR120, CR50",thermostat,157,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"RC200, CW100, CR120, CR50",thermostat,157,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"RC200, CW100, CR120, CR50",thermostat,157,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"RC200, CW100, CR120, CR50",thermostat,157,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"RC200, CW100, CR120, CR50",thermostat,157,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 +"RC200, CW100, CR120, CR50",thermostat,157,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 +"RC200, CW100, CR120, CR50",thermostat,157,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 +"RC200, CW100, CR120, CR50",thermostat,157,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.mode,operating mode,enum [manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.controlmode,control mode,enum [optimized\|simple\|n/a\|room\|power], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.currsolarinfl,current solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,56,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.pumpopt,pump optimization,boolean, ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,57,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,58,1 +"RC200, CW100, CR120, CR50",thermostat,157,hc1.inttime,integral time,uint8 (>=3<=80),minutes,true,number.thermostat_hc1_integral_time,number.thermostat_hc1_inttime,6,1,1,59,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.modetype,mode type,enum [off\|eco\|comfort\|eco+], ,false,sensor.thermostat_dhw_mode_type,sensor.thermostat_dhw_modetype,6,9,1,1,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,2,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,3,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,5,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,7,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,10,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,11,1 +"RC200, CW100, CR120, CR50",thermostat,157,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,12,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.mode,operating mode,enum [manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.currsolarinfl,current solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,56,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.pumpopt,pump optimization,boolean, ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,57,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,58,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,hc1.inttime,integral time,uint8 (>=3<=80),minutes,true,number.thermostat_hc1_integral_time,number.thermostat_hc1_inttime,6,1,1,59,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.mode,operating mode,enum [off\|normal\|comfort\|auto\|own prog], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.modetype,mode type,enum [off\|eco\|comfort\|eco+], ,false,sensor.thermostat_dhw_mode_type,sensor.thermostat_dhw_modetype,6,9,1,1,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,2,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,3,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,5,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,7,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,10,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,11,1 +"RC3*0, Moduline 3000/1010H, CW400, Sense II, HPC410",thermostat,158,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,12,1 +"RC100, CR10, Moduline 1000/1010",thermostat,165,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC100, CR10, Moduline 1000/1010",thermostat,165,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.mode,operating mode,enum [off\|manual], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"RC100, CR10, Moduline 1000/1010",thermostat,165,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"Rego 2000/3000",thermostat,172,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Rego 2000/3000",thermostat,172,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Rego 2000/3000",thermostat,172,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"Rego 2000/3000",thermostat,172,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"Rego 2000/3000",thermostat,172,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 +"Rego 2000/3000",thermostat,172,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 +"Rego 2000/3000",thermostat,172,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 +"Rego 2000/3000",thermostat,172,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"Rego 2000/3000",thermostat,172,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"Rego 2000/3000",thermostat,172,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"Rego 2000/3000",thermostat,172,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 +"Rego 2000/3000",thermostat,172,vacations,vacation dates,string, ,true,sensor.thermostat_vacation_dates,sensor.thermostat_vacations,6,0,1,76,13 +"Rego 2000/3000",thermostat,172,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"Rego 2000/3000",thermostat,172,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"Rego 2000/3000",thermostat,172,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"Rego 2000/3000",thermostat,172,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"Rego 2000/3000",thermostat,172,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"Rego 2000/3000",thermostat,172,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"Rego 2000/3000",thermostat,172,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"Rego 2000/3000",thermostat,172,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 +"Rego 2000/3000",thermostat,172,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 +"Rego 2000/3000",thermostat,172,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 +"Rego 2000/3000",thermostat,172,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 +"Rego 2000/3000",thermostat,172,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"Rego 2000/3000",thermostat,172,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"Rego 2000/3000",thermostat,172,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"Rego 2000/3000",thermostat,172,hc1.mode,operating mode,enum [manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"Rego 2000/3000",thermostat,172,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"Rego 2000/3000",thermostat,172,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"Rego 2000/3000",thermostat,172,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"Rego 2000/3000",thermostat,172,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 +"Rego 2000/3000",thermostat,172,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"Rego 2000/3000",thermostat,172,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"Rego 2000/3000",thermostat,172,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 +"Rego 2000/3000",thermostat,172,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"Rego 2000/3000",thermostat,172,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"Rego 2000/3000",thermostat,172,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"Rego 2000/3000",thermostat,172,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 +"Rego 2000/3000",thermostat,172,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 +"Rego 2000/3000",thermostat,172,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"Rego 2000/3000",thermostat,172,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"Rego 2000/3000",thermostat,172,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"Rego 2000/3000",thermostat,172,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"Rego 2000/3000",thermostat,172,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 +"Rego 2000/3000",thermostat,172,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 +"Rego 2000/3000",thermostat,172,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"Rego 2000/3000",thermostat,172,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 +"Rego 2000/3000",thermostat,172,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 +"Rego 2000/3000",thermostat,172,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"Rego 2000/3000",thermostat,172,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"Rego 2000/3000",thermostat,172,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"Rego 2000/3000",thermostat,172,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 +"Rego 2000/3000",thermostat,172,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 +"Rego 2000/3000",thermostat,172,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"Rego 2000/3000",thermostat,172,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"Rego 2000/3000",thermostat,172,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"Rego 2000/3000",thermostat,172,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"Rego 2000/3000",thermostat,172,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"Rego 2000/3000",thermostat,172,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 +"Rego 2000/3000",thermostat,172,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 +"Rego 2000/3000",thermostat,172,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 +"Rego 2000/3000",thermostat,172,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 +"Rego 2000/3000",thermostat,172,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 +"Rego 2000/3000",thermostat,172,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 +"Rego 2000/3000",thermostat,172,hc1.control,control device,enum [RC310\|RC200\|RC100\|RC100H\|TC100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"Rego 2000/3000",thermostat,172,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"Rego 2000/3000",thermostat,172,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 +"Rego 2000/3000",thermostat,172,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 +"Rego 2000/3000",thermostat,172,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 +"Rego 2000/3000",thermostat,172,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 +"Rego 2000/3000",thermostat,172,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 +"Rego 2000/3000",thermostat,172,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 +"Rego 2000/3000",thermostat,172,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 +"Rego 2000/3000",thermostat,172,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 +"Rego 2000/3000",thermostat,172,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 +"Rego 2000/3000",thermostat,172,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 +"Rego 2000/3000",thermostat,172,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 +"Rego 2000/3000",thermostat,172,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 +"Rego 2000/3000",thermostat,172,hc1.currsolarinfl,current solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 +"Rego 2000/3000",thermostat,172,hc1.heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,56,1 +"Rego 2000/3000",thermostat,172,hc1.pumpopt,pump optimization,boolean, ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,57,1 +"Rego 2000/3000",thermostat,172,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,58,1 +"Rego 2000/3000",thermostat,172,hc1.inttime,integral time,uint8 (>=3<=80),minutes,true,number.thermostat_hc1_integral_time,number.thermostat_hc1_inttime,6,1,1,59,1 +"Rego 2000/3000",thermostat,172,dhw.mode,operating mode,enum [normal\|comfort\|eco+], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"Rego 2000/3000",thermostat,172,dhw.modetype,mode type,enum [off\|eco\|comfort\|eco+], ,false,sensor.thermostat_dhw_mode_type,sensor.thermostat_dhw_modetype,6,9,1,1,1 +"Rego 2000/3000",thermostat,172,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,2,1 +"Rego 2000/3000",thermostat,172,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,3,1 +"Rego 2000/3000",thermostat,172,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"Rego 2000/3000",thermostat,172,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,5,1 +"Rego 2000/3000",thermostat,172,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"Rego 2000/3000",thermostat,172,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,7,1 +"Rego 2000/3000",thermostat,172,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"Rego 2000/3000",thermostat,172,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"Rego 2000/3000",thermostat,172,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,10,1 +"Rego 2000/3000",thermostat,172,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,11,1 +"Rego 2000/3000",thermostat,172,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,12,1 +"Comfort RF",thermostat,215,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Comfort RF",thermostat,215,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Comfort RF",thermostat,215,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"Comfort RF",thermostat,215,hc1.seltemp,selected room temperature,int16 (>=-15999<=15999),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/2,0,1 +"Comfort RF",thermostat,215,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"Comfort RF",thermostat,215,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"Comfort RF",thermostat,215,hc1.mode,operating mode,enum [auto\|off], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 +"Comfort RF",thermostat,215,hc1.modetype,mode type,enum [off\|on], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"Comfort RF",thermostat,215,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"CRF200S",thermostat,216,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"CRF200S",thermostat,216,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"CRF200S",thermostat,216,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"CRF200S",thermostat,216,hc1.seltemp,selected room temperature,int16 (>=-15999<=15999),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/2,0,1 +"CRF200S",thermostat,216,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"CRF200S",thermostat,216,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"CRF200S",thermostat,216,hc1.mode,operating mode,enum [auto\|off], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 +"CRF200S",thermostat,216,hc1.modetype,mode type,enum [off\|on], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"CRF200S",thermostat,216,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"Comfort+2RF",thermostat,246,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Comfort+2RF",thermostat,246,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Comfort+2RF",thermostat,246,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"Comfort+2RF",thermostat,246,hc1.seltemp,selected room temperature,int16 (>=-15999<=15999),C,false,sensor.thermostat_hc1_selected_room_temperature,sensor.thermostat_hc1_seltemp,6,1,1/2,0,1 +"Comfort+2RF",thermostat,246,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"Comfort+2RF",thermostat,246,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"Comfort+2RF",thermostat,246,hc1.mode,operating mode,enum [auto\|off], ,false,sensor.thermostat_hc1_operating_mode,sensor.thermostat_hc1_mode,6,1,1,3,1 +"Comfort+2RF",thermostat,246,hc1.modetype,mode type,enum [off\|on], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"Comfort+2RF",thermostat,246,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,floordry,floor drying,enum [off\|start\|heat\|hold\|cool\|end], ,false,sensor.thermostat_floor_drying,sensor.thermostat_floordry,6,0,1,47,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dampedoutdoortemp,damped outdoor temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1/10,48,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,floordrytemp,floor drying temperature,uint8 (>=0<=254),C,false,sensor.thermostat_floor_drying_temperature,sensor.thermostat_floordrytemp,6,0,1,49,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,solar,solar,boolean, ,true,switch.thermostat_solar,switch.thermostat_solar,6,0,1,53,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,pvenabledhw,enable raise dhw,boolean, ,true,switch.thermostat_enable_raise_dhw,switch.thermostat_pvenabledhw,6,0,1,61,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,pvraiseheat,raise heating with PV,int8 (>=0<=5),K,true,number.thermostat_raise_heating_with_PV,number.thermostat_pvraiseheat,6,0,1,62,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,pvlowercool,lower cooling with PV,int8 (>=-5<=0),K,true,number.thermostat_lower_cooling_with_PV,number.thermostat_pvlowercool,6,0,1,63,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,absent,absent,boolean, ,true,switch.thermostat_absent,switch.thermostat_absent,6,0,1,64,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.mode,operating mode,enum [off\|manual\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.modetype,mode type,enum [eco\|comfort], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.manualtemp,manual temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_manual_temperature,number.thermostat_hc1_manualtemp,6,1,1/2,6,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.comforttemp,comfort temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_comfort_temperature,number.thermostat_hc1_comforttemp,6,1,1/2,7,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.designtemp,design temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.offsettemp,offset temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1,10,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roominfluence,room influence,uint8 (>=0<=254),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roominflfactor,room influence factor,uint8 (>=0<=25), ,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,1/10,14,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.curroominfl,current room influence,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_influence,sensor.thermostat_hc1_curroominfl,6,1,1/10,15,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.nofrostmode,nofrost mode,enum [room\|outdoor\|room outdoor], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.nofrosttemp,nofrost temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.summersetmode,set summer mode,enum [summer\|auto\|winter], ,true,select.thermostat_hc1_set_summer_mode,select.thermostat_hc1_summersetmode,6,1,1,20,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpoperatingmode,heatpump operating mode,enum [off\|auto\|heating\|cooling], ,true,select.thermostat_hc1_heatpump_operating_mode,select.thermostat_hc1_hpoperatingmode,6,1,1,21,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpoperatingstate,heatpump operating state,enum [heating\|off\|cooling], ,false,sensor.thermostat_hc1_heatpump_operating_state,sensor.thermostat_hc1_hpoperatingstate,6,1,1,23,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.vacationmode,vacation mode,boolean, ,false,binary_sensor.thermostat_hc1_vacation_mode,binary_sensor.thermostat_hc1_vacationmode,6,1,1,24,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.controlmode,control mode,enum [weather compensated\|outside basepoint\|n/a\|room\|power\|constant], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.program,program,enum [prog 1\|prog 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.tempautotemp,temporary set temperature automode,int8 (>=-1<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooltemp,cooling temperature,int8 (>=-1<=30),C,true,number.thermostat_hc1_cooling_temperature,number.thermostat_hc1_cooltemp,6,1,1/2,28,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.fastheatup,fast heatup,uint8 (>=0<=100),%,true,number.thermostat_hc1_fast_heatup,number.thermostat_hc1_fastheatup,6,1,1,29,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.reducemode,reduce mode,enum [outdoor\|room\|reduce], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.noreducetemp,no reduce below temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.reducetemp,off/reduce switch temperature,int8 (>=-126<=126),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpcooling,hp cooling,boolean, ,true,switch.thermostat_hc1_hp_cooling,switch.thermostat_hc1_hpcooling,6,1,1,35,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolingon,cooling on,boolean, ,false,binary_sensor.thermostat_hc1_cooling_on,binary_sensor.thermostat_hc1_coolingon,6,1,1,36,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpmode,HP Mode,enum [heating\|cooling\|heating & cooling], ,true,select.thermostat_hc1_HP_Mode,select.thermostat_hc1_hpmode,6,1,1,37,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.dewoffset,dew point offset,uint8 (>=2<=10),K,true,number.thermostat_hc1_dew_point_offset,number.thermostat_hc1_dewoffset,6,1,1,38,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.roomtempdiff,room temp difference,uint8 (>=0<=254),K,true,number.thermostat_hc1_room_temp_difference,number.thermostat_hc1_roomtempdiff,6,1,1,39,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.hpminflowtemp,HP min. flow temp.,uint8 (>=0<=254),C,true,number.thermostat_hc1_HP_min._flow_temp.,number.thermostat_hc1_hpminflowtemp,6,1,1,40,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.control,control device,enum [off\|-\|RC100\|RC100H\|-\|RC120RF\|RC220/RT800\|single], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.remotehum,room humidity from remote,cmd [] (>=-1<=101),%,true,sensor.thermostat_hc1_room_humidity_from_remote,sensor.thermostat_hc1_remotehum,6,1,1,43,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatondelay,heat-on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-on_delay,number.thermostat_hc1_heatondelay,6,1,1,44,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatoffdelay,heat-off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_heat-off_delay,number.thermostat_hc1_heatoffdelay,6,1,1,45,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.instantstart,instant start,uint8 (>=1<=10),K,true,number.thermostat_hc1_instant_start,number.thermostat_hc1_instantstart,6,1,1,46,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boost,boost mode,boolean, ,true,switch.thermostat_hc1_boost_mode,switch.thermostat_hc1_boost,6,1,1,47,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.boosttime,boost time,uint8 (>=0<=254),hours,true,number.thermostat_hc1_boost_time,number.thermostat_hc1_boosttime,6,1,1,48,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolstart,cooling starttemp,uint8 (>=20<=35),C,true,number.thermostat_hc1_cooling_starttemp,number.thermostat_hc1_coolstart,6,1,1,49,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.coolondelay,cooling on delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_on_delay,number.thermostat_hc1_coolondelay,6,1,1,50,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.cooloffdelay,cooling off delay,uint8 (>=1<=48),hours,true,number.thermostat_hc1_cooling_off_delay,number.thermostat_hc1_cooloffdelay,6,1,1,51,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.switchprogmode,switch program mode,enum [level\|absolute], ,true,select.thermostat_hc1_switch_program_mode,select.thermostat_hc1_switchprogmode,6,1,1,52,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.redthreshold,reduction threshold,int8 (>=12<=22),C,true,number.thermostat_hc1_reduction_threshold,number.thermostat_hc1_redthreshold,6,1,1/2,53,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.solarinfl,solar influence,uint8 (>=-5<=4294967295),C,true,number.thermostat_hc1_solar_influence,number.thermostat_hc1_solarinfl,6,1,1,54,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.currsolarinfl,current solar influence,uint8 (>=0<=25),C,false,sensor.thermostat_hc1_current_solar_influence,sensor.thermostat_hc1_currsolarinfl,6,1,1/10,55,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.heatingpid,heating PID,enum [fast\|medium\|slow], ,true,select.thermostat_hc1_heating_PID,select.thermostat_hc1_heatingpid,6,1,1,56,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.pumpopt,pump optimization,boolean, ,true,switch.thermostat_hc1_pump_optimization,switch.thermostat_hc1_pumpopt,6,1,1,57,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.inttimefloor,integral time floor,uint8 (>=160<=320),minutes,true,number.thermostat_hc1_integral_time_floor,number.thermostat_hc1_inttimefloor,6,1,10,58,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,hc1.inttime,integral time,uint8 (>=3<=80),minutes,true,number.thermostat_hc1_integral_time,number.thermostat_hc1_inttime,6,1,1,59,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.mode,operating mode,enum [off\|eco+\|eco\|comfort\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.modetype,mode type,enum [off\|eco\|comfort\|eco+], ,false,sensor.thermostat_dhw_mode_type,sensor.thermostat_dhw_modetype,6,9,1,1,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.settemp,set temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_temperature,number.thermostat_dhw_settemp,6,9,1,2,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.settemplow,set low temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_set_low_temperature,number.thermostat_dhw_settemplow,6,9,1,3,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.chargeduration,charge duration,uint8 (>=0<=3810),minutes,true,number.thermostat_dhw_charge_duration,number.thermostat_dhw_chargeduration,6,9,15,5,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.extra,extra,boolean, ,false,binary_sensor.thermostat_dhw_extra,binary_sensor.thermostat_dhw_extra,6,9,1,7,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.disinfecttime,disinfection time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_disinfection_time,number.thermostat_dhw_disinfecttime,6,9,15,10,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.dailyheating,daily heating,boolean, ,true,switch.thermostat_dhw_daily_heating,switch.thermostat_dhw_dailyheating,6,9,1,11,1 +"Rego 3000, UI800, Logamatic BC400",thermostat,253,dhw.dailyheattime,daily heating time,uint8 (>=0<=1431),minutes,true,number.thermostat_dhw_daily_heating_time,number.thermostat_dhw_dailyheattime,6,9,15,12,1 +"ES72, RC20",thermostat,66,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"ES72, RC20",thermostat,66,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"ES72, RC20",thermostat,66,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"ES72, RC20",thermostat,66,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"ES72, RC20",thermostat,66,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"ES72, RC20",thermostat,66,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"ES72, RC20",thermostat,66,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"ES72, RC20",thermostat,66,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"ES72, RC20",thermostat,66,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"ES72, RC20",thermostat,66,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"ES72, RC20",thermostat,66,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"ES72, RC20",thermostat,66,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"ES72, RC20",thermostat,66,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"ES72, RC20",thermostat,66,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"ES72, RC20",thermostat,66,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"ES72, RC20",thermostat,66,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"ES72, RC20",thermostat,66,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"ES72, RC20",thermostat,66,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"ES73",thermostat,76,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"ES73",thermostat,76,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"ES73",thermostat,76,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"ES73",thermostat,76,display,display,enum [internal temperature\|internal setpoint\|external temperature\|burner temperature\|dhw temperature\|functioning mode\|time\|date\|smoke temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"ES73",thermostat,76,language,language,enum [german\|dutch\|french\|italian], ,false,sensor.thermostat_language,sensor.thermostat_language,6,0,1,66,1 +"ES73",thermostat,76,clockoffset,clock offset,int8 (>=-126<=126),seconds,true,number.thermostat_clock_offset,number.thermostat_clockoffset,6,0,1,67,1 +"ES73",thermostat,76,intoffset,internal temperature offset,int8 (>=-12<=12),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"ES73",thermostat,76,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"ES73",thermostat,76,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 +"ES73",thermostat,76,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 +"ES73",thermostat,76,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"ES73",thermostat,76,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 +"ES73",thermostat,76,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"ES73",thermostat,76,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"ES73",thermostat,76,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"ES73",thermostat,76,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"ES73",thermostat,76,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"ES73",thermostat,76,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"ES73",thermostat,76,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"ES73",thermostat,76,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"ES73",thermostat,76,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"ES73",thermostat,76,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 +"ES73",thermostat,76,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,62,1 +"ES73",thermostat,76,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"ES73",thermostat,76,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"ES73",thermostat,76,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"ES73",thermostat,76,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,63,1 +"ES73",thermostat,76,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"ES73",thermostat,76,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"ES73",thermostat,76,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"ES73",thermostat,76,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"ES73",thermostat,76,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"ES73",thermostat,76,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,64,1 +"ES73",thermostat,76,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"ES73",thermostat,76,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"ES73",thermostat,76,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"ES73",thermostat,76,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"ES73",thermostat,76,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,65,13 +"ES73",thermostat,76,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,78,13 +"ES73",thermostat,76,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"ES73",thermostat,76,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,91,1 +"ES73",thermostat,76,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,92,1 +"ES73",thermostat,76,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"ES73",thermostat,76,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"ES73",thermostat,76,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"ES73",thermostat,76,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,93,1 +"ES73",thermostat,76,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,94,1 +"ES73",thermostat,76,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"ES73",thermostat,76,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"ES73",thermostat,76,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"ES73",thermostat,76,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,95,8 +"ES73",thermostat,76,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,103,8 +"ES73",thermostat,76,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"ES73",thermostat,76,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"ES73",thermostat,76,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,13,1 +"ES73",thermostat,76,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,14,1 +"ES73",thermostat,76,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"ES73",thermostat,76,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"ES73",thermostat,76,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,15,1 +"ES73",thermostat,76,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,16,1 +"ES73",thermostat,76,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,17,1 +"ES73",thermostat,76,dhw.switchtime,program switchtime,string, ,true,sensor.thermostat_dhw_program_switchtime,sensor.thermostat_dhw_switchtime,6,9,1,18,8 +"ES73",thermostat,76,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,26,8 +"ES73",thermostat,76,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,34,13 +"ES73",thermostat,76,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,47,13 +"ES72, RC20",thermostat,113,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"ES72, RC20",thermostat,113,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"ES72, RC20",thermostat,113,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"ES72, RC20",thermostat,113,minexttemp,minimal external temperature,int8 (>=-126<=126),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"ES72, RC20",thermostat,113,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"ES72, RC20",thermostat,113,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"ES72, RC20",thermostat,113,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"ES72, RC20",thermostat,113,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"ES72, RC20",thermostat,113,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"ES72, RC20",thermostat,113,hc1.daytemp,day temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"ES72, RC20",thermostat,113,hc1.nighttemp,night temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"ES72, RC20",thermostat,113,hc1.program,program,enum [family\|morning\|evening\|am\|pm\|midday\|singles\|seniors], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"ES72, RC20",thermostat,113,hc1.minflowtemp,min flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"ES72, RC20",thermostat,113,hc1.maxflowtemp,max flow temperature,uint8 (>=0<=254),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"ES72, RC20",thermostat,113,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=127),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"ES72, RC20",thermostat,113,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"ES72, RC20",thermostat,113,hc1.summertemp,summer temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"ES72, RC20",thermostat,113,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"ES79",thermostat,156,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"ES79",thermostat,156,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"ES79",thermostat,156,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"ES79",thermostat,156,intoffset,internal temperature offset,int8 (>=-5<=5),C,true,number.thermostat_internal_temperature_offset,number.thermostat_intoffset,6,0,1/10,46,1 +"ES79",thermostat,156,minexttemp,minimal external temperature,int8 (>=-30<=0),C,true,number.thermostat_minimal_external_temperature,number.thermostat_minexttemp,6,0,1,51,1 +"ES79",thermostat,156,inttemp1,temperature sensor 1,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_1,sensor.thermostat_inttemp1,6,0,1/10,68,1 +"ES79",thermostat,156,inttemp2,temperature sensor 2,int16 (>=-3199<=3199),C,false,sensor.thermostat_temperature_sensor_2,sensor.thermostat_inttemp2,6,0,1/10,69,1 +"ES79",thermostat,156,damping,damping outdoor temperature,boolean, ,true,switch.thermostat_damping_outdoor_temperature,switch.thermostat_damping,6,0,1,52,1 +"ES79",thermostat,156,dampedoutdoortemp,damped outdoor temperature,int8 (>=-126<=126),C,false,sensor.thermostat_damped_outdoor_temperature,sensor.thermostat_dampedoutdoortemp,6,0,1,48,1 +"ES79",thermostat,156,building,building type,enum [light\|medium\|heavy], ,true,select.thermostat_building_type,select.thermostat_building,6,0,1,50,1 +"ES79",thermostat,156,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"ES79",thermostat,156,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"ES79",thermostat,156,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"ES79",thermostat,156,hc1.mode,operating mode,enum [night\|day\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"ES79",thermostat,156,hc1.modetype,mode type,enum [night\|day], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"ES79",thermostat,156,hc1.daytemp,day temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_day_temperature,number.thermostat_hc1_daytemp,6,1,1/2,60,1 +"ES79",thermostat,156,hc1.nighttemp,night temperature,uint8 (>=10<=30),C,true,number.thermostat_hc1_night_temperature,number.thermostat_hc1_nighttemp,6,1,1/2,61,1 +"ES79",thermostat,156,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"ES79",thermostat,156,hc1.offsettemp,offset temperature,int8 (>=-5<=5),C,true,number.thermostat_hc1_offset_temperature,number.thermostat_hc1_offsettemp,6,1,1/2,10,1 +"ES79",thermostat,156,hc1.holidaytemp,holiday temperature,uint8 (>=5<=30),C,true,number.thermostat_hc1_holiday_temperature,number.thermostat_hc1_holidaytemp,6,1,1/2,62,1 +"ES79",thermostat,156,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"ES79",thermostat,156,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1,8,1 +"ES79",thermostat,156,hc1.summermode,summer mode,enum [winter\|summer], ,false,sensor.thermostat_hc1_summer_mode,sensor.thermostat_hc1_summermode,6,1,1,22,1 +"ES79",thermostat,156,hc1.holidaymode,holiday mode,boolean, ,false,binary_sensor.thermostat_hc1_holiday_mode,binary_sensor.thermostat_hc1_holidaymode,6,1,1,63,1 +"ES79",thermostat,156,hc1.nofrosttemp,nofrost temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1,17,1 +"ES79",thermostat,156,hc1.nofrostmode,nofrost mode,enum [off\|outdoor\|room], ,true,select.thermostat_hc1_nofrost_mode,select.thermostat_hc1_nofrostmode,6,1,1,16,1 +"ES79",thermostat,156,hc1.roominfluence,room influence,uint8 (>=0<=10),C,true,number.thermostat_hc1_room_influence,number.thermostat_hc1_roominfluence,6,1,1,13,1 +"ES79",thermostat,156,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"ES79",thermostat,156,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"ES79",thermostat,156,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),C,true,number.thermostat_hc1_flow_temperature_offset_for_mixer,number.thermostat_hc1_flowtempoffset,6,1,1,64,1 +"ES79",thermostat,156,hc1.heatingtype,heating type,enum [off\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"ES79",thermostat,156,hc1.reducemode,reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_reduce_mode,select.thermostat_hc1_reducemode,6,1,1,31,1 +"ES79",thermostat,156,hc1.controlmode,control mode,enum [outdoor\|room], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"ES79",thermostat,156,hc1.control,control device,enum [off\|RC20\|RC3x], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"ES79",thermostat,156,hc1.holidays,holiday dates,string, ,true,sensor.thermostat_hc1_holiday_dates,sensor.thermostat_hc1_holidays,6,1,1,65,13 +"ES79",thermostat,156,hc1.vacations,vacation dates,string, ,true,sensor.thermostat_hc1_vacation_dates,sensor.thermostat_hc1_vacations,6,1,1,78,13 +"ES79",thermostat,156,hc1.program,program,enum [own 1\|family\|morning\|evening\|am\|pm\|midday\|singles\|seniors\|new\|own 2], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"ES79",thermostat,156,hc1.pause,pause time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_pause_time,number.thermostat_hc1_pause,6,1,1,91,1 +"ES79",thermostat,156,hc1.party,party time,uint8 (>=0<=99),hours,true,number.thermostat_hc1_party_time,number.thermostat_hc1_party,6,1,1,92,1 +"ES79",thermostat,156,hc1.tempautotemp,temporary set temperature automode,uint8 (>=0<=30),C,true,number.thermostat_hc1_temporary_set_temperature_automode,number.thermostat_hc1_tempautotemp,6,1,1/2,27,1 +"ES79",thermostat,156,hc1.noreducetemp,no reduce below temperature,int8 (>=-31<=10),C,true,number.thermostat_hc1_no_reduce_below_temperature,number.thermostat_hc1_noreducetemp,6,1,1,32,1 +"ES79",thermostat,156,hc1.reducetemp,off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_off/reduce_switch_temperature,number.thermostat_hc1_reducetemp,6,1,1,33,1 +"ES79",thermostat,156,hc1.vacreducetemp,vacations off/reduce switch temperature,int8 (>=-20<=10),C,true,number.thermostat_hc1_vacations_off/reduce_switch_temperature,number.thermostat_hc1_vacreducetemp,6,1,1,93,1 +"ES79",thermostat,156,hc1.vacreducemode,vacations reduce mode,enum [nofrost\|reduce\|room\|outdoor], ,true,select.thermostat_hc1_vacations_reduce_mode,select.thermostat_hc1_vacreducemode,6,1,1,94,1 +"ES79",thermostat,156,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"ES79",thermostat,156,hc1.dhwprio,dhw priority,boolean, ,true,switch.thermostat_hc1_dhw_priority,switch.thermostat_hc1_dhwprio,6,1,1,34,1 +"ES79",thermostat,156,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"ES79",thermostat,156,hc1.switchtime1,own1 program switchtime,string, ,true,sensor.thermostat_hc1_own1_program_switchtime,sensor.thermostat_hc1_switchtime1,6,1,1,95,8 +"ES79",thermostat,156,hc1.switchtime2,own2 program switchtime,string, ,true,sensor.thermostat_hc1_own2_program_switchtime,sensor.thermostat_hc1_switchtime2,6,1,1,103,8 +"ES79",thermostat,156,dhw.mode,operating mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_operating_mode,select.thermostat_dhw_mode,6,9,1,0,1 +"ES79",thermostat,156,dhw.circmode,circulation pump mode,enum [off\|on\|auto], ,true,select.thermostat_dhw_circulation_pump_mode,select.thermostat_dhw_circmode,6,9,1,4,1 +"ES79",thermostat,156,dhw.progmode,program,enum [std prog\|own prog], ,true,select.thermostat_dhw_program,select.thermostat_dhw_progmode,6,9,1,13,1 +"ES79",thermostat,156,dhw.circprog,circulation program,enum [std prog\|own prog], ,true,select.thermostat_dhw_circulation_program,select.thermostat_dhw_circprog,6,9,1,14,1 +"ES79",thermostat,156,dhw.disinfecting,disinfecting,boolean, ,true,switch.thermostat_dhw_disinfecting,switch.thermostat_dhw_disinfecting,6,9,1,8,1 +"ES79",thermostat,156,dhw.disinfectday,disinfection day,enum [mo\|tu\|we\|th\|fr\|sa\|su\|all], ,true,select.thermostat_dhw_disinfection_day,select.thermostat_dhw_disinfectday,6,9,1,9,1 +"ES79",thermostat,156,dhw.disinfecthour,disinfection hour,uint8 (>=0<=23), ,true,number.thermostat_dhw_disinfection_hour,number.thermostat_dhw_disinfecthour,6,9,1,15,1 +"ES79",thermostat,156,dhw.maxtemp,maximum temperature,uint8 (>=60<=80),C,true,number.thermostat_dhw_maximum_temperature,number.thermostat_dhw_maxtemp,6,9,1,16,1 +"ES79",thermostat,156,dhw.onetimekey,one time key function,boolean, ,true,switch.thermostat_dhw_one_time_key_function,switch.thermostat_dhw_onetimekey,6,9,1,17,1 +"ES79",thermostat,156,dhw.switchtime,program switchtime,string, ,true,sensor.thermostat_dhw_program_switchtime,sensor.thermostat_dhw_switchtime,6,9,1,18,8 +"ES79",thermostat,156,dhw.circswitchtime,circulation program switchtime,string, ,true,sensor.thermostat_dhw_circulation_program_switchtime,sensor.thermostat_dhw_circswitchtime,6,9,1,26,8 +"ES79",thermostat,156,dhw.holidays,holiday dates,string, ,true,sensor.thermostat_dhw_holiday_dates,sensor.thermostat_dhw_holidays,6,9,1,34,13 +"ES79",thermostat,156,dhw.vacations,vacation dates,string, ,true,sensor.thermostat_dhw_vacation_dates,sensor.thermostat_dhw_vacations,6,9,1,47,13 +"FW100",thermostat,105,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FW100",thermostat,105,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FW100",thermostat,105,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FW100",thermostat,105,display,display,enum [dhw temperature\|date\|external temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"FW100",thermostat,105,language,language,enum [german\|italian\|french\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"FW100",thermostat,105,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FW100",thermostat,105,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FW100",thermostat,105,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FW100",thermostat,105,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FW100",thermostat,105,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FW100",thermostat,105,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FW100",thermostat,105,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FW100",thermostat,105,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FW100",thermostat,105,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FW100",thermostat,105,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FW100",thermostat,105,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FW100",thermostat,105,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FW100",thermostat,105,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FW100",thermostat,105,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FW100",thermostat,105,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FW100",thermostat,105,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FW100",thermostat,105,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FW100",thermostat,105,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FW100",thermostat,105,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FW100",thermostat,105,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FW100",thermostat,105,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FW100",thermostat,105,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FW100",thermostat,105,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FW100",thermostat,105,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FW100",thermostat,105,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FW100",thermostat,105,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FW100",thermostat,105,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FW100",thermostat,105,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FW100",thermostat,105,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FW100",thermostat,105,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FW100",thermostat,105,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FW100",thermostat,105,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FW200",thermostat,106,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FW200",thermostat,106,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FW200",thermostat,106,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FW200",thermostat,106,display,display,enum [dhw temperature\|date\|external temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"FW200",thermostat,106,language,language,enum [german\|italian\|french\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"FW200",thermostat,106,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FW200",thermostat,106,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FW200",thermostat,106,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FW200",thermostat,106,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FW200",thermostat,106,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FW200",thermostat,106,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FW200",thermostat,106,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FW200",thermostat,106,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FW200",thermostat,106,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FW200",thermostat,106,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FW200",thermostat,106,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FW200",thermostat,106,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FW200",thermostat,106,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FW200",thermostat,106,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FW200",thermostat,106,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FW200",thermostat,106,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FW200",thermostat,106,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FW200",thermostat,106,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FW200",thermostat,106,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FW200",thermostat,106,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FW200",thermostat,106,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FW200",thermostat,106,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FW200",thermostat,106,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FW200",thermostat,106,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FW200",thermostat,106,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FW200",thermostat,106,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FW200",thermostat,106,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FW200",thermostat,106,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FW200",thermostat,106,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FW200",thermostat,106,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FW200",thermostat,106,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FW200",thermostat,106,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FR100",thermostat,107,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FR100",thermostat,107,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FR100",thermostat,107,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FR100",thermostat,107,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FR100",thermostat,107,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FR100",thermostat,107,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FR100",thermostat,107,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FR100",thermostat,107,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FR100",thermostat,107,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FR100",thermostat,107,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FR100",thermostat,107,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FR100",thermostat,107,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FR100",thermostat,107,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FR100",thermostat,107,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FR100",thermostat,107,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FR100",thermostat,107,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FR100",thermostat,107,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FR100",thermostat,107,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FR100",thermostat,107,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FR100",thermostat,107,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FR100",thermostat,107,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FR100",thermostat,107,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FR100",thermostat,107,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FR100",thermostat,107,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FR100",thermostat,107,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FR100",thermostat,107,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FR100",thermostat,107,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FR100",thermostat,107,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FR100",thermostat,107,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FR100",thermostat,107,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FR100",thermostat,107,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FR100",thermostat,107,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FR100",thermostat,107,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FR100",thermostat,107,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FR100",thermostat,107,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FR110",thermostat,108,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FR110",thermostat,108,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FR110",thermostat,108,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FR110",thermostat,108,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FR110",thermostat,108,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FR110",thermostat,108,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FR110",thermostat,108,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FR110",thermostat,108,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FR110",thermostat,108,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FR110",thermostat,108,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FR110",thermostat,108,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FR110",thermostat,108,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FR110",thermostat,108,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FR110",thermostat,108,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FR110",thermostat,108,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FR110",thermostat,108,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FR110",thermostat,108,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FR110",thermostat,108,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FR110",thermostat,108,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FR110",thermostat,108,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FR110",thermostat,108,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FR110",thermostat,108,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FR110",thermostat,108,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FR110",thermostat,108,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FR110",thermostat,108,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FR110",thermostat,108,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FR110",thermostat,108,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FR110",thermostat,108,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FR110",thermostat,108,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FR110",thermostat,108,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FR110",thermostat,108,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FR110",thermostat,108,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FR110",thermostat,108,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FR110",thermostat,108,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FR110",thermostat,108,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FB10",thermostat,109,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FB10",thermostat,109,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FB10",thermostat,109,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FB10",thermostat,109,display,display,enum [dhw temperature\|date\|external temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"FB10",thermostat,109,language,language,enum [german\|italian\|french\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"FB10",thermostat,109,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FB10",thermostat,109,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FB10",thermostat,109,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FB10",thermostat,109,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FB10",thermostat,109,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FB10",thermostat,109,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FB10",thermostat,109,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FB10",thermostat,109,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FB10",thermostat,109,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FB10",thermostat,109,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FB10",thermostat,109,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FB10",thermostat,109,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FB10",thermostat,109,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FB10",thermostat,109,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FB10",thermostat,109,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FB10",thermostat,109,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FB10",thermostat,109,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FB10",thermostat,109,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FB10",thermostat,109,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FB10",thermostat,109,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FB10",thermostat,109,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FB10",thermostat,109,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FB10",thermostat,109,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FB10",thermostat,109,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FB10",thermostat,109,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FB10",thermostat,109,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FB10",thermostat,109,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FB10",thermostat,109,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FB10",thermostat,109,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FB10",thermostat,109,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FB10",thermostat,109,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FB10",thermostat,109,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FB100",thermostat,110,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FB100",thermostat,110,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FB100",thermostat,110,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FB100",thermostat,110,display,display,enum [dhw temperature\|date\|external temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"FB100",thermostat,110,language,language,enum [german\|italian\|french\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"FB100",thermostat,110,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FB100",thermostat,110,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FB100",thermostat,110,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FB100",thermostat,110,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FB100",thermostat,110,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FB100",thermostat,110,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FB100",thermostat,110,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FB100",thermostat,110,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FB100",thermostat,110,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FB100",thermostat,110,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FB100",thermostat,110,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FB100",thermostat,110,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FB100",thermostat,110,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FB100",thermostat,110,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FB100",thermostat,110,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FB100",thermostat,110,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FB100",thermostat,110,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FB100",thermostat,110,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FB100",thermostat,110,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FB100",thermostat,110,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FB100",thermostat,110,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FB100",thermostat,110,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FB100",thermostat,110,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FB100",thermostat,110,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FB100",thermostat,110,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FB100",thermostat,110,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FB100",thermostat,110,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FB100",thermostat,110,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FB100",thermostat,110,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FB100",thermostat,110,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FB100",thermostat,110,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FB100",thermostat,110,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FR10",thermostat,111,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FR10",thermostat,111,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FR10",thermostat,111,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FR10",thermostat,111,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FR10",thermostat,111,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FR10",thermostat,111,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FR10",thermostat,111,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FR10",thermostat,111,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FR10",thermostat,111,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FR10",thermostat,111,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FR10",thermostat,111,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FR10",thermostat,111,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FR10",thermostat,111,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FR10",thermostat,111,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FR10",thermostat,111,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FR10",thermostat,111,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FR10",thermostat,111,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FR10",thermostat,111,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FR10",thermostat,111,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FR10",thermostat,111,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FR10",thermostat,111,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FR10",thermostat,111,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FR10",thermostat,111,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FR10",thermostat,111,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FR10",thermostat,111,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FR10",thermostat,111,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FR10",thermostat,111,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FR10",thermostat,111,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FR10",thermostat,111,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FR10",thermostat,111,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FR10",thermostat,111,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FR10",thermostat,111,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FR10",thermostat,111,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FR10",thermostat,111,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FR10",thermostat,111,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FW500",thermostat,116,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FW500",thermostat,116,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FW500",thermostat,116,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FW500",thermostat,116,display,display,enum [dhw temperature\|date\|external temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"FW500",thermostat,116,language,language,enum [german\|italian\|french\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"FW500",thermostat,116,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FW500",thermostat,116,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FW500",thermostat,116,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FW500",thermostat,116,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FW500",thermostat,116,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FW500",thermostat,116,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FW500",thermostat,116,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FW500",thermostat,116,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FW500",thermostat,116,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FW500",thermostat,116,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FW500",thermostat,116,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FW500",thermostat,116,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FW500",thermostat,116,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FW500",thermostat,116,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FW500",thermostat,116,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FW500",thermostat,116,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FW500",thermostat,116,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FW500",thermostat,116,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FW500",thermostat,116,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FW500",thermostat,116,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FW500",thermostat,116,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FW500",thermostat,116,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FW500",thermostat,116,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FW500",thermostat,116,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FW500",thermostat,116,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FW500",thermostat,116,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FW500",thermostat,116,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FW500",thermostat,116,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FW500",thermostat,116,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FW500",thermostat,116,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FW500",thermostat,116,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FW500",thermostat,116,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FR50",thermostat,147,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FR50",thermostat,147,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FR50",thermostat,147,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FR50",thermostat,147,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FR50",thermostat,147,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FR50",thermostat,147,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FR50",thermostat,147,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FR50",thermostat,147,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FR50",thermostat,147,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FR50",thermostat,147,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FR50",thermostat,147,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FR50",thermostat,147,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FR50",thermostat,147,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FR50",thermostat,147,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FR50",thermostat,147,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FR50",thermostat,147,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FR50",thermostat,147,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FR50",thermostat,147,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FR50",thermostat,147,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FR50",thermostat,147,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FR50",thermostat,147,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FR50",thermostat,147,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FR50",thermostat,147,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FR50",thermostat,147,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FR50",thermostat,147,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FR50",thermostat,147,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FR50",thermostat,147,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FR50",thermostat,147,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FR50",thermostat,147,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FR50",thermostat,147,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FR50",thermostat,147,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FR50",thermostat,147,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FR50",thermostat,147,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FR50",thermostat,147,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FR50",thermostat,147,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FR120",thermostat,191,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FR120",thermostat,191,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FR120",thermostat,191,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FR120",thermostat,191,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FR120",thermostat,191,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FR120",thermostat,191,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FR120",thermostat,191,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FR120",thermostat,191,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FR120",thermostat,191,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FR120",thermostat,191,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FR120",thermostat,191,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FR120",thermostat,191,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FR120",thermostat,191,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FR120",thermostat,191,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FR120",thermostat,191,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FR120",thermostat,191,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FR120",thermostat,191,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FR120",thermostat,191,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FR120",thermostat,191,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FR120",thermostat,191,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FR120",thermostat,191,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FR120",thermostat,191,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FR120",thermostat,191,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FR120",thermostat,191,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FR120",thermostat,191,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FR120",thermostat,191,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FR120",thermostat,191,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FR120",thermostat,191,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FR120",thermostat,191,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FR120",thermostat,191,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FR120",thermostat,191,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FR120",thermostat,191,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FR120",thermostat,191,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FR120",thermostat,191,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FR120",thermostat,191,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"FW120",thermostat,192,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"FW120",thermostat,192,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"FW120",thermostat,192,datetime,date/time,string, ,true,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"FW120",thermostat,192,display,display,enum [dhw temperature\|date\|external temperature], ,true,select.thermostat_display,select.thermostat_display,6,0,1,65,1 +"FW120",thermostat,192,language,language,enum [german\|italian\|french\|dutch], ,true,select.thermostat_language,select.thermostat_language,6,0,1,66,1 +"FW120",thermostat,192,hybridstrategy,hybrid control strategy,enum [co2 optimized\|cost optimized\|outside temp switched\|co2 cost mix], ,true,select.thermostat_hybrid_control_strategy,select.thermostat_hybridstrategy,6,0,1,54,1 +"FW120",thermostat,192,switchovertemp,outside switchover temperature,int8 (>=-20<=20),C,true,number.thermostat_outside_switchover_temperature,number.thermostat_switchovertemp,6,0,1,55,1 +"FW120",thermostat,192,energycostratio,energy cost ratio,uint8 (>=0<=20), ,true,number.thermostat_energy_cost_ratio,number.thermostat_energycostratio,6,0,1/10,56,1 +"FW120",thermostat,192,fossilefactor,fossile energy factor,uint8 (>=0<=5), ,true,number.thermostat_fossile_energy_factor,number.thermostat_fossilefactor,6,0,1/10,57,1 +"FW120",thermostat,192,electricfactor,electric energy factor,uint8 (>=0<=5), ,true,number.thermostat_electric_energy_factor,number.thermostat_electricfactor,6,0,1/10,58,1 +"FW120",thermostat,192,delayboiler,delay boiler support,uint8 (>=5<=120),minutes,true,number.thermostat_delay_boiler_support,number.thermostat_delayboiler,6,0,1,59,1 +"FW120",thermostat,192,tempdiffboiler,temp diff boiler support,uint8 (>=1<=99),C,true,number.thermostat_temp_diff_boiler_support,number.thermostat_tempdiffboiler,6,0,1,60,1 +"FW120",thermostat,192,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/10,0,1 +"FW120",thermostat,192,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"FW120",thermostat,192,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"FW120",thermostat,192,hc1.mode,operating mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_operating_mode,select.thermostat_hc1_mode,6,1,1,3,1 +"FW120",thermostat,192,hc1.modetype,mode type,enum [nofrost\|eco\|heat], ,false,sensor.thermostat_hc1_mode_type,sensor.thermostat_hc1_modetype,6,1,1,4,1 +"FW120",thermostat,192,hc1.heattemp,heat temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_heat_temperature,number.thermostat_hc1_heattemp,6,1,1/2,202,1 +"FW120",thermostat,192,hc1.ecotemp,eco temperature,uint8 (>=0<=127),C,true,number.thermostat_hc1_eco_temperature,number.thermostat_hc1_ecotemp,6,1,1/2,5,1 +"FW120",thermostat,192,hc1.nofrosttemp,nofrost temperature,int8 (>=-63<=63),C,true,number.thermostat_hc1_nofrost_temperature,number.thermostat_hc1_nofrosttemp,6,1,1/2,17,1 +"FW120",thermostat,192,hc1.control,control device,enum [off\|FB10\|FB100], ,true,select.thermostat_hc1_control_device,select.thermostat_hc1_control,6,1,1,41,1 +"FW120",thermostat,192,hc1.program,program,enum [prog a\|prog b\|prog c\|prog d\|prog e\|prog f], ,true,select.thermostat_hc1_program,select.thermostat_hc1_program,6,1,1,26,1 +"FW120",thermostat,192,hc1.remotetemp,room temperature from remote,cmd [] (>=-1<=101),C,true,sensor.thermostat_hc1_room_temperature_from_remote,sensor.thermostat_hc1_remotetemp,6,1,1/10,42,1 +"FW120",thermostat,192,hc1.targetflowtemp,target flow temperature,uint8 (>=0<=254),C,false,sensor.thermostat_hc1_target_flow_temperature,sensor.thermostat_hc1_targetflowtemp,6,1,1,18,1 +"FW120",thermostat,192,hc1.summertemp,summer temperature,uint8 (>=9<=25),C,true,number.thermostat_hc1_summer_temperature,number.thermostat_hc1_summertemp,6,1,1/2,8,1 +"FW120",thermostat,192,hc1.roomsensor,room sensor,enum [extern\|intern\|auto], ,true,select.thermostat_hc1_room_sensor,select.thermostat_hc1_roomsensor,6,1,1,203,1 +"FW120",thermostat,192,hc1.holidaymode,holiday mode,enum [nofrost\|eco\|heat\|auto], ,true,select.thermostat_hc1_holiday_mode,select.thermostat_hc1_holidaymode,6,1,1,63,1 +"FW120",thermostat,192,hc1.switchonoptimization,switch-on optimization,boolean, ,true,switch.thermostat_hc1_switch-on_optimization,switch.thermostat_hc1_switchonoptimization,6,1,1,30,1 +"FW120",thermostat,192,hc1.heatup,heatup,enum [slow\|medium\|fast], ,true,select.thermostat_hc1_heatup,select.thermostat_hc1_heatup,6,1,1,204,1 +"FW120",thermostat,192,hc1.minflowtemp,min flow temperature,uint8 (>=5<=70),C,true,number.thermostat_hc1_min_flow_temperature,number.thermostat_hc1_minflowtemp,6,1,1,11,1 +"FW120",thermostat,192,hc1.maxflowtemp,max flow temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_max_flow_temperature,number.thermostat_hc1_maxflowtemp,6,1,1,12,1 +"FW120",thermostat,192,hc1.designtemp,design temperature,uint8 (>=30<=90),C,true,number.thermostat_hc1_design_temperature,number.thermostat_hc1_designtemp,6,1,1,9,1 +"FW120",thermostat,192,hc1.roominfluence,room influence,enum [off\|intern\|extern\|auto], ,true,select.thermostat_hc1_room_influence,select.thermostat_hc1_roominfluence,6,1,1,13,1 +"FW120",thermostat,192,hc1.roominflfactor,room influence factor,uint8 (>=0<=100),%,true,number.thermostat_hc1_room_influence_factor,number.thermostat_hc1_roominflfactor,6,1,10,14,1 +"FW120",thermostat,192,hc1.heatingtype,heating type,enum [off\|heatingcurve\|radiator\|convector\|floor], ,true,select.thermostat_hc1_heating_type,select.thermostat_hc1_heatingtype,6,1,1,19,1 +"FW120",thermostat,192,hc1.controlmode,control mode,enum [off\|unmixed\|unmixed IPM\|mixed IPM], ,true,select.thermostat_hc1_control_mode,select.thermostat_hc1_controlmode,6,1,1,25,1 +"FW120",thermostat,192,dhw.charge,charge,boolean, ,true,switch.thermostat_dhw_charge,switch.thermostat_dhw_charge,6,9,1,6,1 +"RT800, RC220",thermostat,3,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RT800, RC220",thermostat,3,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RT800, RC220",thermostat,3,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RT800, RC220",thermostat,3,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RT800, RC220",thermostat,3,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RT800, RC220",thermostat,3,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC100H, CR10H",thermostat,200,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC100H, CR10H",thermostat,200,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC100H, CR10H",thermostat,200,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC100H, CR10H",thermostat,200,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC100H, CR10H",thermostat,200,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC100H, CR10H",thermostat,200,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"RC120RF, TR120RF, CR20RF",thermostat,249,errorcode,error code,string, ,false,sensor.thermostat_error_code,sensor.thermostat_errorcode,6,0,1,0,8 +"RC120RF, TR120RF, CR20RF",thermostat,249,lastcode,last error code,string, ,false,sensor.thermostat_last_error_code,sensor.thermostat_lastcode,6,0,1,8,25 +"RC120RF, TR120RF, CR20RF",thermostat,249,datetime,date/time,string, ,false,sensor.thermostat_date/time,sensor.thermostat_datetime,6,0,1,33,13 +"RC120RF, TR120RF, CR20RF",thermostat,249,hc1.seltemp,selected room temperature,int16 (>=0<=30),C,true,number.thermostat_hc1_selected_room_temperature,number.thermostat_hc1_seltemp,6,1,1/2,0,1 +"RC120RF, TR120RF, CR20RF",thermostat,249,hc1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.thermostat_hc1_current_room_temperature,sensor.thermostat_hc1_currtemp,6,1,1/10,1,1 +"RC120RF, TR120RF, CR20RF",thermostat,249,hc1.haclimate,mqtt discovery current room temperature,enum [selTemp\|roomTemp] (>=5<=30), ,false,sensor.thermostat_hc1_mqtt_discovery_current_room_temperature,sensor.thermostat_hc1_haclimate,6,1,1,2,1 +"XCUMixer",mixer,8,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"XCUMixer",mixer,8,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"XCUMixer",mixer,8,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"XCUMixer",mixer,8,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"XCUMixer",mixer,8,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"XCUMixer",mixer,8,hc1.flow,Durchfluss,uint16 (>=0<=31999),l/h,false,sensor.mixer_hc1_Durchfluss,sensor.mixer_hc1_flow,7,1,1,5,1 +"XCUMixer",mixer,8,hc1.setdiffpress,set differential pressure,uint8 (>=0<=12700),mbar,true,number.mixer_hc1_set_differential_pressure,number.mixer_hc1_setdiffpress,7,1,50,6,1 +"XCUMixer",mixer,8,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"XCUMixer",mixer,8,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,8,1 +"XCUMixer",mixer,8,hc1.dhwprio,dhw priority,boolean, ,true,switch.mixer_hc1_dhw_priority,switch.mixer_hc1_dhwprio,7,1,1,9,1 +"MM10",mixer,69,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"MM10",mixer,69,hc1.valvestatus,mixing valve actuator (VC1),int8 (>=-100<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"MM10",mixer,69,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"MM10",mixer,69,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"MM10",mixer,69,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"MM10",mixer,69,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"IPM",mixer,100,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"IPM",mixer,100,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"IPM",mixer,100,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"IPM",mixer,100,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"IPM",mixer,100,hc1.flowtempvf,flow temperature in header (T0/Vf),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_in_header_(T0/Vf),sensor.mixer_hc1_flowtempvf,7,1,1/10,10,1 +"IPM2",mixer,102,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"IPM2",mixer,102,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"IPM2",mixer,102,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"IPM2",mixer,102,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"IPM2",mixer,102,hc1.flowtempvf,flow temperature in header (T0/Vf),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_in_header_(T0/Vf),sensor.mixer_hc1_flowtempvf,7,1,1/10,10,1 +"MM50",mixer,159,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"MM50",mixer,159,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"MM50",mixer,159,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"MM50",mixer,159,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"MM50",mixer,159,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"MM50",mixer,159,hc1.flow,Durchfluss,uint16 (>=0<=31999),l/h,false,sensor.mixer_hc1_Durchfluss,sensor.mixer_hc1_flow,7,1,1,5,1 +"MM50",mixer,159,hc1.setdiffpress,set differential pressure,uint8 (>=0<=12700),mbar,true,number.mixer_hc1_set_differential_pressure,number.mixer_hc1_setdiffpress,7,1,50,6,1 +"MM50",mixer,159,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"MM50",mixer,159,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,8,1 +"MM50",mixer,159,hc1.dhwprio,dhw priority,boolean, ,true,switch.mixer_hc1_dhw_priority,switch.mixer_hc1_dhwprio,7,1,1,9,1 +"MM100",mixer,160,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"MM100",mixer,160,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"MM100",mixer,160,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"MM100",mixer,160,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"MM100",mixer,160,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"MM100",mixer,160,hc1.flow,Durchfluss,uint16 (>=0<=31999),l/h,false,sensor.mixer_hc1_Durchfluss,sensor.mixer_hc1_flow,7,1,1,5,1 +"MM100",mixer,160,hc1.setdiffpress,set differential pressure,uint8 (>=0<=12700),mbar,true,number.mixer_hc1_set_differential_pressure,number.mixer_hc1_setdiffpress,7,1,50,6,1 +"MM100",mixer,160,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"MM100",mixer,160,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,8,1 +"MM100",mixer,160,hc1.dhwprio,dhw priority,boolean, ,true,switch.mixer_hc1_dhw_priority,switch.mixer_hc1_dhwprio,7,1,1,9,1 +"MM200",mixer,161,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"MM200",mixer,161,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"MM200",mixer,161,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"MM200",mixer,161,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"MM200",mixer,161,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"MM200",mixer,161,hc1.flow,Durchfluss,uint16 (>=0<=31999),l/h,false,sensor.mixer_hc1_Durchfluss,sensor.mixer_hc1_flow,7,1,1,5,1 +"MM200",mixer,161,hc1.setdiffpress,set differential pressure,uint8 (>=0<=12700),mbar,true,number.mixer_hc1_set_differential_pressure,number.mixer_hc1_setdiffpress,7,1,50,6,1 +"MM200",mixer,161,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"MM200",mixer,161,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,8,1 +"MM200",mixer,161,hc1.dhwprio,dhw priority,boolean, ,true,switch.mixer_hc1_dhw_priority,switch.mixer_hc1_dhwprio,7,1,1,9,1 +"MZ100",mixer,193,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"MZ100",mixer,193,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"MZ100",mixer,193,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"MZ100",mixer,193,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"MZ100",mixer,193,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"MZ100",mixer,193,hc1.flow,Durchfluss,uint16 (>=0<=31999),l/h,false,sensor.mixer_hc1_Durchfluss,sensor.mixer_hc1_flow,7,1,1,5,1 +"MZ100",mixer,193,hc1.setdiffpress,set differential pressure,uint8 (>=0<=12700),mbar,true,number.mixer_hc1_set_differential_pressure,number.mixer_hc1_setdiffpress,7,1,50,6,1 +"MZ100",mixer,193,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"MZ100",mixer,193,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,8,1 +"MZ100",mixer,193,hc1.dhwprio,dhw priority,boolean, ,true,switch.mixer_hc1_dhw_priority,switch.mixer_hc1_dhwprio,7,1,1,9,1 +"HM210",mixer,248,hc1.flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.mixer_hc1_flow_temperature_(TC1),sensor.mixer_hc1_flowtemphc,7,1,1/10,0,1 +"HM210",mixer,248,hc1.valvestatus,mixing valve actuator (VC1),uint8 (>=0<=100),%,false,sensor.mixer_hc1_mixing_valve_actuator_(VC1),sensor.mixer_hc1_valvestatus,7,1,1,1,1 +"HM210",mixer,248,hc1.flowsettemp,setpoint flow temperature,uint8 (>=0<=254),C,true,number.mixer_hc1_setpoint_flow_temperature,number.mixer_hc1_flowsettemp,7,1,1,2,1 +"HM210",mixer,248,hc1.pumpstatus,pump status (PC1),boolean, ,true,switch.mixer_hc1_pump_status_(PC1),switch.mixer_hc1_pumpstatus,7,1,1,3,1 +"HM210",mixer,248,hc1.activated,activated,boolean, ,true,switch.mixer_hc1_activated,switch.mixer_hc1_activated,7,1,1,4,1 +"HM210",mixer,248,hc1.flow,Durchfluss,uint16 (>=0<=31999),l/h,false,sensor.mixer_hc1_Durchfluss,sensor.mixer_hc1_flow,7,1,1,5,1 +"HM210",mixer,248,hc1.setdiffpress,set differential pressure,uint8 (>=0<=12700),mbar,true,number.mixer_hc1_set_differential_pressure,number.mixer_hc1_setdiffpress,7,1,50,6,1 +"HM210",mixer,248,hc1.valvesettime,time to set valve,uint8 (>=10<=600),seconds,true,number.mixer_hc1_time_to_set_valve,number.mixer_hc1_valvesettime,7,1,10,7,1 +"HM210",mixer,248,hc1.flowtempoffset,flow temperature offset for mixer,uint8 (>=0<=20),K,true,number.mixer_hc1_flow_temperature_offset_for_mixer,number.mixer_hc1_flowtempoffset,7,1,1,8,1 +"HM210",mixer,248,hc1.dhwprio,dhw priority,boolean, ,true,switch.mixer_hc1_dhw_priority,switch.mixer_hc1_dhwprio,7,1,1,9,1 +"SM10",solar,73,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 +"SM10",solar,73,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 +"SM10",solar,73,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 +"SM10",solar,73,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 +"SM10",solar,73,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 +"SM10",solar,73,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 +"SM10",solar,73,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 +"SM10",solar,73,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 +"SM10",solar,73,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,1,9,1 +"SM10",solar,73,turnondiff,pump turn on difference,uint8 (>=0<=254),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1,10,1 +"SM10",solar,73,turnoffdiff,pump turn off difference,uint8 (>=0<=254),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1,11,1 +"SM10",solar,73,solarpower,actual solar power,int16 (>=-31999<=31999),W,false,sensor.solar_actual_solar_power,sensor.solar_solarpower,8,0,1,12,1 +"SM10",solar,73,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 +"SM10",solar,73,maxflow,maximum solar flow,uint8 (>=0<=25),l/min,true,number.solar_maximum_solar_flow,number.solar_maxflow,8,0,1/10,15,1 +"SM10",solar,73,dhw.mintemp,minimum temperature,uint8 (>=0<=254),C,true,number.solar_dhw_minimum_temperature,number.solar_dhw_mintemp,8,9,1,0,1 +"SM10",solar,73,solarenabled,solarmodule enabled,boolean, ,true,switch.solar_solarmodule_enabled,switch.solar_solarenabled,8,0,1,16,1 +"ISM1",solar,101,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 +"ISM1",solar,101,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 +"ISM1",solar,101,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 +"ISM1",solar,101,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 +"ISM1",solar,101,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 +"ISM1",solar,101,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 +"ISM1",solar,101,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 +"ISM1",solar,101,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 +"ISM1",solar,101,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 +"ISM1",solar,101,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 +"ISM1",solar,101,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 +"ISM2",solar,103,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 +"ISM2",solar,103,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 +"ISM2",solar,103,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 +"ISM2",solar,103,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 +"ISM2",solar,103,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 +"ISM2",solar,103,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 +"ISM2",solar,103,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 +"ISM2",solar,103,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 +"ISM2",solar,103,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 +"ISM2",solar,103,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 +"ISM2",solar,103,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 +"SM50",solar,162,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 +"SM50",solar,162,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 +"SM50",solar,162,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 +"SM50",solar,162,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 +"SM50",solar,162,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 +"SM50",solar,162,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 +"SM50",solar,162,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 +"SM50",solar,162,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 +"SM50",solar,162,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,5,9,1 +"SM50",solar,162,turnondiff,pump turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1/10,10,1 +"SM50",solar,162,turnoffdiff,pump turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1/10,11,1 +"SM50",solar,162,collector2temp,collector 2 temperature (TS7),int16 (>=-3199<=3199),C,false,sensor.solar_collector_2_temperature_(TS7),sensor.solar_collector2temp,8,0,1/10,20,1 +"SM50",solar,162,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 +"SM50",solar,162,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 +"SM50",solar,162,ts8,(TS8),int16 (>=-3199<=3199),C,false,sensor.solar_(TS8),sensor.solar_ts8,8,0,1/10,21,1 +"SM50",solar,162,ts16,(TS16),int16 (>=-3199<=3199),C,false,sensor.solar_(TS16),sensor.solar_ts16,8,0,1/10,22,1 +"SM50",solar,162,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 +"SM50",solar,162,heatassistpower,heat assistance valve power (M1),uint8 (>=0<=100),%,false,sensor.solar_heat_assistance_valve_power_(M1),sensor.solar_heatassistpower,8,0,1,23,1 +"SM50",solar,162,solarpump2,pump 2 (PS4),boolean, ,false,binary_sensor.solar_pump_2_(PS4),binary_sensor.solar_solarpump2,8,0,1,24,1 +"SM50",solar,162,solarpump2mod,pump 2 modulation (PS4),uint8 (>=0<=100),%,false,sensor.solar_pump_2_modulation_(PS4),sensor.solar_solarpump2mod,8,0,1,25,1 +"SM50",solar,162,cyl2bottomtemp,second cylinder bottom temperature (TS5),int16 (>=-3199<=3199),C,false,sensor.solar_second_cylinder_bottom_temperature_(TS5),sensor.solar_cyl2bottomtemp,8,0,1/10,26,1 +"SM50",solar,162,cyl3bottomtemp,third cylinder bottom temperature (TS11),int16 (>=-3199<=3199),C,false,sensor.solar_third_cylinder_bottom_temperature_(TS11),sensor.solar_cyl3bottomtemp,8,0,1/10,27,1 +"SM50",solar,162,cyltoptemp,cylinder top temperature (TS10),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_top_temperature_(TS10),sensor.solar_cyltoptemp,8,0,1/10,28,1 +"SM50",solar,162,heatexchangertemp,heat exchanger temperature (TS6),int16 (>=-3199<=3199),C,false,sensor.solar_heat_exchanger_temperature_(TS6),sensor.solar_heatexchangertemp,8,0,1/10,29,1 +"SM50",solar,162,cylpumpmod,cylinder pump modulation (PS5),uint8 (>=0<=100),%,false,sensor.solar_cylinder_pump_modulation_(PS5),sensor.solar_cylpumpmod,8,0,1,30,1 +"SM50",solar,162,valvestatus,valve status,boolean, ,false,binary_sensor.solar_valve_status,binary_sensor.solar_valvestatus,8,0,1,31,1 +"SM50",solar,162,vs1status,valve status VS1,boolean, ,false,binary_sensor.solar_valve_status_VS1,binary_sensor.solar_vs1status,8,0,1,32,1 +"SM50",solar,162,vs3status,valve status VS3,boolean, ,false,binary_sensor.solar_valve_status_VS3,binary_sensor.solar_vs3status,8,0,1,33,1 +"SM50",solar,162,transferpump,transfer pump,boolean, ,false,binary_sensor.solar_transfer_pump,binary_sensor.solar_transferpump,8,0,1,34,1 +"SM50",solar,162,transferpumpmod,transfer pump modulation,uint8 (>=0<=100),%,false,sensor.solar_transfer_pump_modulation,sensor.solar_transferpumpmod,8,0,1,35,1 +"SM50",solar,162,collectormaxtemp,maximum collector temperature,uint8 (>=0<=254),C,true,number.solar_maximum_collector_temperature,number.solar_collectormaxtemp,8,0,1,36,1 +"SM50",solar,162,collectormintemp,minimum collector temperature,uint8 (>=0<=254),C,true,number.solar_minimum_collector_temperature,number.solar_collectormintemp,8,0,1,37,1 +"SM50",solar,162,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 +"SM50",solar,162,energytoday,total energy today,uint24 (>=0<=16777214),Wh,false,sensor.solar_total_energy_today,sensor.solar_energytoday,8,0,1,38,2 +"SM50",solar,162,energytotal,total energy,uint24 (>=0<=1677721),kWh,false,sensor.solar_total_energy,sensor.solar_energytotal,8,0,1/10,40,2 +"SM50",solar,162,pump2worktime,pump 2 working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_2_working_time,sensor.solar_pump2worktime,8,0,1,42,2 +"SM50",solar,162,m1worktime,differential control working time,time (>=0<=16777214),minutes,false,sensor.solar_differential_control_working_time,sensor.solar_m1worktime,8,0,1,44,2 +"SM50",solar,162,heattransfersystem,heattransfer system,boolean, ,true,switch.solar_heattransfer_system,switch.solar_heattransfersystem,8,0,1,46,1 +"SM50",solar,162,externalcyl,external cylinder,boolean, ,true,switch.solar_external_cylinder,switch.solar_externalcyl,8,0,1,47,1 +"SM50",solar,162,thermaldisinfect,thermal disinfection,boolean, ,true,switch.solar_thermal_disinfection,switch.solar_thermaldisinfect,8,0,1,48,1 +"SM50",solar,162,heatmetering,heatmetering,boolean, ,true,switch.solar_heatmetering,switch.solar_heatmetering,8,0,1,49,1 +"SM50",solar,162,activated,activated,boolean, ,true,switch.solar_activated,switch.solar_activated,8,0,1,50,1 +"SM50",solar,162,solarpumpmode,solar pump mode,enum [constant\|pwm\|analog], ,true,select.solar_solar_pump_mode,select.solar_solarpumpmode,8,0,1,51,1 +"SM50",solar,162,solarpumpkick,solar pump kick,boolean, ,true,switch.solar_solar_pump_kick,switch.solar_solarpumpkick,8,0,1,52,1 +"SM50",solar,162,plainwatermode,plain water mode,boolean, ,true,switch.solar_plain_water_mode,switch.solar_plainwatermode,8,0,1,53,1 +"SM50",solar,162,doublematchflow,doublematchflow,boolean, ,true,switch.solar_doublematchflow,switch.solar_doublematchflow,8,0,1,54,1 +"SM50",solar,162,pump2minmod,minimum pump 2 modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_2_modulation,number.solar_pump2minmod,8,0,1,55,1 +"SM50",solar,162,turnondiff2,pump 2 turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_on_difference,number.solar_turnondiff2,8,0,1/10,56,1 +"SM50",solar,162,turnoffdiff2,pump 2 turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_off_difference,number.solar_turnoffdiff2,8,0,1/10,57,1 +"SM50",solar,162,pump2kick,pump kick 2,boolean, ,true,switch.solar_pump_kick_2,switch.solar_pump2kick,8,0,1,58,1 +"SM50",solar,162,climatezone,climate zone,uint8 (>=0<=254), ,true,number.solar_climate_zone,number.solar_climatezone,8,0,1,59,1 +"SM50",solar,162,collector1area,collector 1 area,uint16 (>=0<=3199),m²,true,number.solar_collector_1_area,number.solar_collector1area,8,0,1/10,60,1 +"SM50",solar,162,collector1type,collector 1 type,enum [flat\|vacuum], ,true,select.solar_collector_1_type,select.solar_collector1type,8,0,1,61,1 +"SM50",solar,162,collector2area,collector 2 area,uint16 (>=0<=3199),m²,true,number.solar_collector_2_area,number.solar_collector2area,8,0,1/10,62,1 +"SM50",solar,162,collector2type,collector 2 type,enum [flat\|vacuum], ,true,select.solar_collector_2_type,select.solar_collector2type,8,0,1,63,1 +"SM50",solar,162,cylpriority,cylinder priority,enum [cyl 1\|cyl 2], ,true,select.solar_cylinder_priority,select.solar_cylpriority,8,0,1,64,1 +"SM50",solar,162,heatcntflowtemp,heat counter flow temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_flow_temperature,sensor.solar_heatcntflowtemp,8,0,1/10,65,1 +"SM50",solar,162,heatcntrettemp,heat counter return temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_return_temperature,sensor.solar_heatcntrettemp,8,0,1/10,66,1 +"SM50",solar,162,heatcnt,heat counter impulses,uint8 (>=0<=254), ,false,sensor.solar_heat_counter_impulses,sensor.solar_heatcnt,8,0,1,67,1 +"SM50",solar,162,swapflowtemp,swap flow temperature (TS14),uint16 (>=0<=3199),C,false,sensor.solar_swap_flow_temperature_(TS14),sensor.solar_swapflowtemp,8,0,1/10,68,1 +"SM50",solar,162,swaprettemp,swap return temperature (TS15),uint16 (>=0<=3199),C,false,sensor.solar_swap_return_temperature_(TS15),sensor.solar_swaprettemp,8,0,1/10,69,1 +"SM50",solar,162,heatassiston,heat assistance on,int8 (>=-12<=12),K,true,number.solar_heat_assistance_on,number.solar_heatassiston,8,0,1/10,70,1 +"SM50",solar,162,heatassistoff,heat assistance off,int8 (>=-12<=12),K,true,number.solar_heat_assistance_off,number.solar_heatassistoff,8,0,1/10,71,1 +"SM100, MS100",solar,163,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 +"SM100, MS100",solar,163,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 +"SM100, MS100",solar,163,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 +"SM100, MS100",solar,163,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 +"SM100, MS100",solar,163,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 +"SM100, MS100",solar,163,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 +"SM100, MS100",solar,163,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 +"SM100, MS100",solar,163,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 +"SM100, MS100",solar,163,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,5,9,1 +"SM100, MS100",solar,163,turnondiff,pump turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1/10,10,1 +"SM100, MS100",solar,163,turnoffdiff,pump turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1/10,11,1 +"SM100, MS100",solar,163,collector2temp,collector 2 temperature (TS7),int16 (>=-3199<=3199),C,false,sensor.solar_collector_2_temperature_(TS7),sensor.solar_collector2temp,8,0,1/10,20,1 +"SM100, MS100",solar,163,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 +"SM100, MS100",solar,163,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 +"SM100, MS100",solar,163,ts8,(TS8),int16 (>=-3199<=3199),C,false,sensor.solar_(TS8),sensor.solar_ts8,8,0,1/10,21,1 +"SM100, MS100",solar,163,ts16,(TS16),int16 (>=-3199<=3199),C,false,sensor.solar_(TS16),sensor.solar_ts16,8,0,1/10,22,1 +"SM100, MS100",solar,163,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 +"SM100, MS100",solar,163,heatassistpower,heat assistance valve power (M1),uint8 (>=0<=100),%,false,sensor.solar_heat_assistance_valve_power_(M1),sensor.solar_heatassistpower,8,0,1,23,1 +"SM100, MS100",solar,163,solarpump2,pump 2 (PS4),boolean, ,false,binary_sensor.solar_pump_2_(PS4),binary_sensor.solar_solarpump2,8,0,1,24,1 +"SM100, MS100",solar,163,solarpump2mod,pump 2 modulation (PS4),uint8 (>=0<=100),%,false,sensor.solar_pump_2_modulation_(PS4),sensor.solar_solarpump2mod,8,0,1,25,1 +"SM100, MS100",solar,163,cyl2bottomtemp,second cylinder bottom temperature (TS5),int16 (>=-3199<=3199),C,false,sensor.solar_second_cylinder_bottom_temperature_(TS5),sensor.solar_cyl2bottomtemp,8,0,1/10,26,1 +"SM100, MS100",solar,163,cyl3bottomtemp,third cylinder bottom temperature (TS11),int16 (>=-3199<=3199),C,false,sensor.solar_third_cylinder_bottom_temperature_(TS11),sensor.solar_cyl3bottomtemp,8,0,1/10,27,1 +"SM100, MS100",solar,163,cyltoptemp,cylinder top temperature (TS10),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_top_temperature_(TS10),sensor.solar_cyltoptemp,8,0,1/10,28,1 +"SM100, MS100",solar,163,heatexchangertemp,heat exchanger temperature (TS6),int16 (>=-3199<=3199),C,false,sensor.solar_heat_exchanger_temperature_(TS6),sensor.solar_heatexchangertemp,8,0,1/10,29,1 +"SM100, MS100",solar,163,cylpumpmod,cylinder pump modulation (PS5),uint8 (>=0<=100),%,false,sensor.solar_cylinder_pump_modulation_(PS5),sensor.solar_cylpumpmod,8,0,1,30,1 +"SM100, MS100",solar,163,valvestatus,valve status,boolean, ,false,binary_sensor.solar_valve_status,binary_sensor.solar_valvestatus,8,0,1,31,1 +"SM100, MS100",solar,163,vs1status,valve status VS1,boolean, ,false,binary_sensor.solar_valve_status_VS1,binary_sensor.solar_vs1status,8,0,1,32,1 +"SM100, MS100",solar,163,vs3status,valve status VS3,boolean, ,false,binary_sensor.solar_valve_status_VS3,binary_sensor.solar_vs3status,8,0,1,33,1 +"SM100, MS100",solar,163,transferpump,transfer pump,boolean, ,false,binary_sensor.solar_transfer_pump,binary_sensor.solar_transferpump,8,0,1,34,1 +"SM100, MS100",solar,163,transferpumpmod,transfer pump modulation,uint8 (>=0<=100),%,false,sensor.solar_transfer_pump_modulation,sensor.solar_transferpumpmod,8,0,1,35,1 +"SM100, MS100",solar,163,collectormaxtemp,maximum collector temperature,uint8 (>=0<=254),C,true,number.solar_maximum_collector_temperature,number.solar_collectormaxtemp,8,0,1,36,1 +"SM100, MS100",solar,163,collectormintemp,minimum collector temperature,uint8 (>=0<=254),C,true,number.solar_minimum_collector_temperature,number.solar_collectormintemp,8,0,1,37,1 +"SM100, MS100",solar,163,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 +"SM100, MS100",solar,163,energytoday,total energy today,uint24 (>=0<=16777214),Wh,false,sensor.solar_total_energy_today,sensor.solar_energytoday,8,0,1,38,2 +"SM100, MS100",solar,163,energytotal,total energy,uint24 (>=0<=1677721),kWh,false,sensor.solar_total_energy,sensor.solar_energytotal,8,0,1/10,40,2 +"SM100, MS100",solar,163,pump2worktime,pump 2 working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_2_working_time,sensor.solar_pump2worktime,8,0,1,42,2 +"SM100, MS100",solar,163,m1worktime,differential control working time,time (>=0<=16777214),minutes,false,sensor.solar_differential_control_working_time,sensor.solar_m1worktime,8,0,1,44,2 +"SM100, MS100",solar,163,heattransfersystem,heattransfer system,boolean, ,true,switch.solar_heattransfer_system,switch.solar_heattransfersystem,8,0,1,46,1 +"SM100, MS100",solar,163,externalcyl,external cylinder,boolean, ,true,switch.solar_external_cylinder,switch.solar_externalcyl,8,0,1,47,1 +"SM100, MS100",solar,163,thermaldisinfect,thermal disinfection,boolean, ,true,switch.solar_thermal_disinfection,switch.solar_thermaldisinfect,8,0,1,48,1 +"SM100, MS100",solar,163,heatmetering,heatmetering,boolean, ,true,switch.solar_heatmetering,switch.solar_heatmetering,8,0,1,49,1 +"SM100, MS100",solar,163,activated,activated,boolean, ,true,switch.solar_activated,switch.solar_activated,8,0,1,50,1 +"SM100, MS100",solar,163,solarpumpmode,solar pump mode,enum [constant\|pwm\|analog], ,true,select.solar_solar_pump_mode,select.solar_solarpumpmode,8,0,1,51,1 +"SM100, MS100",solar,163,solarpumpkick,solar pump kick,boolean, ,true,switch.solar_solar_pump_kick,switch.solar_solarpumpkick,8,0,1,52,1 +"SM100, MS100",solar,163,plainwatermode,plain water mode,boolean, ,true,switch.solar_plain_water_mode,switch.solar_plainwatermode,8,0,1,53,1 +"SM100, MS100",solar,163,doublematchflow,doublematchflow,boolean, ,true,switch.solar_doublematchflow,switch.solar_doublematchflow,8,0,1,54,1 +"SM100, MS100",solar,163,pump2minmod,minimum pump 2 modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_2_modulation,number.solar_pump2minmod,8,0,1,55,1 +"SM100, MS100",solar,163,turnondiff2,pump 2 turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_on_difference,number.solar_turnondiff2,8,0,1/10,56,1 +"SM100, MS100",solar,163,turnoffdiff2,pump 2 turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_off_difference,number.solar_turnoffdiff2,8,0,1/10,57,1 +"SM100, MS100",solar,163,pump2kick,pump kick 2,boolean, ,true,switch.solar_pump_kick_2,switch.solar_pump2kick,8,0,1,58,1 +"SM100, MS100",solar,163,climatezone,climate zone,uint8 (>=0<=254), ,true,number.solar_climate_zone,number.solar_climatezone,8,0,1,59,1 +"SM100, MS100",solar,163,collector1area,collector 1 area,uint16 (>=0<=3199),m²,true,number.solar_collector_1_area,number.solar_collector1area,8,0,1/10,60,1 +"SM100, MS100",solar,163,collector1type,collector 1 type,enum [flat\|vacuum], ,true,select.solar_collector_1_type,select.solar_collector1type,8,0,1,61,1 +"SM100, MS100",solar,163,collector2area,collector 2 area,uint16 (>=0<=3199),m²,true,number.solar_collector_2_area,number.solar_collector2area,8,0,1/10,62,1 +"SM100, MS100",solar,163,collector2type,collector 2 type,enum [flat\|vacuum], ,true,select.solar_collector_2_type,select.solar_collector2type,8,0,1,63,1 +"SM100, MS100",solar,163,cylpriority,cylinder priority,enum [cyl 1\|cyl 2], ,true,select.solar_cylinder_priority,select.solar_cylpriority,8,0,1,64,1 +"SM100, MS100",solar,163,heatcntflowtemp,heat counter flow temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_flow_temperature,sensor.solar_heatcntflowtemp,8,0,1/10,65,1 +"SM100, MS100",solar,163,heatcntrettemp,heat counter return temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_return_temperature,sensor.solar_heatcntrettemp,8,0,1/10,66,1 +"SM100, MS100",solar,163,heatcnt,heat counter impulses,uint8 (>=0<=254), ,false,sensor.solar_heat_counter_impulses,sensor.solar_heatcnt,8,0,1,67,1 +"SM100, MS100",solar,163,swapflowtemp,swap flow temperature (TS14),uint16 (>=0<=3199),C,false,sensor.solar_swap_flow_temperature_(TS14),sensor.solar_swapflowtemp,8,0,1/10,68,1 +"SM100, MS100",solar,163,swaprettemp,swap return temperature (TS15),uint16 (>=0<=3199),C,false,sensor.solar_swap_return_temperature_(TS15),sensor.solar_swaprettemp,8,0,1/10,69,1 +"SM100, MS100",solar,163,heatassiston,heat assistance on,int8 (>=-12<=12),K,true,number.solar_heat_assistance_on,number.solar_heatassiston,8,0,1/10,70,1 +"SM100, MS100",solar,163,heatassistoff,heat assistance off,int8 (>=-12<=12),K,true,number.solar_heat_assistance_off,number.solar_heatassistoff,8,0,1/10,71,1 +"SM200, MS200",solar,164,collectortemp,collector temperature (TS1),int16 (>=-3199<=3199),C,false,sensor.solar_collector_temperature_(TS1),sensor.solar_collectortemp,8,0,1/10,0,1 +"SM200, MS200",solar,164,cylbottomtemp,cylinder bottom temperature (TS2),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_bottom_temperature_(TS2),sensor.solar_cylbottomtemp,8,0,1/10,1,1 +"SM200, MS200",solar,164,solarpump,pump (PS1),boolean, ,false,binary_sensor.solar_pump_(PS1),binary_sensor.solar_solarpump,8,0,1,2,1 +"SM200, MS200",solar,164,pumpworktime,pump working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_working_time,sensor.solar_pumpworktime,8,0,1,3,2 +"SM200, MS200",solar,164,cylmaxtemp,maximum cylinder temperature,uint8 (>=0<=254),C,true,number.solar_maximum_cylinder_temperature,number.solar_cylmaxtemp,8,0,1,5,1 +"SM200, MS200",solar,164,collectorshutdown,collector shutdown,boolean, ,false,binary_sensor.solar_collector_shutdown,binary_sensor.solar_collectorshutdown,8,0,1,6,1 +"SM200, MS200",solar,164,cylheated,cyl heated,boolean, ,false,binary_sensor.solar_cyl_heated,binary_sensor.solar_cylheated,8,0,1,7,1 +"SM200, MS200",solar,164,solarpumpmod,pump modulation (PS1),uint8 (>=0<=100),%,false,sensor.solar_pump_modulation_(PS1),sensor.solar_solarpumpmod,8,0,1,8,1 +"SM200, MS200",solar,164,pumpminmod,minimum pump modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_modulation,number.solar_pumpminmod,8,0,5,9,1 +"SM200, MS200",solar,164,turnondiff,pump turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_on_difference,number.solar_turnondiff,8,0,1/10,10,1 +"SM200, MS200",solar,164,turnoffdiff,pump turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_turn_off_difference,number.solar_turnoffdiff,8,0,1/10,11,1 +"SM200, MS200",solar,164,collector2temp,collector 2 temperature (TS7),int16 (>=-3199<=3199),C,false,sensor.solar_collector_2_temperature_(TS7),sensor.solar_collector2temp,8,0,1/10,20,1 +"SM200, MS200",solar,164,cylmiddletemp,cylinder middle temperature (TS3),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_middle_temperature_(TS3),sensor.solar_cylmiddletemp,8,0,1/10,17,1 +"SM200, MS200",solar,164,retheatassist,return temperature heat assistance (TS4),int16 (>=-3199<=3199),C,false,sensor.solar_return_temperature_heat_assistance_(TS4),sensor.solar_retheatassist,8,0,1/10,18,1 +"SM200, MS200",solar,164,ts8,(TS8),int16 (>=-3199<=3199),C,false,sensor.solar_(TS8),sensor.solar_ts8,8,0,1/10,21,1 +"SM200, MS200",solar,164,ts16,(TS16),int16 (>=-3199<=3199),C,false,sensor.solar_(TS16),sensor.solar_ts16,8,0,1/10,22,1 +"SM200, MS200",solar,164,heatassistvalve,heat assistance valve (M1),boolean, ,false,binary_sensor.solar_heat_assistance_valve_(M1),binary_sensor.solar_heatassistvalve,8,0,1,19,1 +"SM200, MS200",solar,164,heatassistpower,heat assistance valve power (M1),uint8 (>=0<=100),%,false,sensor.solar_heat_assistance_valve_power_(M1),sensor.solar_heatassistpower,8,0,1,23,1 +"SM200, MS200",solar,164,solarpump2,pump 2 (PS4),boolean, ,false,binary_sensor.solar_pump_2_(PS4),binary_sensor.solar_solarpump2,8,0,1,24,1 +"SM200, MS200",solar,164,solarpump2mod,pump 2 modulation (PS4),uint8 (>=0<=100),%,false,sensor.solar_pump_2_modulation_(PS4),sensor.solar_solarpump2mod,8,0,1,25,1 +"SM200, MS200",solar,164,cyl2bottomtemp,second cylinder bottom temperature (TS5),int16 (>=-3199<=3199),C,false,sensor.solar_second_cylinder_bottom_temperature_(TS5),sensor.solar_cyl2bottomtemp,8,0,1/10,26,1 +"SM200, MS200",solar,164,cyl3bottomtemp,third cylinder bottom temperature (TS11),int16 (>=-3199<=3199),C,false,sensor.solar_third_cylinder_bottom_temperature_(TS11),sensor.solar_cyl3bottomtemp,8,0,1/10,27,1 +"SM200, MS200",solar,164,cyltoptemp,cylinder top temperature (TS10),int16 (>=-3199<=3199),C,false,sensor.solar_cylinder_top_temperature_(TS10),sensor.solar_cyltoptemp,8,0,1/10,28,1 +"SM200, MS200",solar,164,heatexchangertemp,heat exchanger temperature (TS6),int16 (>=-3199<=3199),C,false,sensor.solar_heat_exchanger_temperature_(TS6),sensor.solar_heatexchangertemp,8,0,1/10,29,1 +"SM200, MS200",solar,164,cylpumpmod,cylinder pump modulation (PS5),uint8 (>=0<=100),%,false,sensor.solar_cylinder_pump_modulation_(PS5),sensor.solar_cylpumpmod,8,0,1,30,1 +"SM200, MS200",solar,164,valvestatus,valve status,boolean, ,false,binary_sensor.solar_valve_status,binary_sensor.solar_valvestatus,8,0,1,31,1 +"SM200, MS200",solar,164,vs1status,valve status VS1,boolean, ,false,binary_sensor.solar_valve_status_VS1,binary_sensor.solar_vs1status,8,0,1,32,1 +"SM200, MS200",solar,164,vs3status,valve status VS3,boolean, ,false,binary_sensor.solar_valve_status_VS3,binary_sensor.solar_vs3status,8,0,1,33,1 +"SM200, MS200",solar,164,transferpump,transfer pump,boolean, ,false,binary_sensor.solar_transfer_pump,binary_sensor.solar_transferpump,8,0,1,34,1 +"SM200, MS200",solar,164,transferpumpmod,transfer pump modulation,uint8 (>=0<=100),%,false,sensor.solar_transfer_pump_modulation,sensor.solar_transferpumpmod,8,0,1,35,1 +"SM200, MS200",solar,164,collectormaxtemp,maximum collector temperature,uint8 (>=0<=254),C,true,number.solar_maximum_collector_temperature,number.solar_collectormaxtemp,8,0,1,36,1 +"SM200, MS200",solar,164,collectormintemp,minimum collector temperature,uint8 (>=0<=254),C,true,number.solar_minimum_collector_temperature,number.solar_collectormintemp,8,0,1,37,1 +"SM200, MS200",solar,164,energylasthour,energy last hour,uint24 (>=0<=1677721),Wh,false,sensor.solar_energy_last_hour,sensor.solar_energylasthour,8,0,1/10,13,2 +"SM200, MS200",solar,164,energytoday,total energy today,uint24 (>=0<=16777214),Wh,false,sensor.solar_total_energy_today,sensor.solar_energytoday,8,0,1,38,2 +"SM200, MS200",solar,164,energytotal,total energy,uint24 (>=0<=1677721),kWh,false,sensor.solar_total_energy,sensor.solar_energytotal,8,0,1/10,40,2 +"SM200, MS200",solar,164,pump2worktime,pump 2 working time,time (>=0<=16777214),minutes,false,sensor.solar_pump_2_working_time,sensor.solar_pump2worktime,8,0,1,42,2 +"SM200, MS200",solar,164,m1worktime,differential control working time,time (>=0<=16777214),minutes,false,sensor.solar_differential_control_working_time,sensor.solar_m1worktime,8,0,1,44,2 +"SM200, MS200",solar,164,heattransfersystem,heattransfer system,boolean, ,true,switch.solar_heattransfer_system,switch.solar_heattransfersystem,8,0,1,46,1 +"SM200, MS200",solar,164,externalcyl,external cylinder,boolean, ,true,switch.solar_external_cylinder,switch.solar_externalcyl,8,0,1,47,1 +"SM200, MS200",solar,164,thermaldisinfect,thermal disinfection,boolean, ,true,switch.solar_thermal_disinfection,switch.solar_thermaldisinfect,8,0,1,48,1 +"SM200, MS200",solar,164,heatmetering,heatmetering,boolean, ,true,switch.solar_heatmetering,switch.solar_heatmetering,8,0,1,49,1 +"SM200, MS200",solar,164,activated,activated,boolean, ,true,switch.solar_activated,switch.solar_activated,8,0,1,50,1 +"SM200, MS200",solar,164,solarpumpmode,solar pump mode,enum [constant\|pwm\|analog], ,true,select.solar_solar_pump_mode,select.solar_solarpumpmode,8,0,1,51,1 +"SM200, MS200",solar,164,solarpumpkick,solar pump kick,boolean, ,true,switch.solar_solar_pump_kick,switch.solar_solarpumpkick,8,0,1,52,1 +"SM200, MS200",solar,164,plainwatermode,plain water mode,boolean, ,true,switch.solar_plain_water_mode,switch.solar_plainwatermode,8,0,1,53,1 +"SM200, MS200",solar,164,doublematchflow,doublematchflow,boolean, ,true,switch.solar_doublematchflow,switch.solar_doublematchflow,8,0,1,54,1 +"SM200, MS200",solar,164,pump2minmod,minimum pump 2 modulation,uint8 (>=0<=100),%,true,number.solar_minimum_pump_2_modulation,number.solar_pump2minmod,8,0,1,55,1 +"SM200, MS200",solar,164,turnondiff2,pump 2 turn on difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_on_difference,number.solar_turnondiff2,8,0,1/10,56,1 +"SM200, MS200",solar,164,turnoffdiff2,pump 2 turn off difference,uint8 (>=0<=25),C,true,number.solar_pump_2_turn_off_difference,number.solar_turnoffdiff2,8,0,1/10,57,1 +"SM200, MS200",solar,164,pump2kick,pump kick 2,boolean, ,true,switch.solar_pump_kick_2,switch.solar_pump2kick,8,0,1,58,1 +"SM200, MS200",solar,164,climatezone,climate zone,uint8 (>=0<=254), ,true,number.solar_climate_zone,number.solar_climatezone,8,0,1,59,1 +"SM200, MS200",solar,164,collector1area,collector 1 area,uint16 (>=0<=3199),m²,true,number.solar_collector_1_area,number.solar_collector1area,8,0,1/10,60,1 +"SM200, MS200",solar,164,collector1type,collector 1 type,enum [flat\|vacuum], ,true,select.solar_collector_1_type,select.solar_collector1type,8,0,1,61,1 +"SM200, MS200",solar,164,collector2area,collector 2 area,uint16 (>=0<=3199),m²,true,number.solar_collector_2_area,number.solar_collector2area,8,0,1/10,62,1 +"SM200, MS200",solar,164,collector2type,collector 2 type,enum [flat\|vacuum], ,true,select.solar_collector_2_type,select.solar_collector2type,8,0,1,63,1 +"SM200, MS200",solar,164,cylpriority,cylinder priority,enum [cyl 1\|cyl 2], ,true,select.solar_cylinder_priority,select.solar_cylpriority,8,0,1,64,1 +"SM200, MS200",solar,164,heatcntflowtemp,heat counter flow temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_flow_temperature,sensor.solar_heatcntflowtemp,8,0,1/10,65,1 +"SM200, MS200",solar,164,heatcntrettemp,heat counter return temperature,uint16 (>=0<=3199),C,false,sensor.solar_heat_counter_return_temperature,sensor.solar_heatcntrettemp,8,0,1/10,66,1 +"SM200, MS200",solar,164,heatcnt,heat counter impulses,uint8 (>=0<=254), ,false,sensor.solar_heat_counter_impulses,sensor.solar_heatcnt,8,0,1,67,1 +"SM200, MS200",solar,164,swapflowtemp,swap flow temperature (TS14),uint16 (>=0<=3199),C,false,sensor.solar_swap_flow_temperature_(TS14),sensor.solar_swapflowtemp,8,0,1/10,68,1 +"SM200, MS200",solar,164,swaprettemp,swap return temperature (TS15),uint16 (>=0<=3199),C,false,sensor.solar_swap_return_temperature_(TS15),sensor.solar_swaprettemp,8,0,1/10,69,1 +"SM200, MS200",solar,164,heatassiston,heat assistance on,int8 (>=-12<=12),K,true,number.solar_heat_assistance_on,number.solar_heatassiston,8,0,1/10,70,1 +"SM200, MS200",solar,164,heatassistoff,heat assistance off,int8 (>=-12<=12),K,true,number.solar_heat_assistance_off,number.solar_heatassistoff,8,0,1/10,71,1 +"HP Module",heatpump,252,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.heatpump_relative_air_humidity,sensor.heatpump_airhumidity,9,0,1,0,1 +"HP Module",heatpump,252,dewtemperature,dew point temperature,uint8 (>=0<=254),C,false,sensor.heatpump_dew_point_temperature,sensor.heatpump_dewtemperature,9,0,1,1,1 +"HP Module",heatpump,252,curflowtemp,current flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_current_flow_temperature,sensor.heatpump_curflowtemp,9,0,1/10,2,1 +"HP Module",heatpump,252,rettemp,return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_return_temperature,sensor.heatpump_rettemp,9,0,1/10,3,1 +"HP Module",heatpump,252,sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_system_return_temperature,sensor.heatpump_sysrettemp,9,0,1/10,4,1 +"HP Module",heatpump,252,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.heatpump_drain_pan_temp_(TA4),sensor.heatpump_hpta4,9,0,1/10,5,1 +"HP Module",heatpump,252,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_temperature_(TR1),sensor.heatpump_hptr1,9,0,1/10,6,1 +"HP Module",heatpump,252,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.heatpump_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.heatpump_hptr3,9,0,1/10,7,1 +"HP Module",heatpump,252,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.heatpump_evaporator_inlet_temperature_(TR4),sensor.heatpump_hptr4,9,0,1/10,8,1 +"HP Module",heatpump,252,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_inlet_temperature_(TR5),sensor.heatpump_hptr5,9,0,1/10,9,1 +"HP Module",heatpump,252,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_outlet_temperature_(TR6),sensor.heatpump_hptr6,9,0,1/10,10,1 +"HP Module",heatpump,252,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.heatpump_air_inlet_temperature_(TL2),sensor.heatpump_hptl2,9,0,1/10,11,1 +"HP Module",heatpump,252,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.heatpump_low_pressure_side_temperature_(PL1),sensor.heatpump_hppl1,9,0,1/10,12,1 +"HP Module",heatpump,252,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.heatpump_high_pressure_side_temperature_(PH1),sensor.heatpump_hpph1,9,0,1/10,13,1 +"HP Module",heatpump,252,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.heatpump_heating_pump_modulation,sensor.heatpump_heatingpumpmod,9,0,1,14,1 +"HP Module",heatpump,252,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.heatpump_compressor_speed,sensor.heatpump_hpcompspd,9,0,1,15,1 +"HP Module",heatpump,252,hybridstrategy,hybrid control strategy,enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only], ,true,select.heatpump_hybrid_control_strategy,select.heatpump_hybridstrategy,9,0,1,16,1 +"HP Module",heatpump,252,lownoisemode,low noise mode,enum [off\|reduced output\|switch off hp\|perm. reduced], ,true,select.heatpump_low_noise_mode,select.heatpump_lownoisemode,9,0,1,17,1 +"HP Module",heatpump,252,lownoisestart,low noise starttime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_starttime,number.heatpump_lownoisestart,9,0,1,18,1 +"HP Module",heatpump,252,lownoisestop,low noise stoptime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_stoptime,number.heatpump_lownoisestop,9,0,1,19,1 +"HP Module",heatpump,252,dhw.hybriddhw,hybrid DHW,enum [eco\|high comfort], ,true,select.heatpump_dhw_hybrid_DHW,select.heatpump_dhw_hybriddhw,9,9,1,0,1 +"HP Module",heatpump,252,energypricegas,energy price gas,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_gas,number.heatpump_energypricegas,9,0,1,20,1 +"HP Module",heatpump,252,energypriceel,energy price electric,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_electric,number.heatpump_energypriceel,9,0,1,21,1 +"HP Module",heatpump,252,energyfeedpv,feed in PV,uint8 (>=0<=254),ct/kWh,true,number.heatpump_feed_in_PV,number.heatpump_energyfeedpv,9,0,1,22,1 +"HP Module",heatpump,252,switchovertemp,outside switchover temperature,int8 (>=-126<=126),C,true,number.heatpump_outside_switchover_temperature,number.heatpump_switchovertemp,9,0,1,23,1 +"HP Module",heatpump,252,airpurgemode,air purge mode,boolean, ,true,switch.heatpump_air_purge_mode,switch.heatpump_airpurgemode,9,0,1,24,1 +"HP Module",heatpump,252,heatpumpoutput,heatpump output,uint8 (>=0<=100),%,true,number.heatpump_heatpump_output,number.heatpump_heatpumpoutput,9,0,1,25,1 +"HP Module",heatpump,252,coolingcircuit,cooling circuit,boolean, ,true,switch.heatpump_cooling_circuit,switch.heatpump_coolingcircuit,9,0,1,26,1 +"HP Module",heatpump,252,compstartmod,compressor start modulation,uint8 (>=0<=100),%,true,number.heatpump_compressor_start_modulation,number.heatpump_compstartmod,9,0,1,27,1 +"HP Module",heatpump,252,heatdrainpan,heat drain pan,boolean, ,true,switch.heatpump_heat_drain_pan,switch.heatpump_heatdrainpan,9,0,1,28,1 +"HP Module",heatpump,252,heatcable,heating cable,boolean, ,true,switch.heatpump_heating_cable,switch.heatpump_heatcable,9,0,1,29,1 +"HP Module",heatpump,252,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_total_energy,sensor.heatpump_nrgtotal,9,0,1/100,30,2 +"HP Module",heatpump,252,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_energy,sensor.heatpump_dhw_nrg,9,9,1/100,1,2 +"HP Module",heatpump,252,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_energy_heating,sensor.heatpump_nrgheat,9,0,1/100,32,2 +"HP Module",heatpump,252,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_total,sensor.heatpump_metertotal,9,0,1/100,34,2 +"HP Module",heatpump,252,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_compressor,sensor.heatpump_metercomp,9,0,1/100,36,2 +"HP Module",heatpump,252,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_e-heater,sensor.heatpump_metereheat,9,0,1/100,38,2 +"HP Module",heatpump,252,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_heating,sensor.heatpump_meterheat,9,0,1/100,40,2 +"HP Module",heatpump,252,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_meter,sensor.heatpump_dhw_meter,9,9,1/100,3,2 +"HP Module",heatpump,252,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.heatpump_heating_control_starts,sensor.heatpump_heatingstarts,9,0,1,42,2 +"HP Module",heatpump,252,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.heatpump_dhw_starts_hp,sensor.heatpump_dhw_startshp,9,9,1,5,2 +"HP Module",heatpump,252,fuelheat,fuel consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_fuel_consumption_heating,sensor.heatpump_fuelheat,9,0,1/10,44,2 +"HP Module",heatpump,252,dhw.fueldhw,fuel consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_fuel_consumption,sensor.heatpump_dhw_fueldhw,9,9,1/10,7,2 +"HP Module",heatpump,252,elheat,el. consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._consumption_heating,sensor.heatpump_elheat,9,0,1/10,46,2 +"HP Module",heatpump,252,dhw.eldhw,el. consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el._consumption,sensor.heatpump_dhw_eldhw,9,9,1/10,9,2 +"HP Module",heatpump,252,elgenheat,el. generation heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._generation_heating,sensor.heatpump_elgenheat,9,0,1/10,48,2 +"HP Module",heatpump,252,dhw.elgendhw,el generation,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el_generation,sensor.heatpump_dhw_elgendhw,9,9,1/10,11,2 +"Hybrid Manager HM200",heatpump,248,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.heatpump_relative_air_humidity,sensor.heatpump_airhumidity,9,0,1,0,1 +"Hybrid Manager HM200",heatpump,248,dewtemperature,dew point temperature,uint8 (>=0<=254),C,false,sensor.heatpump_dew_point_temperature,sensor.heatpump_dewtemperature,9,0,1,1,1 +"Hybrid Manager HM200",heatpump,248,curflowtemp,current flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_current_flow_temperature,sensor.heatpump_curflowtemp,9,0,1/10,2,1 +"Hybrid Manager HM200",heatpump,248,rettemp,return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_return_temperature,sensor.heatpump_rettemp,9,0,1/10,3,1 +"Hybrid Manager HM200",heatpump,248,sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_system_return_temperature,sensor.heatpump_sysrettemp,9,0,1/10,4,1 +"Hybrid Manager HM200",heatpump,248,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.heatpump_drain_pan_temp_(TA4),sensor.heatpump_hpta4,9,0,1/10,5,1 +"Hybrid Manager HM200",heatpump,248,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_temperature_(TR1),sensor.heatpump_hptr1,9,0,1/10,6,1 +"Hybrid Manager HM200",heatpump,248,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.heatpump_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.heatpump_hptr3,9,0,1/10,7,1 +"Hybrid Manager HM200",heatpump,248,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.heatpump_evaporator_inlet_temperature_(TR4),sensor.heatpump_hptr4,9,0,1/10,8,1 +"Hybrid Manager HM200",heatpump,248,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_inlet_temperature_(TR5),sensor.heatpump_hptr5,9,0,1/10,9,1 +"Hybrid Manager HM200",heatpump,248,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_outlet_temperature_(TR6),sensor.heatpump_hptr6,9,0,1/10,10,1 +"Hybrid Manager HM200",heatpump,248,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.heatpump_air_inlet_temperature_(TL2),sensor.heatpump_hptl2,9,0,1/10,11,1 +"Hybrid Manager HM200",heatpump,248,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.heatpump_low_pressure_side_temperature_(PL1),sensor.heatpump_hppl1,9,0,1/10,12,1 +"Hybrid Manager HM200",heatpump,248,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.heatpump_high_pressure_side_temperature_(PH1),sensor.heatpump_hpph1,9,0,1/10,13,1 +"Hybrid Manager HM200",heatpump,248,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.heatpump_heating_pump_modulation,sensor.heatpump_heatingpumpmod,9,0,1,14,1 +"Hybrid Manager HM200",heatpump,248,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.heatpump_compressor_speed,sensor.heatpump_hpcompspd,9,0,1,15,1 +"Hybrid Manager HM200",heatpump,248,hybridstrategy,hybrid control strategy,enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only], ,true,select.heatpump_hybrid_control_strategy,select.heatpump_hybridstrategy,9,0,1,16,1 +"Hybrid Manager HM200",heatpump,248,lownoisemode,low noise mode,enum [off\|reduced output\|switch off hp\|perm. reduced], ,true,select.heatpump_low_noise_mode,select.heatpump_lownoisemode,9,0,1,17,1 +"Hybrid Manager HM200",heatpump,248,lownoisestart,low noise starttime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_starttime,number.heatpump_lownoisestart,9,0,1,18,1 +"Hybrid Manager HM200",heatpump,248,lownoisestop,low noise stoptime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_stoptime,number.heatpump_lownoisestop,9,0,1,19,1 +"Hybrid Manager HM200",heatpump,248,dhw.hybriddhw,hybrid DHW,enum [eco\|high comfort], ,true,select.heatpump_dhw_hybrid_DHW,select.heatpump_dhw_hybriddhw,9,9,1,0,1 +"Hybrid Manager HM200",heatpump,248,energypricegas,energy price gas,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_gas,number.heatpump_energypricegas,9,0,1,20,1 +"Hybrid Manager HM200",heatpump,248,energypriceel,energy price electric,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_electric,number.heatpump_energypriceel,9,0,1,21,1 +"Hybrid Manager HM200",heatpump,248,energyfeedpv,feed in PV,uint8 (>=0<=254),ct/kWh,true,number.heatpump_feed_in_PV,number.heatpump_energyfeedpv,9,0,1,22,1 +"Hybrid Manager HM200",heatpump,248,switchovertemp,outside switchover temperature,int8 (>=-126<=126),C,true,number.heatpump_outside_switchover_temperature,number.heatpump_switchovertemp,9,0,1,23,1 +"Hybrid Manager HM200",heatpump,248,airpurgemode,air purge mode,boolean, ,true,switch.heatpump_air_purge_mode,switch.heatpump_airpurgemode,9,0,1,24,1 +"Hybrid Manager HM200",heatpump,248,heatpumpoutput,heatpump output,uint8 (>=0<=100),%,true,number.heatpump_heatpump_output,number.heatpump_heatpumpoutput,9,0,1,25,1 +"Hybrid Manager HM200",heatpump,248,coolingcircuit,cooling circuit,boolean, ,true,switch.heatpump_cooling_circuit,switch.heatpump_coolingcircuit,9,0,1,26,1 +"Hybrid Manager HM200",heatpump,248,compstartmod,compressor start modulation,uint8 (>=0<=100),%,true,number.heatpump_compressor_start_modulation,number.heatpump_compstartmod,9,0,1,27,1 +"Hybrid Manager HM200",heatpump,248,heatdrainpan,heat drain pan,boolean, ,true,switch.heatpump_heat_drain_pan,switch.heatpump_heatdrainpan,9,0,1,28,1 +"Hybrid Manager HM200",heatpump,248,heatcable,heating cable,boolean, ,true,switch.heatpump_heating_cable,switch.heatpump_heatcable,9,0,1,29,1 +"Hybrid Manager HM200",heatpump,248,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_total_energy,sensor.heatpump_nrgtotal,9,0,1/100,30,2 +"Hybrid Manager HM200",heatpump,248,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_energy,sensor.heatpump_dhw_nrg,9,9,1/100,1,2 +"Hybrid Manager HM200",heatpump,248,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_energy_heating,sensor.heatpump_nrgheat,9,0,1/100,32,2 +"Hybrid Manager HM200",heatpump,248,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_total,sensor.heatpump_metertotal,9,0,1/100,34,2 +"Hybrid Manager HM200",heatpump,248,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_compressor,sensor.heatpump_metercomp,9,0,1/100,36,2 +"Hybrid Manager HM200",heatpump,248,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_e-heater,sensor.heatpump_metereheat,9,0,1/100,38,2 +"Hybrid Manager HM200",heatpump,248,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_heating,sensor.heatpump_meterheat,9,0,1/100,40,2 +"Hybrid Manager HM200",heatpump,248,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_meter,sensor.heatpump_dhw_meter,9,9,1/100,3,2 +"Hybrid Manager HM200",heatpump,248,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.heatpump_heating_control_starts,sensor.heatpump_heatingstarts,9,0,1,42,2 +"Hybrid Manager HM200",heatpump,248,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.heatpump_dhw_starts_hp,sensor.heatpump_dhw_startshp,9,9,1,5,2 +"Hybrid Manager HM200",heatpump,248,fuelheat,fuel consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_fuel_consumption_heating,sensor.heatpump_fuelheat,9,0,1/10,44,2 +"Hybrid Manager HM200",heatpump,248,dhw.fueldhw,fuel consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_fuel_consumption,sensor.heatpump_dhw_fueldhw,9,9,1/10,7,2 +"Hybrid Manager HM200",heatpump,248,elheat,el. consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._consumption_heating,sensor.heatpump_elheat,9,0,1/10,46,2 +"Hybrid Manager HM200",heatpump,248,dhw.eldhw,el. consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el._consumption,sensor.heatpump_dhw_eldhw,9,9,1/10,9,2 +"Hybrid Manager HM200",heatpump,248,elgenheat,el. generation heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._generation_heating,sensor.heatpump_elgenheat,9,0,1/10,48,2 +"Hybrid Manager HM200",heatpump,248,dhw.elgendhw,el generation,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el_generation,sensor.heatpump_dhw_elgendhw,9,9,1/10,11,2 +"CSH5800iG",heatpump,16,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.heatpump_relative_air_humidity,sensor.heatpump_airhumidity,9,0,1,0,1 +"CSH5800iG",heatpump,16,dewtemperature,dew point temperature,uint8 (>=0<=254),C,false,sensor.heatpump_dew_point_temperature,sensor.heatpump_dewtemperature,9,0,1,1,1 +"CSH5800iG",heatpump,16,curflowtemp,current flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_current_flow_temperature,sensor.heatpump_curflowtemp,9,0,1/10,2,1 +"CSH5800iG",heatpump,16,rettemp,return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_return_temperature,sensor.heatpump_rettemp,9,0,1/10,3,1 +"CSH5800iG",heatpump,16,sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatpump_system_return_temperature,sensor.heatpump_sysrettemp,9,0,1/10,4,1 +"CSH5800iG",heatpump,16,hpta4,drain pan temp (TA4),int16 (>=-3199<=3199),C,false,sensor.heatpump_drain_pan_temp_(TA4),sensor.heatpump_hpta4,9,0,1/10,5,1 +"CSH5800iG",heatpump,16,hptr1,compressor temperature (TR1),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_temperature_(TR1),sensor.heatpump_hptr1,9,0,1/10,6,1 +"CSH5800iG",heatpump,16,hptr3,refrigerant temperature liquid side (condenser output) (TR3),int16 (>=-3199<=3199),C,false,sensor.heatpump_refrigerant_temperature_liquid_side_(condenser_output)_(TR3),sensor.heatpump_hptr3,9,0,1/10,7,1 +"CSH5800iG",heatpump,16,hptr4,evaporator inlet temperature (TR4),int16 (>=-3199<=3199),C,false,sensor.heatpump_evaporator_inlet_temperature_(TR4),sensor.heatpump_hptr4,9,0,1/10,8,1 +"CSH5800iG",heatpump,16,hptr5,compressor inlet temperature (TR5),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_inlet_temperature_(TR5),sensor.heatpump_hptr5,9,0,1/10,9,1 +"CSH5800iG",heatpump,16,hptr6,compressor outlet temperature (TR6),int16 (>=-3199<=3199),C,false,sensor.heatpump_compressor_outlet_temperature_(TR6),sensor.heatpump_hptr6,9,0,1/10,10,1 +"CSH5800iG",heatpump,16,hptl2,air inlet temperature (TL2),int16 (>=-3199<=3199),C,false,sensor.heatpump_air_inlet_temperature_(TL2),sensor.heatpump_hptl2,9,0,1/10,11,1 +"CSH5800iG",heatpump,16,hppl1,low pressure side temperature (PL1),int16 (>=-3199<=3199),C,false,sensor.heatpump_low_pressure_side_temperature_(PL1),sensor.heatpump_hppl1,9,0,1/10,12,1 +"CSH5800iG",heatpump,16,hpph1,high pressure side temperature (PH1),int16 (>=-3199<=3199),C,false,sensor.heatpump_high_pressure_side_temperature_(PH1),sensor.heatpump_hpph1,9,0,1/10,13,1 +"CSH5800iG",heatpump,16,heatingpumpmod,heating pump modulation,uint8 (>=0<=100),%,false,sensor.heatpump_heating_pump_modulation,sensor.heatpump_heatingpumpmod,9,0,1,14,1 +"CSH5800iG",heatpump,16,hpcompspd,compressor speed,uint8 (>=0<=100),%,false,sensor.heatpump_compressor_speed,sensor.heatpump_hpcompspd,9,0,1,15,1 +"CSH5800iG",heatpump,16,hybridstrategy,hybrid control strategy,enum [cost optimized\|co2 optimized\|outside temperature alt.\|outside temperature parallel\|heatpump preferred\|boiler only], ,true,select.heatpump_hybrid_control_strategy,select.heatpump_hybridstrategy,9,0,1,16,1 +"CSH5800iG",heatpump,16,lownoisemode,low noise mode,enum [off\|reduced output\|switch off hp\|perm. reduced], ,true,select.heatpump_low_noise_mode,select.heatpump_lownoisemode,9,0,1,17,1 +"CSH5800iG",heatpump,16,lownoisestart,low noise starttime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_starttime,number.heatpump_lownoisestart,9,0,1,18,1 +"CSH5800iG",heatpump,16,lownoisestop,low noise stoptime,uint8 (>=0<=23),hours,true,number.heatpump_low_noise_stoptime,number.heatpump_lownoisestop,9,0,1,19,1 +"CSH5800iG",heatpump,16,dhw.hybriddhw,hybrid DHW,enum [eco\|high comfort], ,true,select.heatpump_dhw_hybrid_DHW,select.heatpump_dhw_hybriddhw,9,9,1,0,1 +"CSH5800iG",heatpump,16,energypricegas,energy price gas,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_gas,number.heatpump_energypricegas,9,0,1,20,1 +"CSH5800iG",heatpump,16,energypriceel,energy price electric,uint8 (>=0<=254),ct/kWh,true,number.heatpump_energy_price_electric,number.heatpump_energypriceel,9,0,1,21,1 +"CSH5800iG",heatpump,16,energyfeedpv,feed in PV,uint8 (>=0<=254),ct/kWh,true,number.heatpump_feed_in_PV,number.heatpump_energyfeedpv,9,0,1,22,1 +"CSH5800iG",heatpump,16,switchovertemp,outside switchover temperature,int8 (>=-126<=126),C,true,number.heatpump_outside_switchover_temperature,number.heatpump_switchovertemp,9,0,1,23,1 +"CSH5800iG",heatpump,16,airpurgemode,air purge mode,boolean, ,true,switch.heatpump_air_purge_mode,switch.heatpump_airpurgemode,9,0,1,24,1 +"CSH5800iG",heatpump,16,heatpumpoutput,heatpump output,uint8 (>=0<=100),%,true,number.heatpump_heatpump_output,number.heatpump_heatpumpoutput,9,0,1,25,1 +"CSH5800iG",heatpump,16,coolingcircuit,cooling circuit,boolean, ,true,switch.heatpump_cooling_circuit,switch.heatpump_coolingcircuit,9,0,1,26,1 +"CSH5800iG",heatpump,16,compstartmod,compressor start modulation,uint8 (>=0<=100),%,true,number.heatpump_compressor_start_modulation,number.heatpump_compstartmod,9,0,1,27,1 +"CSH5800iG",heatpump,16,heatdrainpan,heat drain pan,boolean, ,true,switch.heatpump_heat_drain_pan,switch.heatpump_heatdrainpan,9,0,1,28,1 +"CSH5800iG",heatpump,16,heatcable,heating cable,boolean, ,true,switch.heatpump_heating_cable,switch.heatpump_heatcable,9,0,1,29,1 +"CSH5800iG",heatpump,16,nrgtotal,total energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_total_energy,sensor.heatpump_nrgtotal,9,0,1/100,30,2 +"CSH5800iG",heatpump,16,dhw.nrg,energy,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_energy,sensor.heatpump_dhw_nrg,9,9,1/100,1,2 +"CSH5800iG",heatpump,16,nrgheat,energy heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_energy_heating,sensor.heatpump_nrgheat,9,0,1/100,32,2 +"CSH5800iG",heatpump,16,metertotal,meter total,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_total,sensor.heatpump_metertotal,9,0,1/100,34,2 +"CSH5800iG",heatpump,16,metercomp,meter compressor,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_compressor,sensor.heatpump_metercomp,9,0,1/100,36,2 +"CSH5800iG",heatpump,16,metereheat,meter e-heater,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_e-heater,sensor.heatpump_metereheat,9,0,1/100,38,2 +"CSH5800iG",heatpump,16,meterheat,meter heating,uint24 (>=0<=167772),kWh,false,sensor.heatpump_meter_heating,sensor.heatpump_meterheat,9,0,1/100,40,2 +"CSH5800iG",heatpump,16,dhw.meter,meter,uint24 (>=0<=167772),kWh,false,sensor.heatpump_dhw_meter,sensor.heatpump_dhw_meter,9,9,1/100,3,2 +"CSH5800iG",heatpump,16,heatingstarts,heating control starts,uint24 (>=0<=16777214), ,false,sensor.heatpump_heating_control_starts,sensor.heatpump_heatingstarts,9,0,1,42,2 +"CSH5800iG",heatpump,16,dhw.startshp,starts hp,uint24 (>=0<=16777214), ,false,sensor.heatpump_dhw_starts_hp,sensor.heatpump_dhw_startshp,9,9,1,5,2 +"CSH5800iG",heatpump,16,fuelheat,fuel consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_fuel_consumption_heating,sensor.heatpump_fuelheat,9,0,1/10,44,2 +"CSH5800iG",heatpump,16,dhw.fueldhw,fuel consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_fuel_consumption,sensor.heatpump_dhw_fueldhw,9,9,1/10,7,2 +"CSH5800iG",heatpump,16,elheat,el. consumption heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._consumption_heating,sensor.heatpump_elheat,9,0,1/10,46,2 +"CSH5800iG",heatpump,16,dhw.eldhw,el. consumption,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el._consumption,sensor.heatpump_dhw_eldhw,9,9,1/10,9,2 +"CSH5800iG",heatpump,16,elgenheat,el. generation heating,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_el._generation_heating,sensor.heatpump_elgenheat,9,0,1/10,48,2 +"CSH5800iG",heatpump,16,dhw.elgendhw,el generation,uint32 (>=0<=1677721),kWh,false,sensor.heatpump_dhw_el_generation,sensor.heatpump_dhw_elgendhw,9,9,1/10,11,2 +"WM10",switch,71,activated,activated,boolean, ,false,binary_sensor.switch_activated,binary_sensor.switch_activated,11,0,1,0,1 +"WM10",switch,71,flowtemphc,flow temperature (TC1),uint16 (>=0<=3199),C,false,sensor.switch_flow_temperature_(TC1),sensor.switch_flowtemphc,11,0,1/10,1,1 +"WM10",switch,71,status,status,int8 (>=-126<=126), ,false,sensor.switch_status,sensor.switch_status,11,0,1,2,1 +"Rego 3000",controller,240,datetime,date/time,string, ,false,sensor.controller_date/time,sensor.controller_datetime,12,0,1,0,13 +"MX400",connect,17,datetime,date/time,string, ,false,sensor.connect_date/time,sensor.connect_datetime,13,0,1,0,13 +"MX400",connect,17,outdoortemp,outside temperature,int16 (>=-3199<=3199),C,false,sensor.connect_outside_temperature,sensor.connect_outdoortemp,13,0,1/10,13,1 +"MX400",connect,17,src1.currtemp,current room temperature,int16 (>=-3199<=3199),C,false,sensor.connect_src1_current_room_temperature,sensor.connect_src1_currtemp,13,36,1/10,0,1 +"MX400",connect,17,src1.airhumidity,relative air humidity,int8 (>=-100<=100),%,false,sensor.connect_src1_relative_air_humidity,sensor.connect_src1_airhumidity,13,36,1,1,1 +"MX400",connect,17,src1.dewtemperature,dew point temperature,int16 (>=-3199<=3199),C,false,sensor.connect_src1_dew_point_temperature,sensor.connect_src1_dewtemperature,13,36,1/10,2,1 +"MX400",connect,17,src1.seltemp,selected room temperature,uint8 (>=5<=30),C,true,number.connect_src1_selected_room_temperature,number.connect_src1_seltemp,13,36,1/2,3,1 +"MX400",connect,17,src1.mode,operating mode,enum [off\|manual\|auto], ,true,select.connect_src1_operating_mode,select.connect_src1_mode,13,36,1,4,1 +"MX400",connect,17,src1.name,name,string, ,true,sensor.connect_src1_name,sensor.connect_src1_name,13,36,1,5,26 +"MX400",connect,17,src1.childlock,child lock,boolean, ,true,switch.connect_src1_child_lock,switch.connect_src1_childlock,13,36,1,31,1 +"MX400",connect,17,src1.icon,icon,enum [none\|mdi:chef-hat\|mdi:sofa-single-outline\|mdi:bowl-mix-outline\|mdi:bed-single-outline\|mdi:bed-double-outline\|mdi:teddy-bear\|mdi:shower\|mdi:laptop\|mdi:door\|mdi:palette-outline\|mdi:washing-machine\|mdi:bookshelf], ,true,select.connect_src1_icon,select.connect_src1_icon,13,36,1,32,1 +"EM10",alert,74,setflowtemp,set flow temperature,uint8 (>=0<=254),C,false,sensor.alert_set_flow_temperature,sensor.alert_setflowtemp,14,0,1,0,1 +"EM10",alert,74,setburnpow,burner set power,uint8 (>=0<=100),%,false,sensor.alert_burner_set_power,sensor.alert_setburnpow,14,0,1,1,1 +"EM10, EM100",extension,243,flowtempvf,flow temperature in header (T0/Vf),int16 (>=-3199<=3199),C,false,sensor.extension_flow_temperature_in_header_(T0/Vf),sensor.extension_flowtempvf,15,0,1/10,0,1 +"EM10, EM100",extension,243,input,input,uint8 (>=0<=25),V,false,sensor.extension_input,sensor.extension_input,15,0,1/10,1,1 +"EM10, EM100",extension,243,outpow,output IO1,uint8 (>=0<=100),%,false,sensor.extension_output_IO1,sensor.extension_outpow,15,0,1,2,1 +"EM10, EM100",extension,243,setpower,request power,uint8 (>=0<=100),%,false,sensor.extension_request_power,sensor.extension_setpower,15,0,1,3,1 +"EM10, EM100",extension,243,setpoint,set temp.,uint8 (>=0<=254),C,false,sensor.extension_set_temp.,sensor.extension_setpoint,15,0,1,4,1 +"EM10, EM100",extension,243,minv,min volt.,uint8 (>=0<=25),V,true,number.extension_min_volt.,number.extension_minv,15,0,1/10,5,1 +"EM10, EM100",extension,243,maxv,max volt.,uint8 (>=0<=25),V,true,number.extension_max_volt.,number.extension_maxv,15,0,1/10,6,1 +"EM10, EM100",extension,243,mint,min temp.,uint8 (>=0<=254),C,true,number.extension_min_temp.,number.extension_mint,15,0,1,7,1 +"EM10, EM100",extension,243,maxt,max temp.,uint8 (>=0<=254),C,true,number.extension_max_temp.,number.extension_maxt,15,0,1,8,1 +"EM10, EM100",extension,243,mode,operating mode,uint8 (>=0<=254), ,false,sensor.extension_operating_mode,sensor.extension_mode,15,0,1,9,1 +"T1RF",extension,220,flowtempvf,flow temperature in header (T0/Vf),int16 (>=-3199<=3199),C,false,sensor.extension_flow_temperature_in_header_(T0/Vf),sensor.extension_flowtempvf,15,0,1/10,0,1 +"T1RF",extension,220,input,input,uint8 (>=0<=25),V,false,sensor.extension_input,sensor.extension_input,15,0,1/10,1,1 +"T1RF",extension,220,outpow,output IO1,uint8 (>=0<=100),%,false,sensor.extension_output_IO1,sensor.extension_outpow,15,0,1,2,1 +"T1RF",extension,220,setpower,request power,uint8 (>=0<=100),%,false,sensor.extension_request_power,sensor.extension_setpower,15,0,1,3,1 +"T1RF",extension,220,setpoint,set temp.,uint8 (>=0<=254),C,false,sensor.extension_set_temp.,sensor.extension_setpoint,15,0,1,4,1 +"T1RF",extension,220,minv,min volt.,uint8 (>=0<=25),V,true,number.extension_min_volt.,number.extension_minv,15,0,1/10,5,1 +"T1RF",extension,220,maxv,max volt.,uint8 (>=0<=25),V,true,number.extension_max_volt.,number.extension_maxv,15,0,1/10,6,1 +"T1RF",extension,220,mint,min temp.,uint8 (>=0<=254),C,true,number.extension_min_temp.,number.extension_mint,15,0,1,7,1 +"T1RF",extension,220,maxt,max temp.,uint8 (>=0<=254),C,true,number.extension_max_temp.,number.extension_maxt,15,0,1,8,1 +"T1RF",extension,220,mode,operating mode,uint8 (>=0<=254), ,false,sensor.extension_operating_mode,sensor.extension_mode,15,0,1,9,1 +"AM200",heatsource,228,ahs1.sysflowtemp,system flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_system_flow_temperature,sensor.heatsource_ahs1_sysflowtemp,17,19,1/10,0,1 +"AM200",heatsource,228,ahs1.sysrettemp,system return temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_system_return_temperature,sensor.heatsource_ahs1_sysrettemp,17,19,1/10,1,1 +"AM200",heatsource,228,ahs1.altflowtemp,alternative hs flow temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_alternative_hs_flow_temperature,sensor.heatsource_ahs1_altflowtemp,17,19,1/10,2,1 +"AM200",heatsource,228,ahs1.altrettemp,alternative hs return temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_alternative_hs_return_temperature,sensor.heatsource_ahs1_altrettemp,17,19,1/10,3,1 +"AM200",heatsource,228,ahs1.cyltoptemp,cylinder top temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_cylinder_top_temperature,sensor.heatsource_ahs1_cyltoptemp,17,19,1/10,4,1 +"AM200",heatsource,228,ahs1.cylcentertemp,cylinder center temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_cylinder_center_temperature,sensor.heatsource_ahs1_cylcentertemp,17,19,1/10,5,1 +"AM200",heatsource,228,ahs1.cylbottomtemp,cylinder bottom temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_cylinder_bottom_temperature,sensor.heatsource_ahs1_cylbottomtemp,17,19,1/10,6,1 +"AM200",heatsource,228,ahs1.fluegastemp,flue gas temperature,int16 (>=-3199<=3199),C,false,sensor.heatsource_ahs1_flue_gas_temperature,sensor.heatsource_ahs1_fluegastemp,17,19,1/10,7,1 +"AM200",heatsource,228,ahs1.valvebuffer,buffer valve,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_buffer_valve,sensor.heatsource_ahs1_valvebuffer,17,19,1,8,1 +"AM200",heatsource,228,ahs1.valvereturn,return valve,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_return_valve,sensor.heatsource_ahs1_valvereturn,17,19,1,9,1 +"AM200",heatsource,228,ahs1.apumpmod,alternative hs pump modulation,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_alternative_hs_pump_modulation,sensor.heatsource_ahs1_apumpmod,17,19,1,10,1 +"AM200",heatsource,228,ahs1.vr2config,vr2 configuration,enum [off\|bypass], ,true,select.heatsource_ahs1_vr2_configuration,select.heatsource_ahs1_vr2config,17,19,1,11,1 +"AM200",heatsource,228,ahs1.ahsactivated,alternate heat source activation,boolean, ,true,switch.heatsource_ahs1_alternate_heat_source_activation,switch.heatsource_ahs1_ahsactivated,17,19,1,12,1 +"AM200",heatsource,228,ahs1.apumpconfig,primary pump config,boolean, ,true,switch.heatsource_ahs1_primary_pump_config,switch.heatsource_ahs1_apumpconfig,17,19,1,13,1 +"AM200",heatsource,228,ahs1.apumpsignal,output for pr1 pump,enum [off\|pwm\|pwm inverse], ,true,select.heatsource_ahs1_output_for_pr1_pump,select.heatsource_ahs1_apumpsignal,17,19,1,14,1 +"AM200",heatsource,228,ahs1.apumpmin,min output pump pr1,uint8 (>=12<=50),%,true,number.heatsource_ahs1_min_output_pump_pr1,number.heatsource_ahs1_apumpmin,17,19,1,15,1 +"AM200",heatsource,228,ahs1.temprise,ahs return temp rise,boolean, ,true,switch.heatsource_ahs1_ahs_return_temp_rise,switch.heatsource_ahs1_temprise,17,19,1,16,1 +"AM200",heatsource,228,ahs1.setreturntemp,set temp return,uint8 (>=40<=75),C,true,number.heatsource_ahs1_set_temp_return,number.heatsource_ahs1_setreturntemp,17,19,1,17,1 +"AM200",heatsource,228,ahs1.mixruntime,mixer run time,uint16 (>=0<=600),seconds,true,number.heatsource_ahs1_mixer_run_time,number.heatsource_ahs1_mixruntime,17,19,1,18,1 +"AM200",heatsource,228,ahs1.setflowtemp,set flow temperature,uint8 (>=40<=75),C,true,number.heatsource_ahs1_set_flow_temperature,number.heatsource_ahs1_setflowtemp,17,19,1,19,1 +"AM200",heatsource,228,ahs1.bufbypass,buffer bypass config,enum [no\|mixer\|valve], ,true,select.heatsource_ahs1_buffer_bypass_config,select.heatsource_ahs1_bufbypass,17,19,1,20,1 +"AM200",heatsource,228,ahs1.bufmixruntime,bypass mixer run time,uint16 (>=0<=600),seconds,true,number.heatsource_ahs1_bypass_mixer_run_time,number.heatsource_ahs1_bufmixruntime,17,19,1,21,1 +"AM200",heatsource,228,ahs1.bufconfig,dhw buffer config,enum [off\|monovalent\|bivalent], ,true,select.heatsource_ahs1_dhw_buffer_config,select.heatsource_ahs1_bufconfig,17,19,1,22,1 +"AM200",heatsource,228,ahs1.blockmode,config htg. blocking mode,enum [off\|auto\|blocking], ,true,select.heatsource_ahs1_config_htg._blocking_mode,select.heatsource_ahs1_blockmode,17,19,1,23,1 +"AM200",heatsource,228,ahs1.blockterm,config of block terminal,enum [n_o\|n_c], ,true,select.heatsource_ahs1_config_of_block_terminal,select.heatsource_ahs1_blockterm,17,19,1,24,1 +"AM200",heatsource,228,ahs1.blockhyst,hyst. for boiler block,int8 (>=0<=50),C,true,number.heatsource_ahs1_hyst._for_boiler_block,number.heatsource_ahs1_blockhyst,17,19,1,25,1 +"AM200",heatsource,228,ahs1.releasewait,boiler release wait time,uint8 (>=0<=240),minutes,true,number.heatsource_ahs1_boiler_release_wait_time,number.heatsource_ahs1_releasewait,17,19,1,26,1 +"AM200",heatsource,228,ahs1.burner,burner,boolean, ,false,binary_sensor.heatsource_ahs1_burner,binary_sensor.heatsource_ahs1_burner,17,19,1,27,1 +"AM200",heatsource,228,ahs1.apump,alternative hs pump,boolean, ,false,binary_sensor.heatsource_ahs1_alternative_hs_pump,binary_sensor.heatsource_ahs1_apump,17,19,1,28,1 +"AM200",heatsource,228,ahs1.heatrequest,heat request,uint8 (>=0<=100),%,false,sensor.heatsource_ahs1_heat_request,sensor.heatsource_ahs1_heatrequest,17,19,1,29,1 +"AM200",heatsource,228,ahs1.blockremain,remaining blocktime,uint8 (>=0<=254),minutes,false,sensor.heatsource_ahs1_remaining_blocktime,sensor.heatsource_ahs1_blockremain,17,19,1,30,1 +"AM200",heatsource,228,ahs1.blockremaindhw,remaining blocktime dhw,uint8 (>=0<=254),minutes,false,sensor.heatsource_ahs1_remaining_blocktime_dhw,sensor.heatsource_ahs1_blockremaindhw,17,19,1,31,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,outfresh,outdoor fresh air,int16 (>=-3199<=3199),C,false,sensor.ventilation_outdoor_fresh_air,sensor.ventilation_outfresh,18,0,1/10,0,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,infresh,indoor fresh air,int16 (>=-3199<=3199),C,false,sensor.ventilation_indoor_fresh_air,sensor.ventilation_infresh,18,0,1/10,1,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,outexhaust,outdoor exhaust air,int16 (>=-3199<=3199),C,false,sensor.ventilation_outdoor_exhaust_air,sensor.ventilation_outexhaust,18,0,1/10,2,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,inexhaust,indoor exhaust air,int16 (>=-3199<=3199),C,false,sensor.ventilation_indoor_exhaust_air,sensor.ventilation_inexhaust,18,0,1/10,3,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,ventinspeed,in blower speed,uint8 (>=0<=100),%,false,sensor.ventilation_in_blower_speed,sensor.ventilation_ventinspeed,18,0,1,4,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,ventoutspeed,out blower speed,uint8 (>=0<=100),%,false,sensor.ventilation_out_blower_speed,sensor.ventilation_ventoutspeed,18,0,1,5,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,ventmode,ventilation mode,enum [auto\|off\|L1\|L2\|L3\|L4\|demand\|sleep\|intense\|bypass\|party\|fireplace], ,true,select.ventilation_ventilation_mode,select.ventilation_ventmode,18,0,1,6,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,airquality,air quality (voc),uint16 (>=0<=31999), ,false,sensor.ventilation_air_quality_(voc),sensor.ventilation_airquality,18,0,1,7,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,airhumidity,relative air humidity,uint8 (>=0<=100),%,false,sensor.ventilation_relative_air_humidity,sensor.ventilation_airhumidity,18,0,1,8,1 +"HRV176, HRV156, 5000c, MV200",ventilation,231,bypass,bypass,boolean, ,true,switch.ventilation_bypass,switch.ventilation_bypass,18,0,1,9,1 +"IPM",water,100,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 +"IPM",water,100,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 +"IPM",water,100,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_extern_temperature,sensor.water_dhw_curtemp2,19,9,1/10,2,1 +"IPM",water,100,dhw.hydrTemp,hydraulic header temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_hydraulic_header_temperature,sensor.water_dhw_hydrTemp,19,9,1/10,3,1 +"IPM",water,100,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 +"IPM",water,100,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=254),C,true,number.water_dhw_flow_temperature_offset,number.water_dhw_flowtempoffset,19,9,1,5,1 +"IPM",water,100,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_on_temperature,number.water_dhw_hyston,19,9,1,6,1 +"IPM",water,100,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_off_temperature,number.water_dhw_hystoff,19,9,1,7,1 +"IPM",water,100,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 +"IPM",water,100,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 +"IPM",water,100,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 +"IPM2",water,102,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 +"IPM2",water,102,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 +"IPM2",water,102,dhw.curtemp2,current extern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_extern_temperature,sensor.water_dhw_curtemp2,19,9,1/10,2,1 +"IPM2",water,102,dhw.hydrTemp,hydraulic header temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_hydraulic_header_temperature,sensor.water_dhw_hydrTemp,19,9,1/10,3,1 +"IPM2",water,102,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 +"IPM2",water,102,dhw.flowtempoffset,flow temperature offset,uint8 (>=0<=254),C,true,number.water_dhw_flow_temperature_offset,number.water_dhw_flowtempoffset,19,9,1,5,1 +"IPM2",water,102,dhw.hyston,hysteresis on temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_on_temperature,number.water_dhw_hyston,19,9,1,6,1 +"IPM2",water,102,dhw.hystoff,hysteresis off temperature,int8 (>=-126<=126),C,true,number.water_dhw_hysteresis_off_temperature,number.water_dhw_hystoff,19,9,1,7,1 +"IPM2",water,102,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 +"IPM2",water,102,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 +"IPM2",water,102,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 +"MM100",water,160,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 +"MM100",water,160,dhw.tempstatus,temperature switch in assigned dhw (MC1),int8 (>=-126<=126), ,false,sensor.water_dhw_temperature_switch_in_assigned_dhw_(MC1),sensor.water_dhw_tempstatus,19,9,1,11,1 +"MM100",water,160,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 +"MM100",water,160,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 +"MM100",water,160,dhw.difftemp,start differential temperature,int8 (>=-126<=126),C,true,number.water_dhw_start_differential_temperature,number.water_dhw_difftemp,19,9,1,13,1 +"MM100",water,160,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 +"MM100",water,160,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 +"MM100",water,160,dhw.requiredtemp,required temperature,uint8 (>=0<=254),C,true,number.water_dhw_required_temperature,number.water_dhw_requiredtemp,19,9,1,15,1 +"MM100",water,160,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 +"MM100",water,160,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 +"MM200",water,161,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 +"MM200",water,161,dhw.tempstatus,temperature switch in assigned dhw (MC1),int8 (>=-126<=126), ,false,sensor.water_dhw_temperature_switch_in_assigned_dhw_(MC1),sensor.water_dhw_tempstatus,19,9,1,11,1 +"MM200",water,161,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 +"MM200",water,161,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 +"MM200",water,161,dhw.difftemp,start differential temperature,int8 (>=-126<=126),C,true,number.water_dhw_start_differential_temperature,number.water_dhw_difftemp,19,9,1,13,1 +"MM200",water,161,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 +"MM200",water,161,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 +"MM200",water,161,dhw.requiredtemp,required temperature,uint8 (>=0<=254),C,true,number.water_dhw_required_temperature,number.water_dhw_requiredtemp,19,9,1,15,1 +"MM200",water,161,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 +"MM200",water,161,dhw.circmode,circulation pump mode,enum [off\|on\|auto\|own prog], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 +"SM100, MS100",water,163,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 +"SM100, MS100",water,163,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_storage_intern_temperature,sensor.water_dhw_storagetemp1,19,9,1/10,16,1 +"SM100, MS100",water,163,dhw.coldtemp,cold water,uint16 (>=0<=3199),C,false,sensor.water_dhw_cold_water,sensor.water_dhw_coldtemp,19,9,1/10,17,1 +"SM100, MS100",water,163,dhw.temp5,temperature 5,uint16 (>=0<=3199),C,false,sensor.water_dhw_temperature_5,sensor.water_dhw_temp5,19,9,1/10,18,1 +"SM100, MS100",water,163,dhw.rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_return_temperature,sensor.water_dhw_rettemp,19,9,1/10,19,1 +"SM100, MS100",water,163,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 +"SM100, MS100",water,163,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 +"SM100, MS100",water,163,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 +"SM100, MS100",water,163,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 +"SM100, MS100",water,163,dhw.hottemp,extra hot temperature,uint8 (>=0<=254),C,true,number.water_dhw_extra_hot_temperature,number.water_dhw_hottemp,19,9,1,20,1 +"SM100, MS100",water,163,dhw.dailytemp,daily temperature,uint8 (>=0<=254),C,true,number.water_dhw_daily_temperature,number.water_dhw_dailytemp,19,9,1,21,1 +"SM100, MS100",water,163,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 +"SM100, MS100",water,163,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 +"SM100, MS100",water,163,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 +"SM100, MS100",water,163,dhw.circtc,circulation time controlled,boolean, ,true,switch.water_dhw_circulation_time_controlled,switch.water_dhw_circtc,19,9,1,22,1 +"SM100, MS100",water,163,dhw.keepwarm,keep warm,boolean, ,true,switch.water_dhw_keep_warm,switch.water_dhw_keepwarm,19,9,1,23,1 +"SM100, MS100",water,163,dhw.status2,status 2,enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold], ,false,sensor.water_dhw_status_2,sensor.water_dhw_status2,19,9,1,24,1 +"SM100, MS100",water,163,dhw.pumpmod,pump modulation,uint8 (>=0<=100),%,false,sensor.water_dhw_pump_modulation,sensor.water_dhw_pumpmod,19,9,1,25,1 +"SM100, MS100",water,163,dhw.flow,flow rate,uint16 (>=0<=3199),l/min,false,sensor.water_dhw_flow_rate,sensor.water_dhw_flow,19,9,1/10,26,1 +"SM100, MS100",water,163,dhw.valvereturn,return valve,uint8 (>=0<=100),%,true,number.water_dhw_return_valve,number.water_dhw_valvereturn,19,9,1,27,1 +"SM100, MS100",water,163,dhw.deltatret,temp. diff. return valve,uint8 (>=0<=254),K,true,number.water_dhw_temp._diff._return_valve,number.water_dhw_deltatret,19,9,1,28,1 +"SM100, MS100",water,163,dhw.errordisp,error display,enum [off\|normal\|inverted], ,true,select.water_dhw_error_display,select.water_dhw_errordisp,19,9,1,29,1 +"SM200, MS200",water,164,dhw.temp,current temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_current_temperature,sensor.water_dhw_temp,19,9,1/10,1,1 +"SM200, MS200",water,164,dhw.storagetemp1,storage intern temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_storage_intern_temperature,sensor.water_dhw_storagetemp1,19,9,1/10,16,1 +"SM200, MS200",water,164,dhw.coldtemp,cold water,uint16 (>=0<=3199),C,false,sensor.water_dhw_cold_water,sensor.water_dhw_coldtemp,19,9,1/10,17,1 +"SM200, MS200",water,164,dhw.temp5,temperature 5,uint16 (>=0<=3199),C,false,sensor.water_dhw_temperature_5,sensor.water_dhw_temp5,19,9,1/10,18,1 +"SM200, MS200",water,164,dhw.rettemp,return temperature,uint16 (>=0<=3199),C,false,sensor.water_dhw_return_temperature,sensor.water_dhw_rettemp,19,9,1/10,19,1 +"SM200, MS200",water,164,dhw.pump,pump,boolean, ,false,binary_sensor.water_dhw_pump,binary_sensor.water_dhw_pump,19,9,1,4,1 +"SM200, MS200",water,164,dhw.maxtemp,maximum temperature,uint8 (>=0<=254),C,true,number.water_dhw_maximum_temperature,number.water_dhw_maxtemp,19,9,1,12,1 +"SM200, MS200",water,164,dhw.seltemp,selected temperature,uint8 (>=0<=254),C,true,number.water_dhw_selected_temperature,number.water_dhw_seltemp,19,9,1,0,1 +"SM200, MS200",water,164,dhw.redtemp,reduced temperature,uint8 (>=0<=254),C,true,number.water_dhw_reduced_temperature,number.water_dhw_redtemp,19,9,1,14,1 +"SM200, MS200",water,164,dhw.hottemp,extra hot temperature,uint8 (>=0<=254),C,true,number.water_dhw_extra_hot_temperature,number.water_dhw_hottemp,19,9,1,20,1 +"SM200, MS200",water,164,dhw.dailytemp,daily temperature,uint8 (>=0<=254),C,true,number.water_dhw_daily_temperature,number.water_dhw_dailytemp,19,9,1,21,1 +"SM200, MS200",water,164,dhw.disinfectiontemp,disinfection temperature,uint8 (>=0<=254),C,true,number.water_dhw_disinfection_temperature,number.water_dhw_disinfectiontemp,19,9,1,8,1 +"SM200, MS200",water,164,dhw.circ,circulation active,boolean, ,true,switch.water_dhw_circulation_active,switch.water_dhw_circ,19,9,1,9,1 +"SM200, MS200",water,164,dhw.circmode,circulation pump mode,enum [off\|1x3min\|2x3min\|3x3min\|4x3min\|5x3min\|6x3min\|continuous], ,true,select.water_dhw_circulation_pump_mode,select.water_dhw_circmode,19,9,1,10,1 +"SM200, MS200",water,164,dhw.circtc,circulation time controlled,boolean, ,true,switch.water_dhw_circulation_time_controlled,switch.water_dhw_circtc,19,9,1,22,1 +"SM200, MS200",water,164,dhw.keepwarm,keep warm,boolean, ,true,switch.water_dhw_keep_warm,switch.water_dhw_keepwarm,19,9,1,23,1 +"SM200, MS200",water,164,dhw.status2,status 2,enum [\|\|\|no heat\|\|\|heat request\|\|disinfecting\|hold], ,false,sensor.water_dhw_status_2,sensor.water_dhw_status2,19,9,1,24,1 +"SM200, MS200",water,164,dhw.pumpmod,pump modulation,uint8 (>=0<=100),%,false,sensor.water_dhw_pump_modulation,sensor.water_dhw_pumpmod,19,9,1,25,1 +"SM200, MS200",water,164,dhw.flow,flow rate,uint16 (>=0<=3199),l/min,false,sensor.water_dhw_flow_rate,sensor.water_dhw_flow,19,9,1/10,26,1 +"SM200, MS200",water,164,dhw.valvereturn,return valve,uint8 (>=0<=100),%,true,number.water_dhw_return_valve,number.water_dhw_valvereturn,19,9,1,27,1 +"SM200, MS200",water,164,dhw.deltatret,temp. diff. return valve,uint8 (>=0<=254),K,true,number.water_dhw_temp._diff._return_valve,number.water_dhw_deltatret,19,9,1,28,1 +"SM200, MS200",water,164,dhw.errordisp,error display,enum [off\|normal\|inverted], ,true,select.water_dhw_error_display,select.water_dhw_errordisp,19,9,1,29,1 +"MP100",pool,204,pooltemp,pool temperature,int16 (>=-3199<=3199),C,false,sensor.pool_pool_temperature,sensor.pool_pooltemp,20,0,1/10,-1,1 +"MP100",pool,204,poolshuntstatus,pool shunt status opening/closing,enum [stopped\|opening\|closing\|open\|close], ,false,sensor.pool_pool_shunt_status_opening/closing,sensor.pool_poolshuntstatus,20,0,1,-1,1 +"MP100",pool,204,poolshunt,pool shunt open/close (0% = pool / 100% = heat),uint8 (>=0<=100),%,false,sensor.pool_pool_shunt_open/close_(0%_=_pool_/_100%_=_heat),sensor.pool_poolshunt,20,0,1,-1,1 diff --git a/docs/dump_telegrams.csv b/docs/dump_telegrams.csv index 6de36b5b4..980114993 100644 --- a/docs/dump_telegrams.csv +++ b/docs/dump_telegrams.csv @@ -1,227 +1,232 @@ -telegram_type_id,name,is_fetched -0x04,UBAFactory,fetched -0x06,RCTime, -0x0A,EasyMonitor,fetched -0x10,UBAErrorMessage1, -0x11,UBAErrorMessage2, -0x12,RCErrorMessage, -0x13,RCErrorMessage2, -0x14,UBATotalUptime,fetched -0x15,UBAMaintenanceData, -0x16,UBAParameters,fetched -0x18,UBAMonitorFast, -0x19,UBAMonitorSlow, -0x1A,UBASetPoints, -0x1C,UBAMaintenanceStatus, -0x1E,WM10TempMessage, -0x23,JunkersSetMixer,fetched -0x26,UBASettingsWW,fetched -0x28,WeatherComp,fetched -0x2A,MC110Status, -0x2E,Meters, -0x33,UBAParameterWW,fetched -0x34,UBAMonitorWW, -0x35,UBAFlags, -0x37,WWSettings,fetched -0x38,WWTimer,fetched -0x39,WWCircTimer,fetched -0x3A,RC30WWSettings,fetched -0x3B,Energy, -0x3D,RC35Set, -0x3E,RC35Monitor, -0x3F,RC35Timer, -0x40,RC30Temp, -0x41,RC30Monitor, -0x42,RC35Timer2, -0x47,RC35Set, -0x48,RC35Monitor, -0x49,RC35Timer, -0x4C,RC35Timer2, -0x51,RC35Set, -0x52,RC35Monitor, -0x53,RC35Timer, -0x56,RC35Timer2, -0x5B,RC35Set, -0x5C,RC35Monitor, -0x5D,RC35Timer, -0x60,RC35Timer2, -0x96,SM10Config,fetched -0x97,SM10Monitor, -0x9C,WM10MonitorMessage, -0x9D,WM10SetMessage, -0xA2,RCError, -0xA3,RCOutdoorTemp, -0xA5,IBASettings,fetched -0xA7,RC30Set, -0xA9,RC30Vacation,fetched -0xAA,MMConfigMessage,fetched -0xAB,MMStatusMessage, -0xAC,MMSetMessage, -0xAF,RC20Remote, -0xB0,RC10Set, -0xB1,RC10Monitor, -0xBB,HybridSettings,fetched -0xBF,ErrorMessage, -0xC2,UBAErrorMessage3, -0xD1,UBAOutdoorTemp, -0xE3,UBAMonitorSlowPlus2, -0xE4,UBAMonitorFastPlus, -0xE5,UBAMonitorSlowPlus, -0xE6,UBAParametersPlus,fetched -0xE9,UBAMonitorWWPlus, -0xEA,UBAParameterWWPlus,fetched -0x0101,ISM1Set,fetched -0x0103,ISM1StatusMessage,fetched -0x0104,ISM2StatusMessage, -0x010C,IPMStatusMessage, -0x011E,IPMTempMessage, -0x012E,HPEnergy1, -0x013B,HPEnergy2, -0x0165,JunkersSet, -0x0166,JunkersSet, -0x0167,JunkersSet, -0x0168,JunkersSet, -0x016E,Absent,fetched -0x016F,JunkersMonitor, -0x0170,JunkersMonitor, -0x0171,JunkersMonitor, -0x0172,JunkersMonitor, -0x0179,JunkersSet, -0x017A,JunkersSet, -0x017B,JunkersSet, -0x017C,JunkersSet, -0x01D3,JunkersDhw,fetched -0x023A,RC300OutdoorTemp,fetched -0x023E,PVSettings,fetched -0x0240,RC300Settings,fetched -0x0241,RC300Settings,fetched -0x0267,RC300Floordry, -0x0269,RC300Holiday,fetched -0x0291,HPMode,fetched -0x0292,HPMode,fetched -0x0293,HPMode,fetched -0x0294,HPMode,fetched -0x029B,RC300Curves, -0x029C,RC300Curves, -0x029D,RC300Curves, -0x029E,RC300Curves, -0x029F,RC300Curves, -0x02A0,RC300Curves, -0x02A1,RC300Curves, -0x02A2,RC300Curves, -0x02A5,RC300Monitor,fetched -0x02A6,RC300Monitor, -0x02A7,CRFMonitor, -0x02A8,RC300Monitor, -0x02A9,RC300Monitor, -0x02AA,RC300Monitor, -0x02AB,RC300Monitor, -0x02AC,RC300Monitor, -0x02AF,RC300Summer, -0x02B0,RC300Summer, -0x02B1,RC300Summer, -0x02B2,RC300Summer, -0x02B3,RC300Summer, -0x02B4,RC300Summer, -0x02B5,RC300Summer, -0x02B6,RC300Summer, -0x02B9,RC300Set, -0x02BA,RC300Set, -0x02BB,RC300Set, -0x02BC,RC300Set, -0x02BD,RC300Set, -0x02BE,RC300Set, -0x02BF,RC300Set, -0x02C0,RC300Set, -0x02CC,HPPressure,fetched -0x02CD,MMPLUSConfigMessage,fetched -0x02CE,RC300Set2, -0x02D0,RC300Set2, -0x02D2,RC300Set2, -0x02D6,HPPump2,fetched -0x02D7,MMPLUSStatusMessage, -0x02F5,RC300WWmode,fetched -0x02F6,RC300WW2mode,fetched -0x0313,MMPLUSConfigMessage_WWC,fetched -0x031B,RC300WWtemp,fetched -0x031D,RC300WWmode2, -0x031E,RC300WWmode2, -0x0331,MMPLUSStatusMessage_WWC, -0x0358,SM100SystemConfig,fetched -0x035A,SM100CircuitConfig,fetched -0x035C,SM100HeatAssist,fetched -0x035D,SM100Circuit2Config,fetched -0x035F,SM100Config1,fetched -0x0361,SM100Differential,fetched -0x0362,SM100Monitor, -0x0363,SM100Monitor2, -0x0364,SM100Status, -0x0366,SM100Config, -0x036A,SM100Status2, -0x0380,SM100CollectorConfig,fetched -0x038E,SM100Energy,fetched -0x0391,SM100Time,fetched -0x043F,CRHolidays,fetched -0x0467,HPSet, -0x0468,HPSet, -0x0469,HPSet, -0x046A,HPSet, -0x0471,RC300Summer2, -0x0472,RC300Summer2, -0x0473,RC300Summer2, -0x0474,RC300Summer2, -0x0475,RC300Summer2, -0x0476,RC300Summer2, -0x0477,RC300Summer2, -0x0478,RC300Summer2, -0x047B,HP2, -0x0484,HPSilentMode,fetched -0x0485,HpCooling,fetched -0x0486,HpInConfig,fetched -0x0488,HPValve,fetched -0x048A,HpPool,fetched -0x048B,HPPumps,fetched -0x048D,HpPower,fetched -0x048F,HpTemperatures, -0x0491,HPAdditionalHeater,fetched -0x0492,HpHeaterConfig,fetched -0x0494,UBAEnergySupplied, -0x0495,UBAInformation, -0x0499,HPDhwSettings,fetched -0x049C,HPSettings2,fetched -0x049D,HPSettings3,fetched -0x04A2,HpInput,fetched -0x04A5,HPFan,fetched -0x04A7,HPPowerLimit,fetched -0x04AA,HPPower2,fetched -0x04AE,HPEnergy,fetched -0x04AF,HPMeters,fetched -0x056B,VentilationMode,fetched -0x0583,VentilationMonitor, -0x0585,Blowerspeed, -0x0587,Bypass, -0x05BA,HpPoolStatus,fetched -0x05D9,Airquality, -0x0772,HIUSettings, -0x0779,HIUMonitor, -0x07A5,SM100wwCirc,fetched -0x07A6,SM100wwParam,fetched -0x07AA,SM100wwStatus, -0x07AB,SM100wwCommand, -0x07AC,SM100wwParam1, -0x07AD,SM100ValveStatus, -0x07AE,SM100wwKeepWarm,fetched -0x07D6,SM100wwTemperature, -0x07E0,SM100wwStatus2,fetched -0x0935,EM100SetMessage,fetched -0x0936,EM100OutMessage, -0x0937,EM100TempMessage, -0x0938,EM100InputMessage, -0x0939,EM100MonitorMessage, -0x093A,EM100ConfigMessage, -0x0998,HPSettings,fetched -0x0999,HPFunctionTest,fetched -0x099A,HPStarts, -0x099B,HPFlowTemp, -0x099C,HPComp, -0x09A0,HPTemperature, +telegram_type_id,name,is_fetched +0x04,UBAFactory,fetched +0x06,RCTime, +0x0A,EasyMonitor,fetched +0x10,UBAErrorMessage1, +0x11,UBAErrorMessage2, +0x12,RCErrorMessage, +0x13,RCErrorMessage2, +0x14,UBATotalUptime,fetched +0x15,UBAMaintenanceData, +0x16,UBAParameters,fetched +0x18,UBAMonitorFast, +0x19,UBAMonitorSlow, +0x1A,UBASetPoints, +0x1C,UBAMaintenanceStatus, +0x1E,WM10TempMessage, +0x23,JunkersSetMixer,fetched +0x27,UBASettingsWW,fetched +0x28,WeatherComp,fetched +0x2A,MC110Status, +0x2E,Meters, +0x33,UBAParameterWW,fetched +0x34,UBAMonitorWW, +0x35,UBAFlags, +0x37,WWSettings,fetched +0x38,WWTimer,fetched +0x39,WWCircTimer,fetched +0x3A,RC30WWSettings,fetched +0x3B,Energy, +0x3D,RC35Set, +0x3E,RC35Monitor, +0x3F,RC35Timer, +0x40,RC30Temp, +0x41,RC30Monitor, +0x42,RC35Timer2, +0x47,RC35Set, +0x48,RC35Monitor, +0x49,RC35Timer, +0x4C,RC35Timer2, +0x51,RC35Set, +0x52,RC35Monitor, +0x53,RC35Timer, +0x56,RC35Timer2, +0x5B,RC35Set, +0x5C,RC35Monitor, +0x5D,RC35Timer, +0x60,RC35Timer2, +0x96,SM10Config,fetched +0x97,SM10Monitor, +0x9C,WM10MonitorMessage, +0x9D,WM10SetMessage, +0xA2,RCError, +0xA3,RCOutdoorTemp, +0xA5,IBASettings,fetched +0xA7,RC30Set, +0xA9,RC30Vacation,fetched +0xAA,MMConfigMessage,fetched +0xAB,MMStatusMessage, +0xAC,MMSetMessage, +0xAF,RC20Remote, +0xB0,RC10Set, +0xB1,RC10Monitor, +0xBB,HybridSettings,fetched +0xBF,ErrorMessage, +0xC0,RCErrorMessage, +0xC2,UBAErrorMessage3, +0xC6,UBAErrorMessage3, +0xD1,UBAOutdoorTemp, +0xE3,UBAMonitorSlowPlus2, +0xE4,UBAMonitorFastPlus, +0xE5,UBAMonitorSlowPlus, +0xE6,UBAParametersPlus,fetched +0xE9,UBAMonitorWWPlus, +0xEA,UBAParameterWWPlus,fetched +0x0101,ISM1Set,fetched +0x0103,ISM1StatusMessage,fetched +0x0104,ISM2StatusMessage, +0x010C,IPMStatusMessage, +0x011E,JunkersDisp,fetched +0x012E,HPEnergy1, +0x013B,HPEnergy2, +0x0165,JunkersSet, +0x0166,JunkersSet, +0x0167,JunkersSet, +0x0168,JunkersSet, +0x016E,Absent,fetched +0x016F,JunkersMonitor, +0x0170,JunkersMonitor, +0x0171,JunkersMonitor, +0x0172,JunkersMonitor, +0x0179,JunkersSet, +0x017A,JunkersSet, +0x017B,JunkersSet, +0x017C,JunkersSet, +0x01D3,JunkersDhw,fetched +0x023A,RC300OutdoorTemp,fetched +0x023E,PVSettings,fetched +0x0240,RC300Settings,fetched +0x0241,RC300Settings,fetched +0x0267,RC300Floordry, +0x0269,RC300Holiday,fetched +0x0291,HPMode,fetched +0x0292,HPMode,fetched +0x0293,HPMode,fetched +0x0294,HPMode,fetched +0x029B,RC300Curves, +0x029C,RC300Curves, +0x029D,RC300Curves, +0x029E,RC300Curves, +0x029F,RC300Curves, +0x02A0,RC300Curves, +0x02A1,RC300Curves, +0x02A2,RC300Curves, +0x02A5,RC300Monitor,fetched +0x02A6,RC300Monitor, +0x02A7,RC300Monitor, +0x02A8,RC300Monitor, +0x02A9,RC300Monitor, +0x02AA,RC300Monitor, +0x02AB,RC300Monitor, +0x02AC,RC300Monitor, +0x02AF,RC300Summer, +0x02B0,RC300Summer, +0x02B1,RC300Summer, +0x02B2,RC300Summer, +0x02B3,RC300Summer, +0x02B4,RC300Summer, +0x02B5,RC300Summer, +0x02B6,RC300Summer, +0x02B9,RC300Set, +0x02BA,RC300Set, +0x02BB,RC300Set, +0x02BC,RC300Set, +0x02BD,RC300Set, +0x02BE,RC300Set, +0x02BF,RC300Set, +0x02C0,RC300Set, +0x02CC,HPPressure,fetched +0x02CD,MMPLUSConfigMessage, +0x02D6,HPPump2,fetched +0x02D7,MMPLUSStatusMessage, +0x02E0,UBASetPoints, +0x02F5,RC300WWmode,fetched +0x02F6,RC300WW2mode,fetched +0x0313,MMPLUSConfigMessage_WWC,fetched +0x031B,RC300WWtemp,fetched +0x031D,RC300WWmode2, +0x031E,RC300WWmode2, +0x0331,MMPLUSStatusMessage_WWC, +0x0358,SM100SystemConfig,fetched +0x035A,SM100CircuitConfig,fetched +0x035C,SM100HeatAssist,fetched +0x035D,SM100Circuit2Config,fetched +0x035F,SM100Config1,fetched +0x0361,SM100Differential,fetched +0x0362,SM100Monitor, +0x0363,SM100Monitor2, +0x0364,SM100Status, +0x0366,SM100Config, +0x036A,SM100Status2, +0x0380,SM100CollectorConfig,fetched +0x038E,SM100Energy,fetched +0x0391,SM100Time,fetched +0x0421,RC300Set2, +0x0422,RC300Set2, +0x0423,RC300Set2, +0x0424,RC300Set2, +0x043F,CRHolidays,fetched +0x0467,HPSet, +0x0468,HPSet, +0x0469,HPSet, +0x046A,HPSet, +0x0471,RC300Summer2, +0x0472,RC300Summer2, +0x0473,RC300Summer2, +0x0474,RC300Summer2, +0x0475,RC300Summer2, +0x0476,RC300Summer2, +0x0477,RC300Summer2, +0x0478,RC300Summer2, +0x047B,HP2, +0x0484,HPSilentMode,fetched +0x0485,HpCooling,fetched +0x0486,HpInConfig,fetched +0x0488,HPValve,fetched +0x048A,HpPool,fetched +0x048B,HPPumps,fetched +0x048D,HpPower,fetched +0x048F,HpTemperatures, +0x0491,HPAdditionalHeater,fetched +0x0492,HpHeaterConfig,fetched +0x0494,UBAEnergySupplied, +0x0495,UBAInformation, +0x0499,HPDhwSettings,fetched +0x049C,HPSettings2,fetched +0x049D,HPSettings3,fetched +0x04A2,HpInput,fetched +0x04A5,HPFan,fetched +0x04A7,HPPowerLimit,fetched +0x04AA,HPPower2,fetched +0x04AE,HPEnergy,fetched +0x04AF,HPMeters,fetched +0x055C,VentilationSet,fetched +0x056B,VentilationMode,fetched +0x0583,VentilationMonitor, +0x0585,Blowerspeed, +0x0587,Bypass, +0x05BA,HpPoolStatus,fetched +0x05D9,Airquality, +0x0772,HIUSettings, +0x0779,HIUMonitor, +0x07A5,SM100wwCirc,fetched +0x07A6,SM100wwParam,fetched +0x07AA,SM100wwStatus, +0x07AB,SM100wwCommand, +0x07AC,SM100wwParam1, +0x07AD,SM100ValveStatus, +0x07AE,SM100wwKeepWarm,fetched +0x07D6,SM100wwTemperature, +0x07E0,SM100wwStatus2,fetched +0x0935,EM100SetMessage,fetched +0x0936,EM100OutMessage, +0x0937,EM100TempMessage, +0x0938,EM100InputMessage, +0x0939,EM100MonitorMessage, +0x093A,EM100ConfigMessage, +0x0998,HPSettings,fetched +0x0999,HPFunctionTest,fetched +0x099A,HPStarts, +0x099B,HPFlowTemp, +0x099C,HPComp, +0x09A0,HPTemperature, diff --git a/interface/.gitattributes b/interface/.gitattributes deleted file mode 100644 index af3ad1281..000000000 --- a/interface/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -/.yarn/** linguist-vendored -/.yarn/releases/* binary -/.yarn/plugins/**/* binary -/.pnp.* binary linguist-generated diff --git a/interface/.prettierignore b/interface/.prettierignore index ed086a320..920369742 100644 --- a/interface/.prettierignore +++ b/interface/.prettierignore @@ -4,5 +4,4 @@ dist/ src/i18n/* .prettierrc -.yarn/ -.typesafe-i18n.json \ No newline at end of file +.typesafe-i18n.json diff --git a/interface/.yarn/releases/yarn-4.7.0.cjs b/interface/.yarn/releases/yarn-4.7.0.cjs deleted file mode 100755 index 04022e16f..000000000 --- a/interface/.yarn/releases/yarn-4.7.0.cjs +++ /dev/null @@ -1,935 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var j3e=Object.create;var gT=Object.defineProperty;var G3e=Object.getOwnPropertyDescriptor;var W3e=Object.getOwnPropertyNames;var Y3e=Object.getPrototypeOf,V3e=Object.prototype.hasOwnProperty;var ve=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var It=(t,e)=>()=>(t&&(e=t(t=0)),e);var _=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Vt=(t,e)=>{for(var r in e)gT(t,r,{get:e[r],enumerable:!0})},K3e=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of W3e(e))!V3e.call(t,a)&&a!==r&&gT(t,a,{get:()=>e[a],enumerable:!(o=G3e(e,a))||o.enumerable});return t};var et=(t,e,r)=>(r=t!=null?j3e(Y3e(t)):{},K3e(e||!t||!t.__esModule?gT(r,"default",{value:t,enumerable:!0}):r,t));var Si={};Vt(Si,{SAFE_TIME:()=>cW,S_IFDIR:()=>KD,S_IFLNK:()=>JD,S_IFMT:()=>Hu,S_IFREG:()=>ow});var Hu,KD,ow,JD,cW,uW=It(()=>{Hu=61440,KD=16384,ow=32768,JD=40960,cW=456789e3});var sr={};Vt(sr,{EBADF:()=>ho,EBUSY:()=>J3e,EEXIST:()=>t_e,EINVAL:()=>X3e,EISDIR:()=>e_e,ENOENT:()=>Z3e,ENOSYS:()=>z3e,ENOTDIR:()=>$3e,ENOTEMPTY:()=>n_e,EOPNOTSUPP:()=>i_e,EROFS:()=>r_e,ERR_DIR_CLOSED:()=>dT});function Nl(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function J3e(t){return Nl("EBUSY",t)}function z3e(t,e){return Nl("ENOSYS",`${t}, ${e}`)}function X3e(t){return Nl("EINVAL",`invalid argument, ${t}`)}function ho(t){return Nl("EBADF",`bad file descriptor, ${t}`)}function Z3e(t){return Nl("ENOENT",`no such file or directory, ${t}`)}function $3e(t){return Nl("ENOTDIR",`not a directory, ${t}`)}function e_e(t){return Nl("EISDIR",`illegal operation on a directory, ${t}`)}function t_e(t){return Nl("EEXIST",`file already exists, ${t}`)}function r_e(t){return Nl("EROFS",`read-only filesystem, ${t}`)}function n_e(t){return Nl("ENOTEMPTY",`directory not empty, ${t}`)}function i_e(t){return Nl("EOPNOTSUPP",`operation not supported, ${t}`)}function dT(){return Nl("ERR_DIR_CLOSED","Directory handle was closed")}var zD=It(()=>{});var wa={};Vt(wa,{BigIntStatsEntry:()=>cm,DEFAULT_MODE:()=>ET,DirEntry:()=>mT,StatEntry:()=>lm,areStatsEqual:()=>CT,clearStats:()=>XD,convertToBigIntStats:()=>o_e,makeDefaultStats:()=>AW,makeEmptyStats:()=>s_e});function AW(){return new lm}function s_e(){return XD(AW())}function XD(t){for(let e in t)if(Object.hasOwn(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):yT.types.isDate(r)&&(t[e]=new Date(0))}return t}function o_e(t){let e=new cm;for(let r in t)if(Object.hasOwn(t,r)){let o=t[r];typeof o=="number"?e[r]=BigInt(o):yT.types.isDate(o)&&(e[r]=new Date(o))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function CT(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,o=e;return!(r.atimeNs!==o.atimeNs||r.mtimeNs!==o.mtimeNs||r.ctimeNs!==o.ctimeNs||r.birthtimeNs!==o.birthtimeNs)}var yT,ET,mT,lm,cm,IT=It(()=>{yT=et(ve("util")),ET=33188,mT=class{constructor(){this.name="";this.path="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},lm=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=ET;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&61440)===16384}isFIFO(){return!1}isFile(){return(this.mode&61440)===32768}isSocket(){return!1}isSymbolicLink(){return(this.mode&61440)===40960}},cm=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(ET);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(61440))===BigInt(16384)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(61440))===BigInt(32768)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(61440))===BigInt(40960)}}});function A_e(t){let e,r;if(e=t.match(c_e))t=e[1];else if(r=t.match(u_e))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function f_e(t){t=t.replace(/\\/g,"/");let e,r;return(e=t.match(a_e))?t=`/${e[1]}`:(r=t.match(l_e))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t}function ZD(t,e){return t===Ae?pW(e):wT(e)}var aw,Bt,mr,Ae,V,fW,a_e,l_e,c_e,u_e,wT,pW,Ba=It(()=>{aw=et(ve("path")),Bt={root:"/",dot:".",parent:".."},mr={home:"~",nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",pnpData:".pnp.data.json",pnpEsmLoader:".pnp.loader.mjs",rc:".yarnrc.yml",env:".env"},Ae=Object.create(aw.default),V=Object.create(aw.default.posix);Ae.cwd=()=>process.cwd();V.cwd=process.platform==="win32"?()=>wT(process.cwd()):process.cwd;process.platform==="win32"&&(V.resolve=(...t)=>t.length>0&&V.isAbsolute(t[0])?aw.default.posix.resolve(...t):aw.default.posix.resolve(V.cwd(),...t));fW=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};Ae.contains=(t,e)=>fW(Ae,t,e);V.contains=(t,e)=>fW(V,t,e);a_e=/^([a-zA-Z]:.*)$/,l_e=/^\/\/(\.\/)?(.*)$/,c_e=/^\/([a-zA-Z]:.*)$/,u_e=/^\/unc\/(\.dot\/)?(.*)$/;wT=process.platform==="win32"?f_e:t=>t,pW=process.platform==="win32"?A_e:t=>t;Ae.fromPortablePath=pW;Ae.toPortablePath=wT});async function $D(t,e){let r="0123456789abcdef";await t.mkdirPromise(e.indexPath,{recursive:!0});let o=[];for(let a of r)for(let n of r)o.push(t.mkdirPromise(t.pathUtils.join(e.indexPath,`${a}${n}`),{recursive:!0}));return await Promise.all(o),e.indexPath}async function hW(t,e,r,o,a){let n=t.pathUtils.normalize(e),u=r.pathUtils.normalize(o),A=[],p=[],{atime:h,mtime:E}=a.stableTime?{atime:H0,mtime:H0}:await r.lstatPromise(u);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[h,E]}),await BT(A,p,t,n,r,u,{...a,didParentExist:!0});for(let w of A)await w();await Promise.all(p.map(w=>w()))}async function BT(t,e,r,o,a,n,u){let A=u.didParentExist?await gW(r,o):null,p=await a.lstatPromise(n),{atime:h,mtime:E}=u.stableTime?{atime:H0,mtime:H0}:p,w;switch(!0){case p.isDirectory():w=await h_e(t,e,r,o,A,a,n,p,u);break;case p.isFile():w=await m_e(t,e,r,o,A,a,n,p,u);break;case p.isSymbolicLink():w=await y_e(t,e,r,o,A,a,n,p,u);break;default:throw new Error(`Unsupported file type (${p.mode})`)}return(u.linkStrategy?.type!=="HardlinkFromIndex"||!p.isFile())&&((w||A?.mtime?.getTime()!==E.getTime()||A?.atime?.getTime()!==h.getTime())&&(e.push(()=>r.lutimesPromise(o,h,E)),w=!0),(A===null||(A.mode&511)!==(p.mode&511))&&(e.push(()=>r.chmodPromise(o,p.mode&511)),w=!0)),w}async function gW(t,e){try{return await t.lstatPromise(e)}catch{return null}}async function h_e(t,e,r,o,a,n,u,A,p){if(a!==null&&!a.isDirectory())if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;let h=!1;a===null&&(t.push(async()=>{try{await r.mkdirPromise(o,{mode:A.mode})}catch(D){if(D.code!=="EEXIST")throw D}}),h=!0);let E=await n.readdirPromise(u),w=p.didParentExist&&!a?{...p,didParentExist:!1}:p;if(p.stableSort)for(let D of E.sort())await BT(t,e,r,r.pathUtils.join(o,D),n,n.pathUtils.join(u,D),w)&&(h=!0);else(await Promise.all(E.map(async b=>{await BT(t,e,r,r.pathUtils.join(o,b),n,n.pathUtils.join(u,b),w)}))).some(b=>b)&&(h=!0);return h}async function g_e(t,e,r,o,a,n,u,A,p,h){let E=await n.checksumFilePromise(u,{algorithm:"sha1"}),w=420,D=A.mode&511,b=`${E}${D!==w?D.toString(8):""}`,C=r.pathUtils.join(h.indexPath,E.slice(0,2),`${b}.dat`),T;(ue=>(ue[ue.Lock=0]="Lock",ue[ue.Rename=1]="Rename"))(T||={});let N=1,U=await gW(r,C);if(a){let le=U&&a.dev===U.dev&&a.ino===U.ino,ce=U?.mtimeMs!==p_e;if(le&&ce&&h.autoRepair&&(N=0,U=null),!le)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1}let J=!U&&N===1?`${C}.${Math.floor(Math.random()*4294967296).toString(16).padStart(8,"0")}`:null,te=!1;return t.push(async()=>{if(!U&&(N===0&&await r.lockPromise(C,async()=>{let le=await n.readFilePromise(u);await r.writeFilePromise(C,le)}),N===1&&J)){let le=await n.readFilePromise(u);await r.writeFilePromise(J,le);try{await r.linkPromise(J,C)}catch(ce){if(ce.code==="EEXIST")te=!0,await r.unlinkPromise(J);else throw ce}}a||await r.linkPromise(C,o)}),e.push(async()=>{U||(await r.lutimesPromise(C,H0,H0),D!==w&&await r.chmodPromise(C,D)),J&&!te&&await r.unlinkPromise(J)}),!1}async function d_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{let h=await n.readFilePromise(u);await r.writeFilePromise(o,h)}),!0}async function m_e(t,e,r,o,a,n,u,A,p){return p.linkStrategy?.type==="HardlinkFromIndex"?g_e(t,e,r,o,a,n,u,A,p,p.linkStrategy):d_e(t,e,r,o,a,n,u,A,p)}async function y_e(t,e,r,o,a,n,u,A,p){if(a!==null)if(p.overwrite)t.push(async()=>r.removePromise(o)),a=null;else return!1;return t.push(async()=>{await r.symlinkPromise(ZD(r.pathUtils,await n.readlinkPromise(u)),o)}),!0}var H0,p_e,vT=It(()=>{Ba();H0=new Date(456789e3*1e3),p_e=H0.getTime()});function eS(t,e,r,o){let a=()=>{let n=r.shift();if(typeof n>"u")return null;let u=t.pathUtils.join(e,n);return Object.assign(t.statSync(u),{name:n,path:void 0})};return new lw(e,a,o)}var lw,dW=It(()=>{zD();lw=class{constructor(e,r,o={}){this.path=e;this.nextDirent=r;this.opts=o;this.closed=!1}throwIfClosed(){if(this.closed)throw dT()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e<"u"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e<"u"?e(null):Promise.resolve()}closeSync(){this.throwIfClosed(),this.opts.onClose?.(),this.closed=!0}}});function mW(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var yW,tS,EW=It(()=>{yW=ve("events");IT();tS=class t extends yW.EventEmitter{constructor(r,o,{bigint:a=!1}={}){super();this.status="ready";this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=r,this.path=o,this.bigint=a,this.lastStats=this.stat()}static create(r,o,a){let n=new t(r,o,a);return n.start(),n}start(){mW(this.status,"ready"),this.status="running",this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit("change",this.lastStats,this.lastStats)},3)}stop(){mW(this.status,"running"),this.status="stopped",this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit("stop")}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch{let r=this.bigint?new cm:new lm;return XD(r)}}makeInterval(r){let o=setInterval(()=>{let a=this.stat(),n=this.lastStats;CT(a,n)||(this.lastStats=a,this.emit("change",a,n))},r.interval);return r.persistent?o:o.unref()}registerChangeListener(r,o){this.addListener("change",r),this.changeListeners.set(r,this.makeInterval(o))}unregisterChangeListener(r){this.removeListener("change",r);let o=this.changeListeners.get(r);typeof o<"u"&&clearInterval(o),this.changeListeners.delete(r)}unregisterAllChangeListeners(){for(let r of this.changeListeners.keys())this.unregisterChangeListener(r)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let r of this.changeListeners.values())r.ref();return this}unref(){for(let r of this.changeListeners.values())r.unref();return this}}});function um(t,e,r,o){let a,n,u,A;switch(typeof r){case"function":a=!1,n=!0,u=5007,A=r;break;default:({bigint:a=!1,persistent:n=!0,interval:u=5007}=r),A=o;break}let p=rS.get(t);typeof p>"u"&&rS.set(t,p=new Map);let h=p.get(e);return typeof h>"u"&&(h=tS.create(t,e,{bigint:a}),p.set(e,h)),h.registerChangeListener(A,{persistent:n,interval:u}),h}function q0(t,e,r){let o=rS.get(t);if(typeof o>"u")return;let a=o.get(e);typeof a>"u"||(typeof r>"u"?a.unregisterAllChangeListeners():a.unregisterChangeListener(r),a.hasChangeListeners()||(a.stop(),o.delete(e)))}function j0(t){let e=rS.get(t);if(!(typeof e>"u"))for(let r of e.keys())q0(t,r)}var rS,DT=It(()=>{EW();rS=new WeakMap});function E_e(t){let e=t.match(/\r?\n/g);if(e===null)return IW.EOL;let r=e.filter(a=>a===`\r -`).length,o=e.length-r;return r>o?`\r -`:` -`}function G0(t,e){return e.replace(/\r?\n/g,E_e(t))}var CW,IW,hf,qu,W0=It(()=>{CW=ve("crypto"),IW=ve("os");vT();Ba();hf=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let o=[e];for(;o.length>0;){let a=o.shift();if((await this.lstatPromise(a)).isDirectory()){let u=await this.readdirPromise(a);if(r)for(let A of u.sort())o.push(this.pathUtils.join(a,A));else throw new Error("Not supported")}else yield a}}async checksumFilePromise(e,{algorithm:r="sha512"}={}){let o=await this.openPromise(e,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,CW.createHash)(r),A=0;for(;(A=await this.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await this.closePromise(o)}}async removePromise(e,{recursive:r=!0,maxRetries:o=5}={}){let a;try{a=await this.lstatPromise(e)}catch(n){if(n.code==="ENOENT")return;throw n}if(a.isDirectory()){if(r){let n=await this.readdirPromise(e);await Promise.all(n.map(u=>this.removePromise(this.pathUtils.resolve(e,u))))}for(let n=0;n<=o;n++)try{await this.rmdirPromise(e);break}catch(u){if(u.code!=="EBUSY"&&u.code!=="ENOTEMPTY")throw u;nsetTimeout(A,n*100))}}else await this.unlinkPromise(e)}removeSync(e,{recursive:r=!0}={}){let o;try{o=this.lstatSync(e)}catch(a){if(a.code==="ENOENT")return;throw a}if(o.isDirectory()){if(r)for(let a of this.readdirSync(e))this.removeSync(this.pathUtils.resolve(e,a));this.rmdirSync(e)}else this.unlinkSync(e)}async mkdirpPromise(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{await this.mkdirPromise(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&await this.chmodPromise(A,r),o!=null)await this.utimesPromise(A,o[0],o[1]);else{let p=await this.statPromise(this.pathUtils.dirname(A));await this.utimesPromise(A,p.atime,p.mtime)}}}return n}mkdirpSync(e,{chmod:r,utimes:o}={}){if(e=this.resolve(e),e===this.pathUtils.dirname(e))return;let a=e.split(this.pathUtils.sep),n;for(let u=2;u<=a.length;++u){let A=a.slice(0,u).join(this.pathUtils.sep);if(!this.existsSync(A)){try{this.mkdirSync(A)}catch(p){if(p.code==="EEXIST")continue;throw p}if(n??=A,r!=null&&this.chmodSync(A,r),o!=null)this.utimesSync(A,o[0],o[1]);else{let p=this.statSync(this.pathUtils.dirname(A));this.utimesSync(A,p.atime,p.mtime)}}}return n}async copyPromise(e,r,{baseFs:o=this,overwrite:a=!0,stableSort:n=!1,stableTime:u=!1,linkStrategy:A=null}={}){return await hW(this,e,o,r,{overwrite:a,stableSort:n,stableTime:u,linkStrategy:A})}copySync(e,r,{baseFs:o=this,overwrite:a=!0}={}){let n=o.lstatSync(r),u=this.existsSync(e);if(n.isDirectory()){this.mkdirpSync(e);let p=o.readdirSync(r);for(let h of p)this.copySync(this.pathUtils.join(e,h),o.pathUtils.join(r,h),{baseFs:o,overwrite:a})}else if(n.isFile()){if(!u||a){u&&this.removeSync(e);let p=o.readFileSync(r);this.writeFileSync(e,p)}}else if(n.isSymbolicLink()){if(!u||a){u&&this.removeSync(e);let p=o.readlinkSync(r);this.symlinkSync(ZD(this.pathUtils,p),e)}}else throw new Error(`Unsupported file type (file: ${r}, mode: 0o${n.mode.toString(8).padStart(6,"0")})`);let A=n.mode&511;this.chmodSync(e,A)}async changeFilePromise(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferPromise(e,r,o):this.changeFileTextPromise(e,r,o)}async changeFileBufferPromise(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=await this.readFilePromise(e)}catch{}Buffer.compare(a,r)!==0&&await this.writeFilePromise(e,r,{mode:o})}async changeFileTextPromise(e,r,{automaticNewlines:o,mode:a}={}){let n="";try{n=await this.readFilePromise(e,"utf8")}catch{}let u=o?G0(n,r):r;n!==u&&await this.writeFilePromise(e,u,{mode:a})}changeFileSync(e,r,o={}){return Buffer.isBuffer(r)?this.changeFileBufferSync(e,r,o):this.changeFileTextSync(e,r,o)}changeFileBufferSync(e,r,{mode:o}={}){let a=Buffer.alloc(0);try{a=this.readFileSync(e)}catch{}Buffer.compare(a,r)!==0&&this.writeFileSync(e,r,{mode:o})}changeFileTextSync(e,r,{automaticNewlines:o=!1,mode:a}={}){let n="";try{n=this.readFileSync(e,"utf8")}catch{}let u=o?G0(n,r):r;n!==u&&this.writeFileSync(e,u,{mode:a})}async movePromise(e,r){try{await this.renamePromise(e,r)}catch(o){if(o.code==="EXDEV")await this.copyPromise(r,e),await this.removePromise(e);else throw o}}moveSync(e,r){try{this.renameSync(e,r)}catch(o){if(o.code==="EXDEV")this.copySync(r,e),this.removeSync(e);else throw o}}async lockPromise(e,r){let o=`${e}.flock`,a=1e3/60,n=Date.now(),u=null,A=async()=>{let p;try{[p]=await this.readJsonPromise(o)}catch{return Date.now()-n<500}try{return process.kill(p,0),!0}catch{return!1}};for(;u===null;)try{u=await this.openPromise(o,"wx")}catch(p){if(p.code==="EEXIST"){if(!await A())try{await this.unlinkPromise(o);continue}catch{}if(Date.now()-n<60*1e3)await new Promise(h=>setTimeout(h,a));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${o})`)}else throw p}await this.writePromise(u,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(u),await this.unlinkPromise(o)}catch{}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(o){throw o.message+=` (in ${e})`,o}}async writeJsonPromise(e,r,{compact:o=!1}={}){let a=o?0:2;return await this.writeFilePromise(e,`${JSON.stringify(r,null,a)} -`)}writeJsonSync(e,r,{compact:o=!1}={}){let a=o?0:2;return this.writeFileSync(e,`${JSON.stringify(r,null,a)} -`)}async preserveTimePromise(e,r){let o=await this.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await this.lutimesPromise(e,o.atime,o.mtime)}async preserveTimeSync(e,r){let o=this.lstatSync(e),a=r();typeof a<"u"&&(e=a),this.lutimesSync(e,o.atime,o.mtime)}},qu=class extends hf{constructor(){super(V)}}});var ws,gf=It(()=>{W0();ws=class extends hf{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,o){return this.baseFs.openPromise(this.mapToBase(e),r,o)}openSync(e,r,o){return this.baseFs.openSync(this.mapToBase(e),r,o)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,o,a,n){return await this.baseFs.readPromise(e,r,o,a,n)}readSync(e,r,o,a,n){return this.baseFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return typeof r=="string"?await this.baseFs.writePromise(e,r,o):await this.baseFs.writePromise(e,r,o,a,n)}writeSync(e,r,o,a,n){return typeof r=="string"?this.baseFs.writeSync(e,r,o):this.baseFs.writeSync(e,r,o,a,n)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async fchmodPromise(e,r){return this.baseFs.fchmodPromise(e,r)}fchmodSync(e,r){return this.baseFs.fchmodSync(e,r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async fchownPromise(e,r,o){return this.baseFs.fchownPromise(e,r,o)}fchownSync(e,r,o){return this.baseFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return this.baseFs.chownPromise(this.mapToBase(e),r,o)}chownSync(e,r,o){return this.baseFs.chownSync(this.mapToBase(e),r,o)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,o=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),o)}copyFileSync(e,r,o=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),o)}async appendFilePromise(e,r,o){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,o)}appendFileSync(e,r,o){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,o)}async writeFilePromise(e,r,o){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,o)}writeFileSync(e,r,o){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,o)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,o){return this.baseFs.utimesPromise(this.mapToBase(e),r,o)}utimesSync(e,r,o){return this.baseFs.utimesSync(this.mapToBase(e),r,o)}async lutimesPromise(e,r,o){return this.baseFs.lutimesPromise(this.mapToBase(e),r,o)}lutimesSync(e,r,o){return this.baseFs.lutimesSync(this.mapToBase(e),r,o)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async rmPromise(e,r){return this.baseFs.rmPromise(this.mapToBase(e),r)}rmSync(e,r){return this.baseFs.rmSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkPromise(u,a,o)}symlinkSync(e,r,o){let a=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),a,o);let n=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),u=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(a),n);return this.baseFs.symlinkSync(u,a,o)}async readFilePromise(e,r){return this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return this.baseFs.readFileSync(this.fsMapToBase(e),r)}readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}async ftruncatePromise(e,r){return this.baseFs.ftruncatePromise(e,r)}ftruncateSync(e,r){return this.baseFs.ftruncateSync(e,r)}watch(e,r,o){return this.baseFs.watch(this.mapToBase(e),r,o)}watchFile(e,r,o){return this.baseFs.watchFile(this.mapToBase(e),r,o)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}}});var ju,wW=It(()=>{gf();ju=class extends ws{constructor(e,{baseFs:r,pathUtils:o}){super(o),this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}}});function BW(t){let e=t;return typeof t.path=="string"&&(e.path=Ae.toPortablePath(t.path)),e}var vW,_n,Y0=It(()=>{vW=et(ve("fs"));W0();Ba();_n=class extends qu{constructor(e=vW.default){super(),this.realFs=e}getExtractHint(){return!1}getRealPath(){return Bt.root}resolve(e){return V.resolve(e)}async openPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.open(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}openSync(e,r,o){return this.realFs.openSync(Ae.fromPortablePath(e),r,o)}async opendirPromise(e,r){return await new Promise((o,a)=>{typeof r<"u"?this.realFs.opendir(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.opendir(Ae.fromPortablePath(e),this.makeCallback(o,a))}).then(o=>{let a=o;return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a})}opendirSync(e,r){let a=typeof r<"u"?this.realFs.opendirSync(Ae.fromPortablePath(e),r):this.realFs.opendirSync(Ae.fromPortablePath(e));return Object.defineProperty(a,"path",{value:e,configurable:!0,writable:!0}),a}async readPromise(e,r,o=0,a=0,n=-1){return await new Promise((u,A)=>{this.realFs.read(e,r,o,a,n,(p,h)=>{p?A(p):u(h)})})}readSync(e,r,o,a,n){return this.realFs.readSync(e,r,o,a,n)}async writePromise(e,r,o,a,n){return await new Promise((u,A)=>typeof r=="string"?this.realFs.write(e,r,o,this.makeCallback(u,A)):this.realFs.write(e,r,o,a,n,this.makeCallback(u,A)))}writeSync(e,r,o,a,n){return typeof r=="string"?this.realFs.writeSync(e,r,o):this.realFs.writeSync(e,r,o,a,n)}async closePromise(e){await new Promise((r,o)=>{this.realFs.close(e,this.makeCallback(r,o))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let o=e!==null?Ae.fromPortablePath(e):e;return this.realFs.createReadStream(o,r)}createWriteStream(e,r){let o=e!==null?Ae.fromPortablePath(e):e;return this.realFs.createWriteStream(o,r)}async realpathPromise(e){return await new Promise((r,o)=>{this.realFs.realpath(Ae.fromPortablePath(e),{},this.makeCallback(r,o))}).then(r=>Ae.toPortablePath(r))}realpathSync(e){return Ae.toPortablePath(this.realFs.realpathSync(Ae.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(Ae.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(Ae.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((o,a)=>{this.realFs.access(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}existsSync(e){return this.realFs.existsSync(Ae.fromPortablePath(e))}async statPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.stat(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.stat(Ae.fromPortablePath(e),this.makeCallback(o,a))})}statSync(e,r){return r?this.realFs.statSync(Ae.fromPortablePath(e),r):this.realFs.statSync(Ae.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.fstat(e,r,this.makeCallback(o,a)):this.realFs.fstat(e,this.makeCallback(o,a))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.lstat(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.lstat(Ae.fromPortablePath(e),this.makeCallback(o,a))})}lstatSync(e,r){return r?this.realFs.lstatSync(Ae.fromPortablePath(e),r):this.realFs.lstatSync(Ae.fromPortablePath(e))}async fchmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.fchmod(e,r,this.makeCallback(o,a))})}fchmodSync(e,r){return this.realFs.fchmodSync(e,r)}async chmodPromise(e,r){return await new Promise((o,a)=>{this.realFs.chmod(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}chmodSync(e,r){return this.realFs.chmodSync(Ae.fromPortablePath(e),r)}async fchownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.fchown(e,r,o,this.makeCallback(a,n))})}fchownSync(e,r,o){return this.realFs.fchownSync(e,r,o)}async chownPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.chown(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}chownSync(e,r,o){return this.realFs.chownSync(Ae.fromPortablePath(e),r,o)}async renamePromise(e,r){return await new Promise((o,a)=>{this.realFs.rename(Ae.fromPortablePath(e),Ae.fromPortablePath(r),this.makeCallback(o,a))})}renameSync(e,r){return this.realFs.renameSync(Ae.fromPortablePath(e),Ae.fromPortablePath(r))}async copyFilePromise(e,r,o=0){return await new Promise((a,n)=>{this.realFs.copyFile(Ae.fromPortablePath(e),Ae.fromPortablePath(r),o,this.makeCallback(a,n))})}copyFileSync(e,r,o=0){return this.realFs.copyFileSync(Ae.fromPortablePath(e),Ae.fromPortablePath(r),o)}async appendFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.appendFile(u,r,o,this.makeCallback(a,n)):this.realFs.appendFile(u,r,this.makeCallback(a,n))})}appendFileSync(e,r,o){let a=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.appendFileSync(a,r,o):this.realFs.appendFileSync(a,r)}async writeFilePromise(e,r,o){return await new Promise((a,n)=>{let u=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.writeFile(u,r,o,this.makeCallback(a,n)):this.realFs.writeFile(u,r,this.makeCallback(a,n))})}writeFileSync(e,r,o){let a=typeof e=="string"?Ae.fromPortablePath(e):e;o?this.realFs.writeFileSync(a,r,o):this.realFs.writeFileSync(a,r)}async unlinkPromise(e){return await new Promise((r,o)=>{this.realFs.unlink(Ae.fromPortablePath(e),this.makeCallback(r,o))})}unlinkSync(e){return this.realFs.unlinkSync(Ae.fromPortablePath(e))}async utimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.utimes(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}utimesSync(e,r,o){this.realFs.utimesSync(Ae.fromPortablePath(e),r,o)}async lutimesPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.lutimes(Ae.fromPortablePath(e),r,o,this.makeCallback(a,n))})}lutimesSync(e,r,o){this.realFs.lutimesSync(Ae.fromPortablePath(e),r,o)}async mkdirPromise(e,r){return await new Promise((o,a)=>{this.realFs.mkdir(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}mkdirSync(e,r){return this.realFs.mkdirSync(Ae.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rmdir(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.rmdir(Ae.fromPortablePath(e),this.makeCallback(o,a))})}rmdirSync(e,r){return this.realFs.rmdirSync(Ae.fromPortablePath(e),r)}async rmPromise(e,r){return await new Promise((o,a)=>{r?this.realFs.rm(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.rm(Ae.fromPortablePath(e),this.makeCallback(o,a))})}rmSync(e,r){return this.realFs.rmSync(Ae.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((o,a)=>{this.realFs.link(Ae.fromPortablePath(e),Ae.fromPortablePath(r),this.makeCallback(o,a))})}linkSync(e,r){return this.realFs.linkSync(Ae.fromPortablePath(e),Ae.fromPortablePath(r))}async symlinkPromise(e,r,o){return await new Promise((a,n)=>{this.realFs.symlink(Ae.fromPortablePath(e.replace(/\/+$/,"")),Ae.fromPortablePath(r),o,this.makeCallback(a,n))})}symlinkSync(e,r,o){return this.realFs.symlinkSync(Ae.fromPortablePath(e.replace(/\/+$/,"")),Ae.fromPortablePath(r),o)}async readFilePromise(e,r){return await new Promise((o,a)=>{let n=typeof e=="string"?Ae.fromPortablePath(e):e;this.realFs.readFile(n,r,this.makeCallback(o,a))})}readFileSync(e,r){let o=typeof e=="string"?Ae.fromPortablePath(e):e;return this.realFs.readFileSync(o,r)}async readdirPromise(e,r){return await new Promise((o,a)=>{r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdir(Ae.fromPortablePath(e),r,this.makeCallback(n=>o(n.map(BW)),a)):this.realFs.readdir(Ae.fromPortablePath(e),r,this.makeCallback(n=>o(n.map(Ae.toPortablePath)),a)):this.realFs.readdir(Ae.fromPortablePath(e),r,this.makeCallback(o,a)):this.realFs.readdir(Ae.fromPortablePath(e),this.makeCallback(o,a))})}readdirSync(e,r){return r?r.recursive&&process.platform==="win32"?r.withFileTypes?this.realFs.readdirSync(Ae.fromPortablePath(e),r).map(BW):this.realFs.readdirSync(Ae.fromPortablePath(e),r).map(Ae.toPortablePath):this.realFs.readdirSync(Ae.fromPortablePath(e),r):this.realFs.readdirSync(Ae.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,o)=>{this.realFs.readlink(Ae.fromPortablePath(e),this.makeCallback(r,o))}).then(r=>Ae.toPortablePath(r))}readlinkSync(e){return Ae.toPortablePath(this.realFs.readlinkSync(Ae.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((o,a)=>{this.realFs.truncate(Ae.fromPortablePath(e),r,this.makeCallback(o,a))})}truncateSync(e,r){return this.realFs.truncateSync(Ae.fromPortablePath(e),r)}async ftruncatePromise(e,r){return await new Promise((o,a)=>{this.realFs.ftruncate(e,r,this.makeCallback(o,a))})}ftruncateSync(e,r){return this.realFs.ftruncateSync(e,r)}watch(e,r,o){return this.realFs.watch(Ae.fromPortablePath(e),r,o)}watchFile(e,r,o){return this.realFs.watchFile(Ae.fromPortablePath(e),r,o)}unwatchFile(e,r){return this.realFs.unwatchFile(Ae.fromPortablePath(e),r)}makeCallback(e,r){return(o,a)=>{o?r(o):e(a)}}}});var En,DW=It(()=>{Y0();gf();Ba();En=class extends ws{constructor(e,{baseFs:r=new _n}={}){super(V),this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?V.normalize(e):this.baseFs.resolve(V.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}}});var SW,Gu,PW=It(()=>{Y0();gf();Ba();SW=Bt.root,Gu=class extends ws{constructor(e,{baseFs:r=new _n}={}){super(V),this.target=this.pathUtils.resolve(Bt.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Bt.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(SW,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(SW,this.pathUtils.relative(this.target,e))}}});var Am,xW=It(()=>{gf();Am=class extends ws{constructor(r,o){super(o);this.instance=null;this.factory=r}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(r){this.instance=r}mapFromBase(r){return r}mapToBase(r){return r}}});var V0,va,Gp,bW=It(()=>{V0=ve("fs");W0();Y0();DT();zD();Ba();va=4278190080,Gp=class extends qu{constructor({baseFs:r=new _n,filter:o=null,magicByte:a=42,maxOpenFiles:n=1/0,useCache:u=!0,maxAge:A=5e3,typeCheck:p=V0.constants.S_IFREG,getMountPoint:h,factoryPromise:E,factorySync:w}){if(Math.floor(a)!==a||!(a>1&&a<=127))throw new Error("The magic byte must be set to a round value between 1 and 127 included");super();this.fdMap=new Map;this.nextFd=3;this.isMount=new Set;this.notMount=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.baseFs=r,this.mountInstances=u?new Map:null,this.factoryPromise=E,this.factorySync=w,this.filter=o,this.getMountPoint=h,this.magic=a<<24,this.maxAge=A,this.maxOpenFiles=n,this.typeCheck=p}getExtractHint(r){return this.baseFs.getExtractHint(r)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(j0(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.saveAndClose?.(),this.mountInstances.delete(r)}discardAndClose(){if(j0(this),this.mountInstances)for(let[r,{childFs:o}]of this.mountInstances.entries())o.discardAndClose?.(),this.mountInstances.delete(r)}resolve(r){return this.baseFs.resolve(r)}remapFd(r,o){let a=this.nextFd++|this.magic;return this.fdMap.set(a,[r,o]),a}async openPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.openPromise(r,o,a),async(n,{subPath:u})=>this.remapFd(n,await n.openPromise(u,o,a)))}openSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.openSync(r,o,a),(n,{subPath:u})=>this.remapFd(n,n.openSync(u,o,a)))}async opendirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.opendirPromise(r,o),async(a,{subPath:n})=>await a.opendirPromise(n,o),{requireSubpath:!1})}opendirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.opendirSync(r,o),(a,{subPath:n})=>a.opendirSync(n,o),{requireSubpath:!1})}async readPromise(r,o,a,n,u){if((r&va)!==this.magic)return await this.baseFs.readPromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("read");let[p,h]=A;return await p.readPromise(h,o,a,n,u)}readSync(r,o,a,n,u){if((r&va)!==this.magic)return this.baseFs.readSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("readSync");let[p,h]=A;return p.readSync(h,o,a,n,u)}async writePromise(r,o,a,n,u){if((r&va)!==this.magic)return typeof o=="string"?await this.baseFs.writePromise(r,o,a):await this.baseFs.writePromise(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("write");let[p,h]=A;return typeof o=="string"?await p.writePromise(h,o,a):await p.writePromise(h,o,a,n,u)}writeSync(r,o,a,n,u){if((r&va)!==this.magic)return typeof o=="string"?this.baseFs.writeSync(r,o,a):this.baseFs.writeSync(r,o,a,n,u);let A=this.fdMap.get(r);if(typeof A>"u")throw ho("writeSync");let[p,h]=A;return typeof o=="string"?p.writeSync(h,o,a):p.writeSync(h,o,a,n,u)}async closePromise(r){if((r&va)!==this.magic)return await this.baseFs.closePromise(r);let o=this.fdMap.get(r);if(typeof o>"u")throw ho("close");this.fdMap.delete(r);let[a,n]=o;return await a.closePromise(n)}closeSync(r){if((r&va)!==this.magic)return this.baseFs.closeSync(r);let o=this.fdMap.get(r);if(typeof o>"u")throw ho("closeSync");this.fdMap.delete(r);let[a,n]=o;return a.closeSync(n)}createReadStream(r,o){return r===null?this.baseFs.createReadStream(r,o):this.makeCallSync(r,()=>this.baseFs.createReadStream(r,o),(a,{archivePath:n,subPath:u})=>{let A=a.createReadStream(u,o);return A.path=Ae.fromPortablePath(this.pathUtils.join(n,u)),A})}createWriteStream(r,o){return r===null?this.baseFs.createWriteStream(r,o):this.makeCallSync(r,()=>this.baseFs.createWriteStream(r,o),(a,{subPath:n})=>a.createWriteStream(n,o))}async realpathPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.realpathPromise(r),async(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=await this.baseFs.realpathPromise(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,await o.realpathPromise(n)))})}realpathSync(r){return this.makeCallSync(r,()=>this.baseFs.realpathSync(r),(o,{archivePath:a,subPath:n})=>{let u=this.realPaths.get(a);return typeof u>"u"&&(u=this.baseFs.realpathSync(a),this.realPaths.set(a,u)),this.pathUtils.join(u,this.pathUtils.relative(Bt.root,o.realpathSync(n)))})}async existsPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.existsPromise(r),async(o,{subPath:a})=>await o.existsPromise(a))}existsSync(r){return this.makeCallSync(r,()=>this.baseFs.existsSync(r),(o,{subPath:a})=>o.existsSync(a))}async accessPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.accessPromise(r,o),async(a,{subPath:n})=>await a.accessPromise(n,o))}accessSync(r,o){return this.makeCallSync(r,()=>this.baseFs.accessSync(r,o),(a,{subPath:n})=>a.accessSync(n,o))}async statPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.statPromise(r,o),async(a,{subPath:n})=>await a.statPromise(n,o))}statSync(r,o){return this.makeCallSync(r,()=>this.baseFs.statSync(r,o),(a,{subPath:n})=>a.statSync(n,o))}async fstatPromise(r,o){if((r&va)!==this.magic)return this.baseFs.fstatPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fstat");let[n,u]=a;return n.fstatPromise(u,o)}fstatSync(r,o){if((r&va)!==this.magic)return this.baseFs.fstatSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fstatSync");let[n,u]=a;return n.fstatSync(u,o)}async lstatPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.lstatPromise(r,o),async(a,{subPath:n})=>await a.lstatPromise(n,o))}lstatSync(r,o){return this.makeCallSync(r,()=>this.baseFs.lstatSync(r,o),(a,{subPath:n})=>a.lstatSync(n,o))}async fchmodPromise(r,o){if((r&va)!==this.magic)return this.baseFs.fchmodPromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fchmod");let[n,u]=a;return n.fchmodPromise(u,o)}fchmodSync(r,o){if((r&va)!==this.magic)return this.baseFs.fchmodSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("fchmodSync");let[n,u]=a;return n.fchmodSync(u,o)}async chmodPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.chmodPromise(r,o),async(a,{subPath:n})=>await a.chmodPromise(n,o))}chmodSync(r,o){return this.makeCallSync(r,()=>this.baseFs.chmodSync(r,o),(a,{subPath:n})=>a.chmodSync(n,o))}async fchownPromise(r,o,a){if((r&va)!==this.magic)return this.baseFs.fchownPromise(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw ho("fchown");let[u,A]=n;return u.fchownPromise(A,o,a)}fchownSync(r,o,a){if((r&va)!==this.magic)return this.baseFs.fchownSync(r,o,a);let n=this.fdMap.get(r);if(typeof n>"u")throw ho("fchownSync");let[u,A]=n;return u.fchownSync(A,o,a)}async chownPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.chownPromise(r,o,a),async(n,{subPath:u})=>await n.chownPromise(u,o,a))}chownSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.chownSync(r,o,a),(n,{subPath:u})=>n.chownSync(u,o,a))}async renamePromise(r,o){return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.renamePromise(r,o),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(a,{subPath:n})=>await this.makeCallPromise(o,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await a.renamePromise(n,A)}))}renameSync(r,o){return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.renameSync(r,o),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(a,{subPath:n})=>this.makeCallSync(o,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(u,{subPath:A})=>{if(a!==u)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return a.renameSync(n,A)}))}async copyFilePromise(r,o,a=0){let n=async(u,A,p,h)=>{if(a&V0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&V0.constants.COPYFILE_EXCL&&await this.existsPromise(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=await u.readFilePromise(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}await p.writeFilePromise(h,E)};return await this.makeCallPromise(r,async()=>await this.makeCallPromise(o,async()=>await this.baseFs.copyFilePromise(r,o,a),async(u,{subPath:A})=>await n(this.baseFs,r,u,A)),async(u,{subPath:A})=>await this.makeCallPromise(o,async()=>await n(u,A,this.baseFs,o),async(p,{subPath:h})=>u!==p?await n(u,A,p,h):await u.copyFilePromise(A,h,a)))}copyFileSync(r,o,a=0){let n=(u,A,p,h)=>{if(a&V0.constants.COPYFILE_FICLONE_FORCE)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${A}' -> ${h}'`),{code:"EXDEV"});if(a&V0.constants.COPYFILE_EXCL&&this.existsSync(A))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${A}' -> '${h}'`),{code:"EEXIST"});let E;try{E=u.readFileSync(A)}catch{throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${A}' -> '${h}'`),{code:"EINVAL"})}p.writeFileSync(h,E)};return this.makeCallSync(r,()=>this.makeCallSync(o,()=>this.baseFs.copyFileSync(r,o,a),(u,{subPath:A})=>n(this.baseFs,r,u,A)),(u,{subPath:A})=>this.makeCallSync(o,()=>n(u,A,this.baseFs,o),(p,{subPath:h})=>u!==p?n(u,A,p,h):u.copyFileSync(A,h,a)))}async appendFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.appendFilePromise(r,o,a),async(n,{subPath:u})=>await n.appendFilePromise(u,o,a))}appendFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.appendFileSync(r,o,a),(n,{subPath:u})=>n.appendFileSync(u,o,a))}async writeFilePromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.writeFilePromise(r,o,a),async(n,{subPath:u})=>await n.writeFilePromise(u,o,a))}writeFileSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.writeFileSync(r,o,a),(n,{subPath:u})=>n.writeFileSync(u,o,a))}async unlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.unlinkPromise(r),async(o,{subPath:a})=>await o.unlinkPromise(a))}unlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.unlinkSync(r),(o,{subPath:a})=>o.unlinkSync(a))}async utimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.utimesPromise(r,o,a),async(n,{subPath:u})=>await n.utimesPromise(u,o,a))}utimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.utimesSync(r,o,a),(n,{subPath:u})=>n.utimesSync(u,o,a))}async lutimesPromise(r,o,a){return await this.makeCallPromise(r,async()=>await this.baseFs.lutimesPromise(r,o,a),async(n,{subPath:u})=>await n.lutimesPromise(u,o,a))}lutimesSync(r,o,a){return this.makeCallSync(r,()=>this.baseFs.lutimesSync(r,o,a),(n,{subPath:u})=>n.lutimesSync(u,o,a))}async mkdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.mkdirPromise(r,o),async(a,{subPath:n})=>await a.mkdirPromise(n,o))}mkdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.mkdirSync(r,o),(a,{subPath:n})=>a.mkdirSync(n,o))}async rmdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmdirPromise(r,o),async(a,{subPath:n})=>await a.rmdirPromise(n,o))}rmdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmdirSync(r,o),(a,{subPath:n})=>a.rmdirSync(n,o))}async rmPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.rmPromise(r,o),async(a,{subPath:n})=>await a.rmPromise(n,o))}rmSync(r,o){return this.makeCallSync(r,()=>this.baseFs.rmSync(r,o),(a,{subPath:n})=>a.rmSync(n,o))}async linkPromise(r,o){return await this.makeCallPromise(o,async()=>await this.baseFs.linkPromise(r,o),async(a,{subPath:n})=>await a.linkPromise(r,n))}linkSync(r,o){return this.makeCallSync(o,()=>this.baseFs.linkSync(r,o),(a,{subPath:n})=>a.linkSync(r,n))}async symlinkPromise(r,o,a){return await this.makeCallPromise(o,async()=>await this.baseFs.symlinkPromise(r,o,a),async(n,{subPath:u})=>await n.symlinkPromise(r,u))}symlinkSync(r,o,a){return this.makeCallSync(o,()=>this.baseFs.symlinkSync(r,o,a),(n,{subPath:u})=>n.symlinkSync(r,u))}async readFilePromise(r,o){return this.makeCallPromise(r,async()=>await this.baseFs.readFilePromise(r,o),async(a,{subPath:n})=>await a.readFilePromise(n,o))}readFileSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readFileSync(r,o),(a,{subPath:n})=>a.readFileSync(n,o))}async readdirPromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.readdirPromise(r,o),async(a,{subPath:n})=>await a.readdirPromise(n,o),{requireSubpath:!1})}readdirSync(r,o){return this.makeCallSync(r,()=>this.baseFs.readdirSync(r,o),(a,{subPath:n})=>a.readdirSync(n,o),{requireSubpath:!1})}async readlinkPromise(r){return await this.makeCallPromise(r,async()=>await this.baseFs.readlinkPromise(r),async(o,{subPath:a})=>await o.readlinkPromise(a))}readlinkSync(r){return this.makeCallSync(r,()=>this.baseFs.readlinkSync(r),(o,{subPath:a})=>o.readlinkSync(a))}async truncatePromise(r,o){return await this.makeCallPromise(r,async()=>await this.baseFs.truncatePromise(r,o),async(a,{subPath:n})=>await a.truncatePromise(n,o))}truncateSync(r,o){return this.makeCallSync(r,()=>this.baseFs.truncateSync(r,o),(a,{subPath:n})=>a.truncateSync(n,o))}async ftruncatePromise(r,o){if((r&va)!==this.magic)return this.baseFs.ftruncatePromise(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("ftruncate");let[n,u]=a;return n.ftruncatePromise(u,o)}ftruncateSync(r,o){if((r&va)!==this.magic)return this.baseFs.ftruncateSync(r,o);let a=this.fdMap.get(r);if(typeof a>"u")throw ho("ftruncateSync");let[n,u]=a;return n.ftruncateSync(u,o)}watch(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watch(r,o,a),(n,{subPath:u})=>n.watch(u,o,a))}watchFile(r,o,a){return this.makeCallSync(r,()=>this.baseFs.watchFile(r,o,a),()=>um(this,r,o,a))}unwatchFile(r,o){return this.makeCallSync(r,()=>this.baseFs.unwatchFile(r,o),()=>q0(this,r,o))}async makeCallPromise(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return await o();let u=this.resolve(r),A=this.findMount(u);return A?n&&A.subPath==="/"?await o():await this.getMountPromise(A.archivePath,async p=>await a(p,A)):await o()}makeCallSync(r,o,a,{requireSubpath:n=!0}={}){if(typeof r!="string")return o();let u=this.resolve(r),A=this.findMount(u);return!A||n&&A.subPath==="/"?o():this.getMountSync(A.archivePath,p=>a(p,A))}findMount(r){if(this.filter&&!this.filter.test(r))return null;let o="";for(;;){let a=r.substring(o.length),n=this.getMountPoint(a,o);if(!n)return null;if(o=this.pathUtils.join(o,n),!this.isMount.has(o)){if(this.notMount.has(o))continue;try{if(this.typeCheck!==null&&(this.baseFs.statSync(o).mode&V0.constants.S_IFMT)!==this.typeCheck){this.notMount.add(o);continue}}catch{return null}this.isMount.add(o)}return{archivePath:o,subPath:this.pathUtils.join(Bt.root,r.substring(o.length))}}}limitOpenFiles(r){if(this.mountInstances===null)return;let o=Date.now(),a=o+this.maxAge,n=r===null?0:this.mountInstances.size-r;for(let[u,{childFs:A,expiresAt:p,refCount:h}]of this.mountInstances.entries())if(!(h!==0||A.hasOpenFileHandles?.())){if(o>=p){A.saveAndClose?.(),this.mountInstances.delete(u),n-=1;continue}else if(r===null||n<=0){a=p;break}A.saveAndClose?.(),this.mountInstances.delete(u),n-=1}this.limitOpenFilesTimeout===null&&(r===null&&this.mountInstances.size>0||r!==null)&&isFinite(a)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},a-o).unref())}async getMountPromise(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);if(!a){let n=await this.factoryPromise(this.baseFs,r);a=this.mountInstances.get(r),a||(a={childFs:n(),expiresAt:0,refCount:0})}this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,a.refCount+=1;try{return await o(a.childFs)}finally{a.refCount-=1}}else{let a=(await this.factoryPromise(this.baseFs,r))();try{return await o(a)}finally{a.saveAndClose?.()}}}getMountSync(r,o){if(this.mountInstances){let a=this.mountInstances.get(r);return a||(a={childFs:this.factorySync(this.baseFs,r),expiresAt:0,refCount:0}),this.mountInstances.delete(r),this.limitOpenFiles(this.maxOpenFiles-1),this.mountInstances.set(r,a),a.expiresAt=Date.now()+this.maxAge,o(a.childFs)}else{let a=this.factorySync(this.baseFs,r);try{return o(a)}finally{a.saveAndClose?.()}}}}});var $t,nS,kW=It(()=>{W0();Ba();$t=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),nS=class t extends hf{static{this.instance=new t}constructor(){super(V)}getExtractHint(){throw $t()}getRealPath(){throw $t()}resolve(){throw $t()}async openPromise(){throw $t()}openSync(){throw $t()}async opendirPromise(){throw $t()}opendirSync(){throw $t()}async readPromise(){throw $t()}readSync(){throw $t()}async writePromise(){throw $t()}writeSync(){throw $t()}async closePromise(){throw $t()}closeSync(){throw $t()}createWriteStream(){throw $t()}createReadStream(){throw $t()}async realpathPromise(){throw $t()}realpathSync(){throw $t()}async readdirPromise(){throw $t()}readdirSync(){throw $t()}async existsPromise(e){throw $t()}existsSync(e){throw $t()}async accessPromise(){throw $t()}accessSync(){throw $t()}async statPromise(){throw $t()}statSync(){throw $t()}async fstatPromise(e){throw $t()}fstatSync(e){throw $t()}async lstatPromise(e){throw $t()}lstatSync(e){throw $t()}async fchmodPromise(){throw $t()}fchmodSync(){throw $t()}async chmodPromise(){throw $t()}chmodSync(){throw $t()}async fchownPromise(){throw $t()}fchownSync(){throw $t()}async chownPromise(){throw $t()}chownSync(){throw $t()}async mkdirPromise(){throw $t()}mkdirSync(){throw $t()}async rmdirPromise(){throw $t()}rmdirSync(){throw $t()}async rmPromise(){throw $t()}rmSync(){throw $t()}async linkPromise(){throw $t()}linkSync(){throw $t()}async symlinkPromise(){throw $t()}symlinkSync(){throw $t()}async renamePromise(){throw $t()}renameSync(){throw $t()}async copyFilePromise(){throw $t()}copyFileSync(){throw $t()}async appendFilePromise(){throw $t()}appendFileSync(){throw $t()}async writeFilePromise(){throw $t()}writeFileSync(){throw $t()}async unlinkPromise(){throw $t()}unlinkSync(){throw $t()}async utimesPromise(){throw $t()}utimesSync(){throw $t()}async lutimesPromise(){throw $t()}lutimesSync(){throw $t()}async readFilePromise(){throw $t()}readFileSync(){throw $t()}async readlinkPromise(){throw $t()}readlinkSync(){throw $t()}async truncatePromise(){throw $t()}truncateSync(){throw $t()}async ftruncatePromise(e,r){throw $t()}ftruncateSync(e,r){throw $t()}watch(){throw $t()}watchFile(){throw $t()}unwatchFile(){throw $t()}}});var Wp,QW=It(()=>{gf();Ba();Wp=class extends ws{constructor(e){super(Ae),this.baseFs=e}mapFromBase(e){return Ae.fromPortablePath(e)}mapToBase(e){return Ae.toPortablePath(e)}}});var C_e,ST,I_e,qs,FW=It(()=>{Y0();gf();Ba();C_e=/^[0-9]+$/,ST=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,I_e=/^([^/]+-)?[a-f0-9]+$/,qs=class t extends ws{static makeVirtualPath(e,r,o){if(V.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!V.basename(r).match(I_e))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let n=V.relative(V.dirname(e),o).split("/"),u=0;for(;u{PT=et(ve("buffer")),RW=ve("url"),TW=ve("util");gf();Ba();iS=class extends ws{constructor(e){super(Ae),this.baseFs=e}mapFromBase(e){return e}mapToBase(e){if(typeof e=="string")return e;if(e instanceof URL)return(0,RW.fileURLToPath)(e);if(Buffer.isBuffer(e)){let r=e.toString();if(!w_e(e,r))throw new Error("Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942");return r}throw new Error(`Unsupported path type: ${(0,TW.inspect)(e)}`)}}});var _W,go,df,Yp,sS,oS,fm,_c,Hc,NW,OW,MW,UW,cw,HW=It(()=>{_W=ve("readline"),go=Symbol("kBaseFs"),df=Symbol("kFd"),Yp=Symbol("kClosePromise"),sS=Symbol("kCloseResolve"),oS=Symbol("kCloseReject"),fm=Symbol("kRefs"),_c=Symbol("kRef"),Hc=Symbol("kUnref"),cw=class{constructor(e,r){this[UW]=1;this[MW]=void 0;this[OW]=void 0;this[NW]=void 0;this[go]=r,this[df]=e}get fd(){return this[df]}async appendFile(e,r){try{this[_c](this.appendFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;return await this[go].appendFilePromise(this.fd,e,o?{encoding:o}:void 0)}finally{this[Hc]()}}async chown(e,r){try{return this[_c](this.chown),await this[go].fchownPromise(this.fd,e,r)}finally{this[Hc]()}}async chmod(e){try{return this[_c](this.chmod),await this[go].fchmodPromise(this.fd,e)}finally{this[Hc]()}}createReadStream(e){return this[go].createReadStream(null,{...e,fd:this.fd})}createWriteStream(e){return this[go].createWriteStream(null,{...e,fd:this.fd})}datasync(){throw new Error("Method not implemented.")}sync(){throw new Error("Method not implemented.")}async read(e,r,o,a){try{this[_c](this.read);let n;return Buffer.isBuffer(e)?n=e:(e??={},n=e.buffer??Buffer.alloc(16384),r=e.offset||0,o=e.length??n.byteLength,a=e.position??null),r??=0,o??=0,o===0?{bytesRead:o,buffer:n}:{bytesRead:await this[go].readPromise(this.fd,n,r,o,a),buffer:n}}finally{this[Hc]()}}async readFile(e){try{this[_c](this.readFile);let r=(typeof e=="string"?e:e?.encoding)??void 0;return await this[go].readFilePromise(this.fd,r)}finally{this[Hc]()}}readLines(e){return(0,_W.createInterface)({input:this.createReadStream(e),crlfDelay:1/0})}async stat(e){try{return this[_c](this.stat),await this[go].fstatPromise(this.fd,e)}finally{this[Hc]()}}async truncate(e){try{return this[_c](this.truncate),await this[go].ftruncatePromise(this.fd,e)}finally{this[Hc]()}}utimes(e,r){throw new Error("Method not implemented.")}async writeFile(e,r){try{this[_c](this.writeFile);let o=(typeof r=="string"?r:r?.encoding)??void 0;await this[go].writeFilePromise(this.fd,e,o)}finally{this[Hc]()}}async write(...e){try{if(this[_c](this.write),ArrayBuffer.isView(e[0])){let[r,o,a,n]=e;return{bytesWritten:await this[go].writePromise(this.fd,r,o??void 0,a??void 0,n??void 0),buffer:r}}else{let[r,o,a]=e;return{bytesWritten:await this[go].writePromise(this.fd,r,o,a),buffer:r}}}finally{this[Hc]()}}async writev(e,r){try{this[_c](this.writev);let o=0;if(typeof r<"u")for(let a of e){let n=await this.write(a,void 0,void 0,r);o+=n.bytesWritten,r+=n.bytesWritten}else for(let a of e){let n=await this.write(a);o+=n.bytesWritten}return{buffers:e,bytesWritten:o}}finally{this[Hc]()}}readv(e,r){throw new Error("Method not implemented.")}close(){if(this[df]===-1)return Promise.resolve();if(this[Yp])return this[Yp];if(this[fm]--,this[fm]===0){let e=this[df];this[df]=-1,this[Yp]=this[go].closePromise(e).finally(()=>{this[Yp]=void 0})}else this[Yp]=new Promise((e,r)=>{this[sS]=e,this[oS]=r}).finally(()=>{this[Yp]=void 0,this[oS]=void 0,this[sS]=void 0});return this[Yp]}[(go,df,UW=fm,MW=Yp,OW=sS,NW=oS,_c)](e){if(this[df]===-1){let r=new Error("file closed");throw r.code="EBADF",r.syscall=e.name,r}this[fm]++}[Hc](){if(this[fm]--,this[fm]===0){let e=this[df];this[df]=-1,this[go].closePromise(e).then(this[sS],this[oS])}}}});function uw(t,e){e=new iS(e);let r=(o,a,n)=>{let u=o[a];o[a]=n,typeof u?.[pm.promisify.custom]<"u"&&(n[pm.promisify.custom]=u[pm.promisify.custom])};{r(t,"exists",(o,...a)=>{let u=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{e.existsPromise(o).then(A=>{u(A)},()=>{u(!1)})})}),r(t,"read",(...o)=>{let[a,n,u,A,p,h]=o;if(o.length<=3){let E={};o.length<3?h=o[1]:(E=o[1],h=o[2]),{buffer:n=Buffer.alloc(16384),offset:u=0,length:A=n.byteLength,position:p}=E}if(u==null&&(u=0),A|=0,A===0){process.nextTick(()=>{h(null,0,n)});return}p==null&&(p=-1),process.nextTick(()=>{e.readPromise(a,n,u,A,p).then(E=>{h(null,E,n)},E=>{h(E,0,n)})})});for(let o of qW){let a=o.replace(/Promise$/,"");if(typeof t[a]>"u")continue;let n=e[o];if(typeof n>"u")continue;r(t,a,(...A)=>{let h=typeof A[A.length-1]=="function"?A.pop():()=>{};process.nextTick(()=>{n.apply(e,A).then(E=>{h(null,E)},E=>{h(E)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",o=>{try{return e.existsSync(o)}catch{return!1}}),r(t,"readSync",(...o)=>{let[a,n,u,A,p]=o;return o.length<=3&&({offset:u=0,length:A=n.byteLength,position:p}=o[2]||{}),u==null&&(u=0),A|=0,A===0?0:(p==null&&(p=-1),e.readSync(a,n,u,A,p))});for(let o of B_e){let a=o;if(typeof t[a]>"u")continue;let n=e[o];typeof n>"u"||r(t,a,n.bind(e))}t.realpathSync.native=t.realpathSync}{let o=t.promises;for(let a of qW){let n=a.replace(/Promise$/,"");if(typeof o[n]>"u")continue;let u=e[a];typeof u>"u"||a!=="open"&&r(o,n,(A,...p)=>A instanceof cw?A[n].apply(A,p):u.call(e,A,...p))}r(o,"open",async(...a)=>{let n=await e.openPromise(...a);return new cw(n,e)})}t.read[pm.promisify.custom]=async(o,a,...n)=>({bytesRead:await e.readPromise(o,a,...n),buffer:a}),t.write[pm.promisify.custom]=async(o,a,...n)=>({bytesWritten:await e.writePromise(o,a,...n),buffer:a})}function aS(t,e){let r=Object.create(t);return uw(r,e),r}var pm,B_e,qW,jW=It(()=>{pm=ve("util");LW();HW();B_e=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","fchmodSync","chownSync","fchownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","rmSync","statSync","symlinkSync","truncateSync","ftruncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),qW=new Set(["accessPromise","appendFilePromise","fchmodPromise","chmodPromise","fchownPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","rmPromise","statPromise","symlinkPromise","truncatePromise","ftruncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"])});function GW(t){let e=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return`${t}${e}`}function WW(){if(xT)return xT;let t=Ae.toPortablePath(YW.default.tmpdir()),e=ae.realpathSync(t);return process.once("exit",()=>{ae.rmtempSync()}),xT={tmpdir:t,realTmpdir:e}}var YW,qc,xT,ae,VW=It(()=>{YW=et(ve("os"));Y0();Ba();qc=new Set,xT=null;ae=Object.assign(new _n,{detachTemp(t){qc.delete(t)},mktempSync(t){let{tmpdir:e,realTmpdir:r}=WW();for(;;){let o=GW("xfs-");try{this.mkdirSync(V.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=V.join(r,o);if(qc.add(a),typeof t>"u")return a;try{return t(a)}finally{if(qc.has(a)){qc.delete(a);try{this.removeSync(a)}catch{}}}}},async mktempPromise(t){let{tmpdir:e,realTmpdir:r}=WW();for(;;){let o=GW("xfs-");try{await this.mkdirPromise(V.join(e,o))}catch(n){if(n.code==="EEXIST")continue;throw n}let a=V.join(r,o);if(qc.add(a),typeof t>"u")return a;try{return await t(a)}finally{if(qc.has(a)){qc.delete(a);try{await this.removePromise(a)}catch{}}}}},async rmtempPromise(){await Promise.all(Array.from(qc.values()).map(async t=>{try{await ae.removePromise(t,{maxRetries:0}),qc.delete(t)}catch{}}))},rmtempSync(){for(let t of qc)try{ae.removeSync(t),qc.delete(t)}catch{}}})});var Aw={};Vt(Aw,{AliasFS:()=>ju,BasePortableFakeFS:()=>qu,CustomDir:()=>lw,CwdFS:()=>En,FakeFS:()=>hf,Filename:()=>mr,JailFS:()=>Gu,LazyFS:()=>Am,MountFS:()=>Gp,NoFS:()=>nS,NodeFS:()=>_n,PortablePath:()=>Bt,PosixFS:()=>Wp,ProxiedFS:()=>ws,VirtualFS:()=>qs,constants:()=>Si,errors:()=>sr,extendFs:()=>aS,normalizeLineEndings:()=>G0,npath:()=>Ae,opendir:()=>eS,patchFs:()=>uw,ppath:()=>V,setupCopyIndex:()=>$D,statUtils:()=>wa,unwatchAllFiles:()=>j0,unwatchFile:()=>q0,watchFile:()=>um,xfs:()=>ae});var St=It(()=>{uW();zD();IT();vT();dW();DT();W0();Ba();Ba();wW();W0();DW();PW();xW();bW();kW();Y0();QW();gf();FW();jW();VW()});var ZW=_((qPt,XW)=>{XW.exports=zW;zW.sync=D_e;var KW=ve("fs");function v_e(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var o=0;o{rY.exports=eY;eY.sync=S_e;var $W=ve("fs");function eY(t,e,r){$W.stat(t,function(o,a){r(o,o?!1:tY(a,e))})}function S_e(t,e){return tY($W.statSync(t),e)}function tY(t,e){return t.isFile()&&P_e(t,e)}function P_e(t,e){var r=t.mode,o=t.uid,a=t.gid,n=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),u=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),A=parseInt("100",8),p=parseInt("010",8),h=parseInt("001",8),E=A|p,w=r&h||r&p&&a===u||r&A&&o===n||r&E&&n===0;return w}});var sY=_((WPt,iY)=>{var GPt=ve("fs"),lS;process.platform==="win32"||global.TESTING_WINDOWS?lS=ZW():lS=nY();iY.exports=bT;bT.sync=x_e;function bT(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(o,a){bT(t,e||{},function(n,u){n?a(n):o(u)})})}lS(t,e||{},function(o,a){o&&(o.code==="EACCES"||e&&e.ignoreErrors)&&(o=null,a=!1),r(o,a)})}function x_e(t,e){try{return lS.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var fY=_((YPt,AY)=>{var hm=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",oY=ve("path"),b_e=hm?";":":",aY=sY(),lY=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),cY=(t,e)=>{let r=e.colon||b_e,o=t.match(/\//)||hm&&t.match(/\\/)?[""]:[...hm?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],a=hm?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",n=hm?a.split(r):[""];return hm&&t.indexOf(".")!==-1&&n[0]!==""&&n.unshift(""),{pathEnv:o,pathExt:n,pathExtExe:a}},uY=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:o,pathExt:a,pathExtExe:n}=cY(t,e),u=[],A=h=>new Promise((E,w)=>{if(h===o.length)return e.all&&u.length?E(u):w(lY(t));let D=o[h],b=/^".*"$/.test(D)?D.slice(1,-1):D,C=oY.join(b,t),T=!b&&/^\.[\\\/]/.test(t)?t.slice(0,2)+C:C;E(p(T,h,0))}),p=(h,E,w)=>new Promise((D,b)=>{if(w===a.length)return D(A(E+1));let C=a[w];aY(h+C,{pathExt:n},(T,N)=>{if(!T&&N)if(e.all)u.push(h+C);else return D(h+C);return D(p(h,E,w+1))})});return r?A(0).then(h=>r(null,h),r):A(0)},k_e=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:o,pathExtExe:a}=cY(t,e),n=[];for(let u=0;u{"use strict";var pY=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(o=>o.toUpperCase()==="PATH")||"Path"};kT.exports=pY;kT.exports.default=pY});var yY=_((KPt,mY)=>{"use strict";var gY=ve("path"),Q_e=fY(),F_e=hY();function dY(t,e){let r=t.options.env||process.env,o=process.cwd(),a=t.options.cwd!=null,n=a&&process.chdir!==void 0&&!process.chdir.disabled;if(n)try{process.chdir(t.options.cwd)}catch{}let u;try{u=Q_e.sync(t.command,{path:r[F_e({env:r})],pathExt:e?gY.delimiter:void 0})}catch{}finally{n&&process.chdir(o)}return u&&(u=gY.resolve(a?t.options.cwd:"",u)),u}function R_e(t){return dY(t)||dY(t,!0)}mY.exports=R_e});var EY=_((JPt,FT)=>{"use strict";var QT=/([()\][%!^"`<>&|;, *?])/g;function T_e(t){return t=t.replace(QT,"^$1"),t}function L_e(t,e){return t=`${t}`,t=t.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),t=t.replace(/(?=(\\+?)?)\1$/,"$1$1"),t=`"${t}"`,t=t.replace(QT,"^$1"),e&&(t=t.replace(QT,"^$1")),t}FT.exports.command=T_e;FT.exports.argument=L_e});var IY=_((zPt,CY)=>{"use strict";CY.exports=/^#!(.*)/});var BY=_((XPt,wY)=>{"use strict";var N_e=IY();wY.exports=(t="")=>{let e=t.match(N_e);if(!e)return null;let[r,o]=e[0].replace(/#! ?/,"").split(" "),a=r.split("/").pop();return a==="env"?o:o?`${a} ${o}`:a}});var DY=_((ZPt,vY)=>{"use strict";var RT=ve("fs"),O_e=BY();function M_e(t){let r=Buffer.alloc(150),o;try{o=RT.openSync(t,"r"),RT.readSync(o,r,0,150,0),RT.closeSync(o)}catch{}return O_e(r.toString())}vY.exports=M_e});var bY=_(($Pt,xY)=>{"use strict";var U_e=ve("path"),SY=yY(),PY=EY(),__e=DY(),H_e=process.platform==="win32",q_e=/\.(?:com|exe)$/i,j_e=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function G_e(t){t.file=SY(t);let e=t.file&&__e(t.file);return e?(t.args.unshift(t.file),t.command=e,SY(t)):t.file}function W_e(t){if(!H_e)return t;let e=G_e(t),r=!q_e.test(e);if(t.options.forceShell||r){let o=j_e.test(e);t.command=U_e.normalize(t.command),t.command=PY.command(t.command),t.args=t.args.map(n=>PY.argument(n,o));let a=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${a}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Y_e(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let o={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?o:W_e(o)}xY.exports=Y_e});var FY=_((ext,QY)=>{"use strict";var TT=process.platform==="win32";function LT(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function V_e(t,e){if(!TT)return;let r=t.emit;t.emit=function(o,a){if(o==="exit"){let n=kY(a,e);if(n)return r.call(t,"error",n)}return r.apply(t,arguments)}}function kY(t,e){return TT&&t===1&&!e.file?LT(e.original,"spawn"):null}function K_e(t,e){return TT&&t===1&&!e.file?LT(e.original,"spawnSync"):null}QY.exports={hookChildProcess:V_e,verifyENOENT:kY,verifyENOENTSync:K_e,notFoundError:LT}});var MT=_((txt,gm)=>{"use strict";var RY=ve("child_process"),NT=bY(),OT=FY();function TY(t,e,r){let o=NT(t,e,r),a=RY.spawn(o.command,o.args,o.options);return OT.hookChildProcess(a,o),a}function J_e(t,e,r){let o=NT(t,e,r),a=RY.spawnSync(o.command,o.args,o.options);return a.error=a.error||OT.verifyENOENTSync(a.status,o),a}gm.exports=TY;gm.exports.spawn=TY;gm.exports.sync=J_e;gm.exports._parse=NT;gm.exports._enoent=OT});var NY=_((rxt,LY)=>{"use strict";function z_e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function K0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,K0)}z_e(K0,Error);K0.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;w>",P=cr(">>",!1),y=">&",R=cr(">&",!1),z=">",X=cr(">",!1),$="<<<",se=cr("<<<",!1),be="<&",Fe=cr("<&",!1),lt="<",Et=cr("<",!1),qt=function(L){return{type:"argument",segments:[].concat(...L)}},nr=function(L){return L},Pt="$'",cn=cr("$'",!1),Sr="'",yr=cr("'",!1),Rr=function(L){return[{type:"text",text:L}]},Xr='""',$n=cr('""',!1),Xs=function(){return{type:"text",text:""}},Hi='"',Qs=cr('"',!1),Zs=function(L){return L},bi=function(L){return{type:"arithmetic",arithmetic:L,quoted:!0}},Fs=function(L){return{type:"shell",shell:L,quoted:!0}},$s=function(L){return{type:"variable",...L,quoted:!0}},PA=function(L){return{type:"text",text:L}},gu=function(L){return{type:"arithmetic",arithmetic:L,quoted:!1}},op=function(L){return{type:"shell",shell:L,quoted:!1}},ap=function(L){return{type:"variable",...L,quoted:!1}},Rs=function(L){return{type:"glob",pattern:L}},Nn=/^[^']/,hs=Ni(["'"],!0,!1),Ts=function(L){return L.join("")},pc=/^[^$"]/,hc=Ni(["$",'"'],!0,!1),gc=`\\ -`,xA=cr(`\\ -`,!1),bA=function(){return""},Ro="\\",To=cr("\\",!1),kA=/^[\\$"`]/,pr=Ni(["\\","$",'"',"`"],!1,!1),Me=function(L){return L},ia="\\a",dc=cr("\\a",!1),Er=function(){return"a"},du="\\b",QA=cr("\\b",!1),FA=function(){return"\b"},mc=/^[Ee]/,yc=Ni(["E","e"],!1,!1),Il=function(){return"\x1B"},we="\\f",Tt=cr("\\f",!1),wl=function(){return"\f"},Bi="\\n",Ls=cr("\\n",!1),Ft=function(){return` -`},Bn="\\r",Lo=cr("\\r",!1),ki=function(){return"\r"},vi="\\t",sa=cr("\\t",!1),un=function(){return" "},qn="\\v",Ec=cr("\\v",!1),lp=function(){return"\v"},oa=/^[\\'"?]/,aa=Ni(["\\","'",'"',"?"],!1,!1),la=function(L){return String.fromCharCode(parseInt(L,16))},Ze="\\x",ca=cr("\\x",!1),mu="\\u",Bl=cr("\\u",!1),dn="\\U",No=cr("\\U",!1),RA=function(L){return String.fromCodePoint(parseInt(L,16))},TA=/^[0-7]/,Oo=Ni([["0","7"]],!1,!1),qa=/^[0-9a-fA-f]/,Ot=Ni([["0","9"],["a","f"],["A","f"]],!1,!1),vn=Iu(),Mo="{}",ua=cr("{}",!1),qi=function(){return"{}"},vl="-",Cc=cr("-",!1),Dl="+",Aa=cr("+",!1),Di=".",rs=cr(".",!1),ja=function(L,K,re){return{type:"number",value:(L==="-"?-1:1)*parseFloat(K.join("")+"."+re.join(""))}},yu=function(L,K){return{type:"number",value:(L==="-"?-1:1)*parseInt(K.join(""))}},Sl=function(L){return{type:"variable",...L}},pi=function(L){return{type:"variable",name:L}},Dn=function(L){return L},Pl="*",Je=cr("*",!1),st="/",vt=cr("/",!1),ar=function(L,K,re){return{type:K==="*"?"multiplication":"division",right:re}},ee=function(L,K){return K.reduce((re,ge)=>({left:re,...ge}),L)},ye=function(L,K,re){return{type:K==="+"?"addition":"subtraction",right:re}},Ne="$((",gt=cr("$((",!1),mt="))",Dt=cr("))",!1),er=function(L){return L},sn="$(",ei=cr("$(",!1),Qi=function(L){return L},Sn="${",fa=cr("${",!1),wd=":-",BI=cr(":-",!1),eo=function(L,K){return{name:L,defaultValue:K}},Bd=":-}",cp=cr(":-}",!1),vI=function(L){return{name:L,defaultValue:[]}},to=":+",up=cr(":+",!1),Ap=function(L,K){return{name:L,alternativeValue:K}},Ic=":+}",fp=cr(":+}",!1),s0=function(L){return{name:L,alternativeValue:[]}},o0=function(L){return{name:L}},a0="$",vd=cr("$",!1),Eu=function(L){return e.isGlobPattern(L)},ro=function(L){return L},Ga=/^[a-zA-Z0-9_]/,pp=Ni([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),l0=function(){return xd()},Wa=/^[$@*?#a-zA-Z0-9_\-]/,Ya=Ni(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),Dd=/^[()}<>$|&; \t"']/,LA=Ni(["(",")","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Sd=/^[<>&; \t"']/,Pd=Ni(["<",">","&",";"," "," ",'"',"'"],!1,!1),NA=/^[ \t]/,OA=Ni([" "," "],!1,!1),W=0,xt=0,MA=[{line:1,column:1}],no=0,Cu=[],dt=0,wc;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function xd(){return t.substring(xt,W)}function c0(){return wu(xt,W)}function DI(L,K){throw K=K!==void 0?K:wu(xt,W),UA([u0(L)],t.substring(xt,W),K)}function hp(L,K){throw K=K!==void 0?K:wu(xt,W),oi(L,K)}function cr(L,K){return{type:"literal",text:L,ignoreCase:K}}function Ni(L,K,re){return{type:"class",parts:L,inverted:K,ignoreCase:re}}function Iu(){return{type:"any"}}function pa(){return{type:"end"}}function u0(L){return{type:"other",description:L}}function Bc(L){var K=MA[L],re;if(K)return K;for(re=L-1;!MA[re];)re--;for(K=MA[re],K={line:K.line,column:K.column};reno&&(no=W,Cu=[]),Cu.push(L))}function oi(L,K){return new K0(L,null,null,K)}function UA(L,K,re){return new K0(K0.buildMessage(L,K),L,K,re)}function ha(){var L,K,re;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();return K!==r?(re=Uo(),re===r&&(re=null),re!==r?(xt=L,K=n(re),L=K):(W=L,L=r)):(W=L,L=r),L}function Uo(){var L,K,re,ge,Ye;if(L=W,K=gp(),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();re!==r?(ge=A0(),ge!==r?(Ye=ga(),Ye===r&&(Ye=null),Ye!==r?(xt=L,K=u(K,ge,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;if(L===r)if(L=W,K=gp(),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();re!==r?(ge=A0(),ge===r&&(ge=null),ge!==r?(xt=L,K=A(K,ge),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;return L}function ga(){var L,K,re,ge,Ye;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(re=Uo(),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=p(re),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r;return L}function A0(){var L;return t.charCodeAt(W)===59?(L=h,W++):(L=r,dt===0&&wt(E)),L===r&&(t.charCodeAt(W)===38?(L=w,W++):(L=r,dt===0&&wt(D))),L}function gp(){var L,K,re;return L=W,K=_A(),K!==r?(re=f0(),re===r&&(re=null),re!==r?(xt=L,K=b(K,re),L=K):(W=L,L=r)):(W=L,L=r),L}function f0(){var L,K,re,ge,Ye,At,hr;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(re=bd(),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=gp(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();At!==r?(xt=L,K=C(re,Ye),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;return L}function bd(){var L;return t.substr(W,2)===T?(L=T,W+=2):(L=r,dt===0&&wt(N)),L===r&&(t.substr(W,2)===U?(L=U,W+=2):(L=r,dt===0&&wt(J))),L}function _A(){var L,K,re;return L=W,K=Bu(),K!==r?(re=p0(),re===r&&(re=null),re!==r?(xt=L,K=te(K,re),L=K):(W=L,L=r)):(W=L,L=r),L}function p0(){var L,K,re,ge,Ye,At,hr;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(re=vc(),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=_A(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();At!==r?(xt=L,K=le(re,Ye),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;return L}function vc(){var L;return t.substr(W,2)===ce?(L=ce,W+=2):(L=r,dt===0&&wt(ue)),L===r&&(t.charCodeAt(W)===124?(L=Ie,W++):(L=r,dt===0&&wt(he))),L}function Dc(){var L,K,re,ge,Ye,At;if(L=W,K=yp(),K!==r)if(t.charCodeAt(W)===61?(re=De,W++):(re=r,dt===0&&wt(Ee)),re!==r)if(ge=HA(),ge!==r){for(Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();Ye!==r?(xt=L,K=g(K,ge),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r;else W=L,L=r;if(L===r)if(L=W,K=yp(),K!==r)if(t.charCodeAt(W)===61?(re=De,W++):(re=r,dt===0&&wt(Ee)),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=me(K),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r;return L}function Bu(){var L,K,re,ge,Ye,At,hr,Ir,Rn,ai,ns;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(t.charCodeAt(W)===40?(re=Ce,W++):(re=r,dt===0&&wt(fe)),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=Uo(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();if(At!==r)if(t.charCodeAt(W)===41?(hr=ie,W++):(hr=r,dt===0&&wt(Z)),hr!==r){for(Ir=[],Rn=bt();Rn!==r;)Ir.push(Rn),Rn=bt();if(Ir!==r){for(Rn=[],ai=On();ai!==r;)Rn.push(ai),ai=On();if(Rn!==r){for(ai=[],ns=bt();ns!==r;)ai.push(ns),ns=bt();ai!==r?(xt=L,K=Se(Ye,Rn),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;if(L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r)if(t.charCodeAt(W)===123?(re=Re,W++):(re=r,dt===0&&wt(ht)),re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r)if(Ye=Uo(),Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();if(At!==r)if(t.charCodeAt(W)===125?(hr=q,W++):(hr=r,dt===0&&wt(nt)),hr!==r){for(Ir=[],Rn=bt();Rn!==r;)Ir.push(Rn),Rn=bt();if(Ir!==r){for(Rn=[],ai=On();ai!==r;)Rn.push(ai),ai=On();if(Rn!==r){for(ai=[],ns=bt();ns!==r;)ai.push(ns),ns=bt();ai!==r?(xt=L,K=Le(Ye,Rn),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r}else W=L,L=r;else W=L,L=r;if(L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r){for(re=[],ge=Dc();ge!==r;)re.push(ge),ge=Dc();if(re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();if(ge!==r){if(Ye=[],At=Sc(),At!==r)for(;At!==r;)Ye.push(At),At=Sc();else Ye=r;if(Ye!==r){for(At=[],hr=bt();hr!==r;)At.push(hr),hr=bt();At!==r?(xt=L,K=Te(re,Ye),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}else W=L,L=r}else W=L,L=r;if(L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r){if(re=[],ge=Dc(),ge!==r)for(;ge!==r;)re.push(ge),ge=Dc();else re=r;if(re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=ke(re),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r}}}return L}function gs(){var L,K,re,ge,Ye;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r){if(re=[],ge=Ci(),ge!==r)for(;ge!==r;)re.push(ge),ge=Ci();else re=r;if(re!==r){for(ge=[],Ye=bt();Ye!==r;)ge.push(Ye),Ye=bt();ge!==r?(xt=L,K=Ke(re),L=K):(W=L,L=r)}else W=L,L=r}else W=L,L=r;return L}function Sc(){var L,K,re;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();if(K!==r?(re=On(),re!==r?(xt=L,K=xe(re),L=K):(W=L,L=r)):(W=L,L=r),L===r){for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();K!==r?(re=Ci(),re!==r?(xt=L,K=xe(re),L=K):(W=L,L=r)):(W=L,L=r)}return L}function On(){var L,K,re,ge,Ye;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();return K!==r?(tt.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(He)),re===r&&(re=null),re!==r?(ge=ji(),ge!==r?(Ye=Ci(),Ye!==r?(xt=L,K=x(re,ge,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function ji(){var L;return t.substr(W,2)===I?(L=I,W+=2):(L=r,dt===0&&wt(P)),L===r&&(t.substr(W,2)===y?(L=y,W+=2):(L=r,dt===0&&wt(R)),L===r&&(t.charCodeAt(W)===62?(L=z,W++):(L=r,dt===0&&wt(X)),L===r&&(t.substr(W,3)===$?(L=$,W+=3):(L=r,dt===0&&wt(se)),L===r&&(t.substr(W,2)===be?(L=be,W+=2):(L=r,dt===0&&wt(Fe)),L===r&&(t.charCodeAt(W)===60?(L=lt,W++):(L=r,dt===0&&wt(Et))))))),L}function Ci(){var L,K,re;for(L=W,K=[],re=bt();re!==r;)K.push(re),re=bt();return K!==r?(re=HA(),re!==r?(xt=L,K=xe(re),L=K):(W=L,L=r)):(W=L,L=r),L}function HA(){var L,K,re;if(L=W,K=[],re=vu(),re!==r)for(;re!==r;)K.push(re),re=vu();else K=r;return K!==r&&(xt=L,K=qt(K)),L=K,L}function vu(){var L,K;return L=W,K=An(),K!==r&&(xt=L,K=nr(K)),L=K,L===r&&(L=W,K=h0(),K!==r&&(xt=L,K=nr(K)),L=K,L===r&&(L=W,K=g0(),K!==r&&(xt=L,K=nr(K)),L=K,L===r&&(L=W,K=Gi(),K!==r&&(xt=L,K=nr(K)),L=K))),L}function An(){var L,K,re,ge;return L=W,t.substr(W,2)===Pt?(K=Pt,W+=2):(K=r,dt===0&&wt(cn)),K!==r?(re=fn(),re!==r?(t.charCodeAt(W)===39?(ge=Sr,W++):(ge=r,dt===0&&wt(yr)),ge!==r?(xt=L,K=Rr(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function h0(){var L,K,re,ge;return L=W,t.charCodeAt(W)===39?(K=Sr,W++):(K=r,dt===0&&wt(yr)),K!==r?(re=Du(),re!==r?(t.charCodeAt(W)===39?(ge=Sr,W++):(ge=r,dt===0&&wt(yr)),ge!==r?(xt=L,K=Rr(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function g0(){var L,K,re,ge;if(L=W,t.substr(W,2)===Xr?(K=Xr,W+=2):(K=r,dt===0&&wt($n)),K!==r&&(xt=L,K=Xs()),L=K,L===r)if(L=W,t.charCodeAt(W)===34?(K=Hi,W++):(K=r,dt===0&&wt(Qs)),K!==r){for(re=[],ge=Va();ge!==r;)re.push(ge),ge=Va();re!==r?(t.charCodeAt(W)===34?(ge=Hi,W++):(ge=r,dt===0&&wt(Qs)),ge!==r?(xt=L,K=Zs(re),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;return L}function Gi(){var L,K,re;if(L=W,K=[],re=io(),re!==r)for(;re!==r;)K.push(re),re=io();else K=r;return K!==r&&(xt=L,K=Zs(K)),L=K,L}function Va(){var L,K;return L=W,K=Vr(),K!==r&&(xt=L,K=bi(K)),L=K,L===r&&(L=W,K=mp(),K!==r&&(xt=L,K=Fs(K)),L=K,L===r&&(L=W,K=jA(),K!==r&&(xt=L,K=$s(K)),L=K,L===r&&(L=W,K=Su(),K!==r&&(xt=L,K=PA(K)),L=K))),L}function io(){var L,K;return L=W,K=Vr(),K!==r&&(xt=L,K=gu(K)),L=K,L===r&&(L=W,K=mp(),K!==r&&(xt=L,K=op(K)),L=K,L===r&&(L=W,K=jA(),K!==r&&(xt=L,K=ap(K)),L=K,L===r&&(L=W,K=kd(),K!==r&&(xt=L,K=Rs(K)),L=K,L===r&&(L=W,K=dp(),K!==r&&(xt=L,K=PA(K)),L=K)))),L}function Du(){var L,K,re;for(L=W,K=[],Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs));re!==r;)K.push(re),Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs));return K!==r&&(xt=L,K=Ts(K)),L=K,L}function Su(){var L,K,re;if(L=W,K=[],re=Ka(),re===r&&(pc.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hc))),re!==r)for(;re!==r;)K.push(re),re=Ka(),re===r&&(pc.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hc)));else K=r;return K!==r&&(xt=L,K=Ts(K)),L=K,L}function Ka(){var L,K,re;return L=W,t.substr(W,2)===gc?(K=gc,W+=2):(K=r,dt===0&&wt(xA)),K!==r&&(xt=L,K=bA()),L=K,L===r&&(L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(kA.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(pr)),re!==r?(xt=L,K=Me(re),L=K):(W=L,L=r)):(W=L,L=r)),L}function fn(){var L,K,re;for(L=W,K=[],re=so(),re===r&&(Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs)));re!==r;)K.push(re),re=so(),re===r&&(Nn.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(hs)));return K!==r&&(xt=L,K=Ts(K)),L=K,L}function so(){var L,K,re;return L=W,t.substr(W,2)===ia?(K=ia,W+=2):(K=r,dt===0&&wt(dc)),K!==r&&(xt=L,K=Er()),L=K,L===r&&(L=W,t.substr(W,2)===du?(K=du,W+=2):(K=r,dt===0&&wt(QA)),K!==r&&(xt=L,K=FA()),L=K,L===r&&(L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(mc.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(yc)),re!==r?(xt=L,K=Il(),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===we?(K=we,W+=2):(K=r,dt===0&&wt(Tt)),K!==r&&(xt=L,K=wl()),L=K,L===r&&(L=W,t.substr(W,2)===Bi?(K=Bi,W+=2):(K=r,dt===0&&wt(Ls)),K!==r&&(xt=L,K=Ft()),L=K,L===r&&(L=W,t.substr(W,2)===Bn?(K=Bn,W+=2):(K=r,dt===0&&wt(Lo)),K!==r&&(xt=L,K=ki()),L=K,L===r&&(L=W,t.substr(W,2)===vi?(K=vi,W+=2):(K=r,dt===0&&wt(sa)),K!==r&&(xt=L,K=un()),L=K,L===r&&(L=W,t.substr(W,2)===qn?(K=qn,W+=2):(K=r,dt===0&&wt(Ec)),K!==r&&(xt=L,K=lp()),L=K,L===r&&(L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(oa.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(aa)),re!==r?(xt=L,K=Me(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=Pc()))))))))),L}function Pc(){var L,K,re,ge,Ye,At,hr,Ir,Rn,ai,ns,GA;return L=W,t.charCodeAt(W)===92?(K=Ro,W++):(K=r,dt===0&&wt(To)),K!==r?(re=_o(),re!==r?(xt=L,K=la(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Ze?(K=Ze,W+=2):(K=r,dt===0&&wt(ca)),K!==r?(re=W,ge=W,Ye=_o(),Ye!==r?(At=ds(),At!==r?(Ye=[Ye,At],ge=Ye):(W=ge,ge=r)):(W=ge,ge=r),ge===r&&(ge=_o()),ge!==r?re=t.substring(re,W):re=ge,re!==r?(xt=L,K=la(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===mu?(K=mu,W+=2):(K=r,dt===0&&wt(Bl)),K!==r?(re=W,ge=W,Ye=ds(),Ye!==r?(At=ds(),At!==r?(hr=ds(),hr!==r?(Ir=ds(),Ir!==r?(Ye=[Ye,At,hr,Ir],ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r),ge!==r?re=t.substring(re,W):re=ge,re!==r?(xt=L,K=la(re),L=K):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===dn?(K=dn,W+=2):(K=r,dt===0&&wt(No)),K!==r?(re=W,ge=W,Ye=ds(),Ye!==r?(At=ds(),At!==r?(hr=ds(),hr!==r?(Ir=ds(),Ir!==r?(Rn=ds(),Rn!==r?(ai=ds(),ai!==r?(ns=ds(),ns!==r?(GA=ds(),GA!==r?(Ye=[Ye,At,hr,Ir,Rn,ai,ns,GA],ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r)):(W=ge,ge=r),ge!==r?re=t.substring(re,W):re=ge,re!==r?(xt=L,K=RA(re),L=K):(W=L,L=r)):(W=L,L=r)))),L}function _o(){var L;return TA.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(Oo)),L}function ds(){var L;return qa.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(Ot)),L}function dp(){var L,K,re,ge,Ye;if(L=W,K=[],re=W,t.charCodeAt(W)===92?(ge=Ro,W++):(ge=r,dt===0&&wt(To)),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r),re===r&&(re=W,t.substr(W,2)===Mo?(ge=Mo,W+=2):(ge=r,dt===0&&wt(ua)),ge!==r&&(xt=re,ge=qi()),re=ge,re===r&&(re=W,ge=W,dt++,Ye=Qd(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r))),re!==r)for(;re!==r;)K.push(re),re=W,t.charCodeAt(W)===92?(ge=Ro,W++):(ge=r,dt===0&&wt(To)),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r),re===r&&(re=W,t.substr(W,2)===Mo?(ge=Mo,W+=2):(ge=r,dt===0&&wt(ua)),ge!==r&&(xt=re,ge=qi()),re=ge,re===r&&(re=W,ge=W,dt++,Ye=Qd(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r)));else K=r;return K!==r&&(xt=L,K=Ts(K)),L=K,L}function qA(){var L,K,re,ge,Ye,At;if(L=W,t.charCodeAt(W)===45?(K=vl,W++):(K=r,dt===0&&wt(Cc)),K===r&&(t.charCodeAt(W)===43?(K=Dl,W++):(K=r,dt===0&&wt(Aa))),K===r&&(K=null),K!==r){if(re=[],tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He)),ge!==r)for(;ge!==r;)re.push(ge),tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He));else re=r;if(re!==r)if(t.charCodeAt(W)===46?(ge=Di,W++):(ge=r,dt===0&&wt(rs)),ge!==r){if(Ye=[],tt.test(t.charAt(W))?(At=t.charAt(W),W++):(At=r,dt===0&&wt(He)),At!==r)for(;At!==r;)Ye.push(At),tt.test(t.charAt(W))?(At=t.charAt(W),W++):(At=r,dt===0&&wt(He));else Ye=r;Ye!==r?(xt=L,K=ja(K,re,Ye),L=K):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;if(L===r){if(L=W,t.charCodeAt(W)===45?(K=vl,W++):(K=r,dt===0&&wt(Cc)),K===r&&(t.charCodeAt(W)===43?(K=Dl,W++):(K=r,dt===0&&wt(Aa))),K===r&&(K=null),K!==r){if(re=[],tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He)),ge!==r)for(;ge!==r;)re.push(ge),tt.test(t.charAt(W))?(ge=t.charAt(W),W++):(ge=r,dt===0&&wt(He));else re=r;re!==r?(xt=L,K=yu(K,re),L=K):(W=L,L=r)}else W=L,L=r;if(L===r&&(L=W,K=jA(),K!==r&&(xt=L,K=Sl(K)),L=K,L===r&&(L=W,K=xl(),K!==r&&(xt=L,K=pi(K)),L=K,L===r)))if(L=W,t.charCodeAt(W)===40?(K=Ce,W++):(K=r,dt===0&&wt(fe)),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();if(re!==r)if(ge=Ns(),ge!==r){for(Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();Ye!==r?(t.charCodeAt(W)===41?(At=ie,W++):(At=r,dt===0&&wt(Z)),At!==r?(xt=L,K=Dn(ge),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r}return L}function Pu(){var L,K,re,ge,Ye,At,hr,Ir;if(L=W,K=qA(),K!==r){for(re=[],ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===42?(At=Pl,W++):(At=r,dt===0&&wt(Je)),At===r&&(t.charCodeAt(W)===47?(At=st,W++):(At=r,dt===0&&wt(vt))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=qA(),Ir!==r?(xt=ge,Ye=ar(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r;for(;ge!==r;){for(re.push(ge),ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===42?(At=Pl,W++):(At=r,dt===0&&wt(Je)),At===r&&(t.charCodeAt(W)===47?(At=st,W++):(At=r,dt===0&&wt(vt))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=qA(),Ir!==r?(xt=ge,Ye=ar(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r}re!==r?(xt=L,K=ee(K,re),L=K):(W=L,L=r)}else W=L,L=r;return L}function Ns(){var L,K,re,ge,Ye,At,hr,Ir;if(L=W,K=Pu(),K!==r){for(re=[],ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===43?(At=Dl,W++):(At=r,dt===0&&wt(Aa)),At===r&&(t.charCodeAt(W)===45?(At=vl,W++):(At=r,dt===0&&wt(Cc))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=Pu(),Ir!==r?(xt=ge,Ye=ye(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r;for(;ge!==r;){for(re.push(ge),ge=W,Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();if(Ye!==r)if(t.charCodeAt(W)===43?(At=Dl,W++):(At=r,dt===0&&wt(Aa)),At===r&&(t.charCodeAt(W)===45?(At=vl,W++):(At=r,dt===0&&wt(Cc))),At!==r){for(hr=[],Ir=bt();Ir!==r;)hr.push(Ir),Ir=bt();hr!==r?(Ir=Pu(),Ir!==r?(xt=ge,Ye=ye(K,At,Ir),ge=Ye):(W=ge,ge=r)):(W=ge,ge=r)}else W=ge,ge=r;else W=ge,ge=r}re!==r?(xt=L,K=ee(K,re),L=K):(W=L,L=r)}else W=L,L=r;return L}function Vr(){var L,K,re,ge,Ye,At;if(L=W,t.substr(W,3)===Ne?(K=Ne,W+=3):(K=r,dt===0&&wt(gt)),K!==r){for(re=[],ge=bt();ge!==r;)re.push(ge),ge=bt();if(re!==r)if(ge=Ns(),ge!==r){for(Ye=[],At=bt();At!==r;)Ye.push(At),At=bt();Ye!==r?(t.substr(W,2)===mt?(At=mt,W+=2):(At=r,dt===0&&wt(Dt)),At!==r?(xt=L,K=er(ge),L=K):(W=L,L=r)):(W=L,L=r)}else W=L,L=r;else W=L,L=r}else W=L,L=r;return L}function mp(){var L,K,re,ge;return L=W,t.substr(W,2)===sn?(K=sn,W+=2):(K=r,dt===0&&wt(ei)),K!==r?(re=Uo(),re!==r?(t.charCodeAt(W)===41?(ge=ie,W++):(ge=r,dt===0&&wt(Z)),ge!==r?(xt=L,K=Qi(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L}function jA(){var L,K,re,ge,Ye,At;return L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,2)===wd?(ge=wd,W+=2):(ge=r,dt===0&&wt(BI)),ge!==r?(Ye=gs(),Ye!==r?(t.charCodeAt(W)===125?(At=q,W++):(At=r,dt===0&&wt(nt)),At!==r?(xt=L,K=eo(re,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,3)===Bd?(ge=Bd,W+=3):(ge=r,dt===0&&wt(cp)),ge!==r?(xt=L,K=vI(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,2)===to?(ge=to,W+=2):(ge=r,dt===0&&wt(up)),ge!==r?(Ye=gs(),Ye!==r?(t.charCodeAt(W)===125?(At=q,W++):(At=r,dt===0&&wt(nt)),At!==r?(xt=L,K=Ap(re,Ye),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.substr(W,3)===Ic?(ge=Ic,W+=3):(ge=r,dt===0&&wt(fp)),ge!==r?(xt=L,K=s0(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.substr(W,2)===Sn?(K=Sn,W+=2):(K=r,dt===0&&wt(fa)),K!==r?(re=xl(),re!==r?(t.charCodeAt(W)===125?(ge=q,W++):(ge=r,dt===0&&wt(nt)),ge!==r?(xt=L,K=o0(re),L=K):(W=L,L=r)):(W=L,L=r)):(W=L,L=r),L===r&&(L=W,t.charCodeAt(W)===36?(K=a0,W++):(K=r,dt===0&&wt(vd)),K!==r?(re=xl(),re!==r?(xt=L,K=o0(re),L=K):(W=L,L=r)):(W=L,L=r)))))),L}function kd(){var L,K,re;return L=W,K=d0(),K!==r?(xt=W,re=Eu(K),re?re=void 0:re=r,re!==r?(xt=L,K=ro(K),L=K):(W=L,L=r)):(W=L,L=r),L}function d0(){var L,K,re,ge,Ye;if(L=W,K=[],re=W,ge=W,dt++,Ye=Ep(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r),re!==r)for(;re!==r;)K.push(re),re=W,ge=W,dt++,Ye=Ep(),dt--,Ye===r?ge=void 0:(W=ge,ge=r),ge!==r?(t.length>W?(Ye=t.charAt(W),W++):(Ye=r,dt===0&&wt(vn)),Ye!==r?(xt=re,ge=Me(Ye),re=ge):(W=re,re=r)):(W=re,re=r);else K=r;return K!==r&&(xt=L,K=Ts(K)),L=K,L}function yp(){var L,K,re;if(L=W,K=[],Ga.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(pp)),re!==r)for(;re!==r;)K.push(re),Ga.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(pp));else K=r;return K!==r&&(xt=L,K=l0()),L=K,L}function xl(){var L,K,re;if(L=W,K=[],Wa.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(Ya)),re!==r)for(;re!==r;)K.push(re),Wa.test(t.charAt(W))?(re=t.charAt(W),W++):(re=r,dt===0&&wt(Ya));else K=r;return K!==r&&(xt=L,K=l0()),L=K,L}function Qd(){var L;return Dd.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(LA)),L}function Ep(){var L;return Sd.test(t.charAt(W))?(L=t.charAt(W),W++):(L=r,dt===0&&wt(Pd)),L}function bt(){var L,K;if(L=[],NA.test(t.charAt(W))?(K=t.charAt(W),W++):(K=r,dt===0&&wt(OA)),K!==r)for(;K!==r;)L.push(K),NA.test(t.charAt(W))?(K=t.charAt(W),W++):(K=r,dt===0&&wt(OA));else L=r;return L}if(wc=a(),wc!==r&&W===t.length)return wc;throw wc!==r&&W!1}){try{return(0,OY.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function dm(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:o},a)=>`${AS(r)}${o===";"?a!==t.length-1||e?";":"":" &"}`).join(" ")}function AS(t){return`${mm(t.chain)}${t.then?` ${UT(t.then)}`:""}`}function UT(t){return`${t.type} ${AS(t.line)}`}function mm(t){return`${HT(t)}${t.then?` ${_T(t.then)}`:""}`}function _T(t){return`${t.type} ${mm(t.chain)}`}function HT(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>cS(e)).join(" ")} `:""}${t.args.map(e=>qT(e)).join(" ")}`;case"subshell":return`(${dm(t.subshell)})${t.args.length>0?` ${t.args.map(e=>fw(e)).join(" ")}`:""}`;case"group":return`{ ${dm(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>fw(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>cS(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function cS(t){return`${t.name}=${t.args[0]?J0(t.args[0]):""}`}function qT(t){switch(t.type){case"redirection":return fw(t);case"argument":return J0(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function fw(t){return`${t.subtype} ${t.args.map(e=>J0(e)).join(" ")}`}function J0(t){return t.segments.map(e=>jT(e)).join("")}function jT(t){let e=(o,a)=>a?`"${o}"`:o,r=o=>o===""?"''":o.match(/[()}<>$|&;"'\n\t ]/)?o.match(/['\t\p{C}]/u)?o.match(/'/)?`"${o.replace(/["$\t\p{C}]/u,$_e)}"`:`$'${o.replace(/[\t\p{C}]/u,UY)}'`:`'${o}'`:o;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`$(${dm(t.shell)})`,t.quoted);case"variable":return e(typeof t.defaultValue>"u"?typeof t.alternativeValue>"u"?`\${${t.name}}`:t.alternativeValue.length===0?`\${${t.name}:+}`:`\${${t.name}:+${t.alternativeValue.map(o=>J0(o)).join(" ")}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(o=>J0(o)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${fS(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function fS(t){let e=a=>{switch(a){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${a}"`)}},r=(a,n)=>n?`( ${a} )`:a,o=a=>r(fS(a),!["number","variable"].includes(a.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${o(t.left)} ${e(t.type)} ${o(t.right)}`}}var OY,MY,Z_e,UY,$_e,_Y=It(()=>{OY=et(NY());MY=new Map([["\f","\\f"],[` -`,"\\n"],["\r","\\r"],[" ","\\t"],["\v","\\v"],["\0","\\0"]]),Z_e=new Map([["\\","\\\\"],["$","\\$"],['"','\\"'],...Array.from(MY,([t,e])=>[t,`"$'${e}'"`])]),UY=t=>MY.get(t)??`\\x${t.charCodeAt(0).toString(16).padStart(2,"0")}`,$_e=t=>Z_e.get(t)??`"$'${UY(t)}'"`});var qY=_((dxt,HY)=>{"use strict";function e8e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function z0(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,z0)}e8e(z0,Error);z0.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;wce&&(ce=J,ue=[]),ue.push(He))}function nt(He,x){return new z0(He,null,null,x)}function Le(He,x,I){return new z0(z0.buildMessage(He,x),He,x,I)}function Te(){var He,x,I,P;return He=J,x=ke(),x!==r?(t.charCodeAt(J)===47?(I=n,J++):(I=r,Ie===0&&q(u)),I!==r?(P=ke(),P!==r?(te=He,x=A(x,P),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=ke(),x!==r&&(te=He,x=p(x)),He=x),He}function ke(){var He,x,I,P;return He=J,x=Ke(),x!==r?(t.charCodeAt(J)===64?(I=h,J++):(I=r,Ie===0&&q(E)),I!==r?(P=tt(),P!==r?(te=He,x=w(x,P),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=Ke(),x!==r&&(te=He,x=D(x)),He=x),He}function Ke(){var He,x,I,P,y;return He=J,t.charCodeAt(J)===64?(x=h,J++):(x=r,Ie===0&&q(E)),x!==r?(I=xe(),I!==r?(t.charCodeAt(J)===47?(P=n,J++):(P=r,Ie===0&&q(u)),P!==r?(y=xe(),y!==r?(te=He,x=b(),He=x):(J=He,He=r)):(J=He,He=r)):(J=He,He=r)):(J=He,He=r),He===r&&(He=J,x=xe(),x!==r&&(te=He,x=b()),He=x),He}function xe(){var He,x,I;if(He=J,x=[],C.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(T)),I!==r)for(;I!==r;)x.push(I),C.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(T));else x=r;return x!==r&&(te=He,x=b()),He=x,He}function tt(){var He,x,I;if(He=J,x=[],N.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(U)),I!==r)for(;I!==r;)x.push(I),N.test(t.charAt(J))?(I=t.charAt(J),J++):(I=r,Ie===0&&q(U));else x=r;return x!==r&&(te=He,x=b()),He=x,He}if(he=a(),he!==r&&J===t.length)return he;throw he!==r&&J{jY=et(qY())});var Z0=_((yxt,X0)=>{"use strict";function WY(t){return typeof t>"u"||t===null}function r8e(t){return typeof t=="object"&&t!==null}function n8e(t){return Array.isArray(t)?t:WY(t)?[]:[t]}function i8e(t,e){var r,o,a,n;if(e)for(n=Object.keys(e),r=0,o=n.length;r{"use strict";function pw(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}pw.prototype=Object.create(Error.prototype);pw.prototype.constructor=pw;pw.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};YY.exports=pw});var JY=_((Cxt,KY)=>{"use strict";var VY=Z0();function GT(t,e,r,o,a){this.name=t,this.buffer=e,this.position=r,this.line=o,this.column=a}GT.prototype.getSnippet=function(e,r){var o,a,n,u,A;if(!this.buffer)return null;for(e=e||4,r=r||75,o="",a=this.position;a>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(a-1))===-1;)if(a-=1,this.position-a>r/2-1){o=" ... ",a+=5;break}for(n="",u=this.position;ur/2-1){n=" ... ",u-=5;break}return A=this.buffer.slice(a,u),VY.repeat(" ",e)+o+A+n+` -`+VY.repeat(" ",e+this.position-a+o.length)+"^"};GT.prototype.toString=function(e){var r,o="";return this.name&&(o+='in "'+this.name+'" '),o+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(o+=`: -`+r)),o};KY.exports=GT});var as=_((Ixt,XY)=>{"use strict";var zY=ym(),a8e=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],l8e=["scalar","sequence","mapping"];function c8e(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(o){e[String(o)]=r})}),e}function u8e(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(a8e.indexOf(r)===-1)throw new zY('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=c8e(e.styleAliases||null),l8e.indexOf(this.kind)===-1)throw new zY('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}XY.exports=u8e});var $0=_((wxt,$Y)=>{"use strict";var ZY=Z0(),gS=ym(),A8e=as();function WT(t,e,r){var o=[];return t.include.forEach(function(a){r=WT(a,e,r)}),t[e].forEach(function(a){r.forEach(function(n,u){n.tag===a.tag&&n.kind===a.kind&&o.push(u)}),r.push(a)}),r.filter(function(a,n){return o.indexOf(n)===-1})}function f8e(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function o(a){t[a.kind][a.tag]=t.fallback[a.tag]=a}for(e=0,r=arguments.length;e{"use strict";var p8e=as();eV.exports=new p8e("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var nV=_((vxt,rV)=>{"use strict";var h8e=as();rV.exports=new h8e("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var sV=_((Dxt,iV)=>{"use strict";var g8e=as();iV.exports=new g8e("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var dS=_((Sxt,oV)=>{"use strict";var d8e=$0();oV.exports=new d8e({explicit:[tV(),nV(),sV()]})});var lV=_((Pxt,aV)=>{"use strict";var m8e=as();function y8e(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function E8e(){return null}function C8e(t){return t===null}aV.exports=new m8e("tag:yaml.org,2002:null",{kind:"scalar",resolve:y8e,construct:E8e,predicate:C8e,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var uV=_((xxt,cV)=>{"use strict";var I8e=as();function w8e(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function B8e(t){return t==="true"||t==="True"||t==="TRUE"}function v8e(t){return Object.prototype.toString.call(t)==="[object Boolean]"}cV.exports=new I8e("tag:yaml.org,2002:bool",{kind:"scalar",resolve:w8e,construct:B8e,predicate:v8e,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var fV=_((bxt,AV)=>{"use strict";var D8e=Z0(),S8e=as();function P8e(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function x8e(t){return 48<=t&&t<=55}function b8e(t){return 48<=t&&t<=57}function k8e(t){if(t===null)return!1;var e=t.length,r=0,o=!1,a;if(!e)return!1;if(a=t[r],(a==="-"||a==="+")&&(a=t[++r]),a==="0"){if(r+1===e)return!0;if(a=t[++r],a==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var gV=_((kxt,hV)=>{"use strict";var pV=Z0(),R8e=as(),T8e=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function L8e(t){return!(t===null||!T8e.test(t)||t[t.length-1]==="_")}function N8e(t){var e,r,o,a;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,a=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(n){a.unshift(parseFloat(n,10))}),e=0,o=1,a.forEach(function(n){e+=n*o,o*=60}),r*e):r*parseFloat(e,10)}var O8e=/^[-+]?[0-9]+e/;function M8e(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(pV.isNegativeZero(t))return"-0.0";return r=t.toString(10),O8e.test(r)?r.replace("e",".e"):r}function U8e(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!==0||pV.isNegativeZero(t))}hV.exports=new R8e("tag:yaml.org,2002:float",{kind:"scalar",resolve:L8e,construct:N8e,predicate:U8e,represent:M8e,defaultStyle:"lowercase"})});var YT=_((Qxt,dV)=>{"use strict";var _8e=$0();dV.exports=new _8e({include:[dS()],implicit:[lV(),uV(),fV(),gV()]})});var VT=_((Fxt,mV)=>{"use strict";var H8e=$0();mV.exports=new H8e({include:[YT()]})});var IV=_((Rxt,CV)=>{"use strict";var q8e=as(),yV=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),EV=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function j8e(t){return t===null?!1:yV.exec(t)!==null||EV.exec(t)!==null}function G8e(t){var e,r,o,a,n,u,A,p=0,h=null,E,w,D;if(e=yV.exec(t),e===null&&(e=EV.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],o=+e[2]-1,a=+e[3],!e[4])return new Date(Date.UTC(r,o,a));if(n=+e[4],u=+e[5],A=+e[6],e[7]){for(p=e[7].slice(0,3);p.length<3;)p+="0";p=+p}return e[9]&&(E=+e[10],w=+(e[11]||0),h=(E*60+w)*6e4,e[9]==="-"&&(h=-h)),D=new Date(Date.UTC(r,o,a,n,u,A,p)),h&&D.setTime(D.getTime()-h),D}function W8e(t){return t.toISOString()}CV.exports=new q8e("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:j8e,construct:G8e,instanceOf:Date,represent:W8e})});var BV=_((Txt,wV)=>{"use strict";var Y8e=as();function V8e(t){return t==="<<"||t===null}wV.exports=new Y8e("tag:yaml.org,2002:merge",{kind:"scalar",resolve:V8e})});var SV=_((Lxt,DV)=>{"use strict";var eg;try{vV=ve,eg=vV("buffer").Buffer}catch{}var vV,K8e=as(),KT=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function J8e(t){if(t===null)return!1;var e,r,o=0,a=t.length,n=KT;for(r=0;r64)){if(e<0)return!1;o+=6}return o%8===0}function z8e(t){var e,r,o=t.replace(/[\r\n=]/g,""),a=o.length,n=KT,u=0,A=[];for(e=0;e>16&255),A.push(u>>8&255),A.push(u&255)),u=u<<6|n.indexOf(o.charAt(e));return r=a%4*6,r===0?(A.push(u>>16&255),A.push(u>>8&255),A.push(u&255)):r===18?(A.push(u>>10&255),A.push(u>>2&255)):r===12&&A.push(u>>4&255),eg?eg.from?eg.from(A):new eg(A):A}function X8e(t){var e="",r=0,o,a,n=t.length,u=KT;for(o=0;o>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]),r=(r<<8)+t[o];return a=n%3,a===0?(e+=u[r>>18&63],e+=u[r>>12&63],e+=u[r>>6&63],e+=u[r&63]):a===2?(e+=u[r>>10&63],e+=u[r>>4&63],e+=u[r<<2&63],e+=u[64]):a===1&&(e+=u[r>>2&63],e+=u[r<<4&63],e+=u[64],e+=u[64]),e}function Z8e(t){return eg&&eg.isBuffer(t)}DV.exports=new K8e("tag:yaml.org,2002:binary",{kind:"scalar",resolve:J8e,construct:z8e,predicate:Z8e,represent:X8e})});var xV=_((Oxt,PV)=>{"use strict";var $8e=as(),eHe=Object.prototype.hasOwnProperty,tHe=Object.prototype.toString;function rHe(t){if(t===null)return!0;var e=[],r,o,a,n,u,A=t;for(r=0,o=A.length;r{"use strict";var iHe=as(),sHe=Object.prototype.toString;function oHe(t){if(t===null)return!0;var e,r,o,a,n,u=t;for(n=new Array(u.length),e=0,r=u.length;e{"use strict";var lHe=as(),cHe=Object.prototype.hasOwnProperty;function uHe(t){if(t===null)return!0;var e,r=t;for(e in r)if(cHe.call(r,e)&&r[e]!==null)return!1;return!0}function AHe(t){return t!==null?t:{}}QV.exports=new lHe("tag:yaml.org,2002:set",{kind:"mapping",resolve:uHe,construct:AHe})});var Cm=_((_xt,RV)=>{"use strict";var fHe=$0();RV.exports=new fHe({include:[VT()],implicit:[IV(),BV()],explicit:[SV(),xV(),kV(),FV()]})});var LV=_((Hxt,TV)=>{"use strict";var pHe=as();function hHe(){return!0}function gHe(){}function dHe(){return""}function mHe(t){return typeof t>"u"}TV.exports=new pHe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:hHe,construct:gHe,predicate:mHe,represent:dHe})});var OV=_((qxt,NV)=>{"use strict";var yHe=as();function EHe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),o="";return!(e[0]==="/"&&(r&&(o=r[1]),o.length>3||e[e.length-o.length-1]!=="/"))}function CHe(t){var e=t,r=/\/([gim]*)$/.exec(t),o="";return e[0]==="/"&&(r&&(o=r[1]),e=e.slice(1,e.length-o.length-1)),new RegExp(e,o)}function IHe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function wHe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}NV.exports=new yHe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:EHe,construct:CHe,predicate:wHe,represent:IHe})});var _V=_((jxt,UV)=>{"use strict";var mS;try{MV=ve,mS=MV("esprima")}catch{typeof window<"u"&&(mS=window.esprima)}var MV,BHe=as();function vHe(t){if(t===null)return!1;try{var e="("+t+")",r=mS.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch{return!1}}function DHe(t){var e="("+t+")",r=mS.parse(e,{range:!0}),o=[],a;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(n){o.push(n.name)}),a=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(o,e.slice(a[0]+1,a[1]-1)):new Function(o,"return "+e.slice(a[0],a[1]))}function SHe(t){return t.toString()}function PHe(t){return Object.prototype.toString.call(t)==="[object Function]"}UV.exports=new BHe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:vHe,construct:DHe,predicate:PHe,represent:SHe})});var hw=_((Wxt,qV)=>{"use strict";var HV=$0();qV.exports=HV.DEFAULT=new HV({include:[Cm()],explicit:[LV(),OV(),_V()]})});var aK=_((Yxt,gw)=>{"use strict";var mf=Z0(),JV=ym(),xHe=JY(),zV=Cm(),bHe=hw(),Kp=Object.prototype.hasOwnProperty,yS=1,XV=2,ZV=3,ES=4,JT=1,kHe=2,jV=3,QHe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,FHe=/[\x85\u2028\u2029]/,RHe=/[,\[\]\{\}]/,$V=/^(?:!|!!|![a-z\-]+!)$/i,eK=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function GV(t){return Object.prototype.toString.call(t)}function Wu(t){return t===10||t===13}function rg(t){return t===9||t===32}function Da(t){return t===9||t===32||t===10||t===13}function Im(t){return t===44||t===91||t===93||t===123||t===125}function THe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function LHe(t){return t===120?2:t===117?4:t===85?8:0}function NHe(t){return 48<=t&&t<=57?t-48:-1}function WV(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` -`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"\x1B":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function OHe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var tK=new Array(256),rK=new Array(256);for(tg=0;tg<256;tg++)tK[tg]=WV(tg)?1:0,rK[tg]=WV(tg);var tg;function MHe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||bHe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function nK(t,e){return new JV(e,new xHe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function Qr(t,e){throw nK(t,e)}function CS(t,e){t.onWarning&&t.onWarning.call(null,nK(t,e))}var YV={YAML:function(e,r,o){var a,n,u;e.version!==null&&Qr(e,"duplication of %YAML directive"),o.length!==1&&Qr(e,"YAML directive accepts exactly one argument"),a=/^([0-9]+)\.([0-9]+)$/.exec(o[0]),a===null&&Qr(e,"ill-formed argument of the YAML directive"),n=parseInt(a[1],10),u=parseInt(a[2],10),n!==1&&Qr(e,"unacceptable YAML version of the document"),e.version=o[0],e.checkLineBreaks=u<2,u!==1&&u!==2&&CS(e,"unsupported YAML version of the document")},TAG:function(e,r,o){var a,n;o.length!==2&&Qr(e,"TAG directive accepts exactly two arguments"),a=o[0],n=o[1],$V.test(a)||Qr(e,"ill-formed tag handle (first argument) of the TAG directive"),Kp.call(e.tagMap,a)&&Qr(e,'there is a previously declared suffix for "'+a+'" tag handle'),eK.test(n)||Qr(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[a]=n}};function Vp(t,e,r,o){var a,n,u,A;if(e1&&(t.result+=mf.repeat(` -`,e-1))}function UHe(t,e,r){var o,a,n,u,A,p,h,E,w=t.kind,D=t.result,b;if(b=t.input.charCodeAt(t.position),Da(b)||Im(b)||b===35||b===38||b===42||b===33||b===124||b===62||b===39||b===34||b===37||b===64||b===96||(b===63||b===45)&&(a=t.input.charCodeAt(t.position+1),Da(a)||r&&Im(a)))return!1;for(t.kind="scalar",t.result="",n=u=t.position,A=!1;b!==0;){if(b===58){if(a=t.input.charCodeAt(t.position+1),Da(a)||r&&Im(a))break}else if(b===35){if(o=t.input.charCodeAt(t.position-1),Da(o))break}else{if(t.position===t.lineStart&&IS(t)||r&&Im(b))break;if(Wu(b))if(p=t.line,h=t.lineStart,E=t.lineIndent,Yi(t,!1,-1),t.lineIndent>=e){A=!0,b=t.input.charCodeAt(t.position);continue}else{t.position=u,t.line=p,t.lineStart=h,t.lineIndent=E;break}}A&&(Vp(t,n,u,!1),XT(t,t.line-p),n=u=t.position,A=!1),rg(b)||(u=t.position+1),b=t.input.charCodeAt(++t.position)}return Vp(t,n,u,!1),t.result?!0:(t.kind=w,t.result=D,!1)}function _He(t,e){var r,o,a;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,o=a=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Vp(t,o,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)o=t.position,t.position++,a=t.position;else return!0;else Wu(r)?(Vp(t,o,a,!0),XT(t,Yi(t,!1,e)),o=a=t.position):t.position===t.lineStart&&IS(t)?Qr(t,"unexpected end of the document within a single quoted scalar"):(t.position++,a=t.position);Qr(t,"unexpected end of the stream within a single quoted scalar")}function HHe(t,e){var r,o,a,n,u,A;if(A=t.input.charCodeAt(t.position),A!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=o=t.position;(A=t.input.charCodeAt(t.position))!==0;){if(A===34)return Vp(t,r,t.position,!0),t.position++,!0;if(A===92){if(Vp(t,r,t.position,!0),A=t.input.charCodeAt(++t.position),Wu(A))Yi(t,!1,e);else if(A<256&&tK[A])t.result+=rK[A],t.position++;else if((u=LHe(A))>0){for(a=u,n=0;a>0;a--)A=t.input.charCodeAt(++t.position),(u=THe(A))>=0?n=(n<<4)+u:Qr(t,"expected hexadecimal character");t.result+=OHe(n),t.position++}else Qr(t,"unknown escape sequence");r=o=t.position}else Wu(A)?(Vp(t,r,o,!0),XT(t,Yi(t,!1,e)),r=o=t.position):t.position===t.lineStart&&IS(t)?Qr(t,"unexpected end of the document within a double quoted scalar"):(t.position++,o=t.position)}Qr(t,"unexpected end of the stream within a double quoted scalar")}function qHe(t,e){var r=!0,o,a=t.tag,n,u=t.anchor,A,p,h,E,w,D={},b,C,T,N;if(N=t.input.charCodeAt(t.position),N===91)p=93,w=!1,n=[];else if(N===123)p=125,w=!0,n={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=n),N=t.input.charCodeAt(++t.position);N!==0;){if(Yi(t,!0,e),N=t.input.charCodeAt(t.position),N===p)return t.position++,t.tag=a,t.anchor=u,t.kind=w?"mapping":"sequence",t.result=n,!0;r||Qr(t,"missed comma between flow collection entries"),C=b=T=null,h=E=!1,N===63&&(A=t.input.charCodeAt(t.position+1),Da(A)&&(h=E=!0,t.position++,Yi(t,!0,e))),o=t.line,Bm(t,e,yS,!1,!0),C=t.tag,b=t.result,Yi(t,!0,e),N=t.input.charCodeAt(t.position),(E||t.line===o)&&N===58&&(h=!0,N=t.input.charCodeAt(++t.position),Yi(t,!0,e),Bm(t,e,yS,!1,!0),T=t.result),w?wm(t,n,D,C,b,T):h?n.push(wm(t,null,D,C,b,T)):n.push(b),Yi(t,!0,e),N=t.input.charCodeAt(t.position),N===44?(r=!0,N=t.input.charCodeAt(++t.position)):r=!1}Qr(t,"unexpected end of the stream within a flow collection")}function jHe(t,e){var r,o,a=JT,n=!1,u=!1,A=e,p=0,h=!1,E,w;if(w=t.input.charCodeAt(t.position),w===124)o=!1;else if(w===62)o=!0;else return!1;for(t.kind="scalar",t.result="";w!==0;)if(w=t.input.charCodeAt(++t.position),w===43||w===45)JT===a?a=w===43?jV:kHe:Qr(t,"repeat of a chomping mode identifier");else if((E=NHe(w))>=0)E===0?Qr(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):u?Qr(t,"repeat of an indentation width identifier"):(A=e+E-1,u=!0);else break;if(rg(w)){do w=t.input.charCodeAt(++t.position);while(rg(w));if(w===35)do w=t.input.charCodeAt(++t.position);while(!Wu(w)&&w!==0)}for(;w!==0;){for(zT(t),t.lineIndent=0,w=t.input.charCodeAt(t.position);(!u||t.lineIndentA&&(A=t.lineIndent),Wu(w)){p++;continue}if(t.lineIndente)&&p!==0)Qr(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(Bm(t,e,ES,!0,a)&&(C?D=t.result:b=t.result),C||(wm(t,h,E,w,D,b,n,u),w=D=b=null),Yi(t,!0,-1),N=t.input.charCodeAt(t.position)),t.lineIndent>e&&N!==0)Qr(t,"bad indentation of a mapping entry");else if(t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndente?p=1:t.lineIndent===e?p=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),w=0,D=t.implicitTypes.length;w tag; it should be "'+b.kind+'", not "'+t.kind+'"'),b.resolve(t.result)?(t.result=b.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):Qr(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):Qr(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||E}function KHe(t){var e=t.position,r,o,a,n=!1,u;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(u=t.input.charCodeAt(t.position))!==0&&(Yi(t,!0,-1),u=t.input.charCodeAt(t.position),!(t.lineIndent>0||u!==37));){for(n=!0,u=t.input.charCodeAt(++t.position),r=t.position;u!==0&&!Da(u);)u=t.input.charCodeAt(++t.position);for(o=t.input.slice(r,t.position),a=[],o.length<1&&Qr(t,"directive name must not be less than one character in length");u!==0;){for(;rg(u);)u=t.input.charCodeAt(++t.position);if(u===35){do u=t.input.charCodeAt(++t.position);while(u!==0&&!Wu(u));break}if(Wu(u))break;for(r=t.position;u!==0&&!Da(u);)u=t.input.charCodeAt(++t.position);a.push(t.input.slice(r,t.position))}u!==0&&zT(t),Kp.call(YV,o)?YV[o](t,o,a):CS(t,'unknown document directive "'+o+'"')}if(Yi(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,Yi(t,!0,-1)):n&&Qr(t,"directives end mark is expected"),Bm(t,t.lineIndent-1,ES,!1,!0),Yi(t,!0,-1),t.checkLineBreaks&&FHe.test(t.input.slice(e,t.position))&&CS(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&IS(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,Yi(t,!0,-1));return}if(t.position"u"&&(r=e,e=null);var o=iK(t,r);if(typeof e!="function")return o;for(var a=0,n=o.length;a"u"&&(r=e,e=null),sK(t,e,mf.extend({schema:zV},r))}function zHe(t,e){return oK(t,mf.extend({schema:zV},e))}gw.exports.loadAll=sK;gw.exports.load=oK;gw.exports.safeLoadAll=JHe;gw.exports.safeLoad=zHe});var kK=_((Vxt,tL)=>{"use strict";var mw=Z0(),yw=ym(),XHe=hw(),ZHe=Cm(),gK=Object.prototype.toString,dK=Object.prototype.hasOwnProperty,$He=9,dw=10,e6e=13,t6e=32,r6e=33,n6e=34,mK=35,i6e=37,s6e=38,o6e=39,a6e=42,yK=44,l6e=45,EK=58,c6e=61,u6e=62,A6e=63,f6e=64,CK=91,IK=93,p6e=96,wK=123,h6e=124,BK=125,mo={};mo[0]="\\0";mo[7]="\\a";mo[8]="\\b";mo[9]="\\t";mo[10]="\\n";mo[11]="\\v";mo[12]="\\f";mo[13]="\\r";mo[27]="\\e";mo[34]='\\"';mo[92]="\\\\";mo[133]="\\N";mo[160]="\\_";mo[8232]="\\L";mo[8233]="\\P";var g6e=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function d6e(t,e){var r,o,a,n,u,A,p;if(e===null)return{};for(r={},o=Object.keys(e),a=0,n=o.length;a0?t.charCodeAt(n-1):null,D=D&&uK(u,A)}else{for(n=0;no&&t[w+1]!==" ",w=n);else if(!vm(u))return wS;A=n>0?t.charCodeAt(n-1):null,D=D&&uK(u,A)}h=h||E&&n-w-1>o&&t[w+1]!==" "}return!p&&!h?D&&!a(t)?DK:SK:r>9&&vK(t)?wS:h?xK:PK}function w6e(t,e,r,o){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&g6e.indexOf(e)!==-1)return"'"+e+"'";var a=t.indent*Math.max(1,r),n=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-a),u=o||t.flowLevel>-1&&r>=t.flowLevel;function A(p){return y6e(t,p)}switch(I6e(e,u,t.indent,n,A)){case DK:return e;case SK:return"'"+e.replace(/'/g,"''")+"'";case PK:return"|"+AK(e,t.indent)+fK(cK(e,a));case xK:return">"+AK(e,t.indent)+fK(cK(B6e(e,n),a));case wS:return'"'+v6e(e,n)+'"';default:throw new yw("impossible error: invalid scalar style")}}()}function AK(t,e){var r=vK(t)?String(e):"",o=t[t.length-1]===` -`,a=o&&(t[t.length-2]===` -`||t===` -`),n=a?"+":o?"":"-";return r+n+` -`}function fK(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function B6e(t,e){for(var r=/(\n+)([^\n]*)/g,o=function(){var h=t.indexOf(` -`);return h=h!==-1?h:t.length,r.lastIndex=h,pK(t.slice(0,h),e)}(),a=t[0]===` -`||t[0]===" ",n,u;u=r.exec(t);){var A=u[1],p=u[2];n=p[0]===" ",o+=A+(!a&&!n&&p!==""?` -`:"")+pK(p,e),a=n}return o}function pK(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,o,a=0,n,u=0,A=0,p="";o=r.exec(t);)A=o.index,A-a>e&&(n=u>a?u:A,p+=` -`+t.slice(a,n),a=n+1),u=A;return p+=` -`,t.length-a>e&&u>a?p+=t.slice(a,u)+` -`+t.slice(u+1):p+=t.slice(a),p.slice(1)}function v6e(t){for(var e="",r,o,a,n=0;n=55296&&r<=56319&&(o=t.charCodeAt(n+1),o>=56320&&o<=57343)){e+=lK((r-55296)*1024+o-56320+65536),n++;continue}a=mo[r],e+=!a&&vm(r)?t[n]:a||lK(r)}return e}function D6e(t,e,r){var o="",a=t.tag,n,u;for(n=0,u=r.length;n1024&&(E+="? "),E+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),ng(t,e,h,!1,!1)&&(E+=t.dump,o+=E));t.tag=a,t.dump="{"+o+"}"}function x6e(t,e,r,o){var a="",n=t.tag,u=Object.keys(r),A,p,h,E,w,D;if(t.sortKeys===!0)u.sort();else if(typeof t.sortKeys=="function")u.sort(t.sortKeys);else if(t.sortKeys)throw new yw("sortKeys must be a boolean or a function");for(A=0,p=u.length;A1024,w&&(t.dump&&dw===t.dump.charCodeAt(0)?D+="?":D+="? "),D+=t.dump,w&&(D+=ZT(t,e)),ng(t,e+1,E,!0,w)&&(t.dump&&dw===t.dump.charCodeAt(0)?D+=":":D+=": ",D+=t.dump,a+=D));t.tag=n,t.dump=a||"{}"}function hK(t,e,r){var o,a,n,u,A,p;for(a=r?t.explicitTypes:t.implicitTypes,n=0,u=a.length;n tag resolver accepts not "'+p+'" style');t.dump=o}return!0}return!1}function ng(t,e,r,o,a,n){t.tag=null,t.dump=r,hK(t,r,!1)||hK(t,r,!0);var u=gK.call(t.dump);o&&(o=t.flowLevel<0||t.flowLevel>e);var A=u==="[object Object]"||u==="[object Array]",p,h;if(A&&(p=t.duplicates.indexOf(r),h=p!==-1),(t.tag!==null&&t.tag!=="?"||h||t.indent!==2&&e>0)&&(a=!1),h&&t.usedDuplicates[p])t.dump="*ref_"+p;else{if(A&&h&&!t.usedDuplicates[p]&&(t.usedDuplicates[p]=!0),u==="[object Object]")o&&Object.keys(t.dump).length!==0?(x6e(t,e,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(P6e(t,e,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump));else if(u==="[object Array]"){var E=t.noArrayIndent&&e>0?e-1:e;o&&t.dump.length!==0?(S6e(t,E,t.dump,a),h&&(t.dump="&ref_"+p+t.dump)):(D6e(t,E,t.dump),h&&(t.dump="&ref_"+p+" "+t.dump))}else if(u==="[object String]")t.tag!=="?"&&w6e(t,t.dump,e,n);else{if(t.skipInvalid)return!1;throw new yw("unacceptable kind of an object to dump "+u)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function b6e(t,e){var r=[],o=[],a,n;for($T(t,r,o),a=0,n=o.length;a{"use strict";var BS=aK(),QK=kK();function vS(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Fi.exports.Type=as();Fi.exports.Schema=$0();Fi.exports.FAILSAFE_SCHEMA=dS();Fi.exports.JSON_SCHEMA=YT();Fi.exports.CORE_SCHEMA=VT();Fi.exports.DEFAULT_SAFE_SCHEMA=Cm();Fi.exports.DEFAULT_FULL_SCHEMA=hw();Fi.exports.load=BS.load;Fi.exports.loadAll=BS.loadAll;Fi.exports.safeLoad=BS.safeLoad;Fi.exports.safeLoadAll=BS.safeLoadAll;Fi.exports.dump=QK.dump;Fi.exports.safeDump=QK.safeDump;Fi.exports.YAMLException=ym();Fi.exports.MINIMAL_SCHEMA=dS();Fi.exports.SAFE_SCHEMA=Cm();Fi.exports.DEFAULT_SCHEMA=hw();Fi.exports.scan=vS("scan");Fi.exports.parse=vS("parse");Fi.exports.compose=vS("compose");Fi.exports.addConstructor=vS("addConstructor")});var TK=_((Jxt,RK)=>{"use strict";var Q6e=FK();RK.exports=Q6e});var NK=_((zxt,LK)=>{"use strict";function F6e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function ig(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,ig)}F6e(ig,Error);ig.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;w({[gt]:Ne})))},ce=function(ee){return ee},ue=function(ee){return ee},Ie=oa("correct indentation"),he=" ",De=un(" ",!1),Ee=function(ee){return ee.length===ar*vt},g=function(ee){return ee.length===(ar+1)*vt},me=function(){return ar++,!0},Ce=function(){return ar--,!0},fe=function(){return Lo()},ie=oa("pseudostring"),Z=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,Se=qn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),Re=/^[^\r\n\t ,\][{}:#"']/,ht=qn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),q=function(){return Lo().replace(/^ *| *$/g,"")},nt="--",Le=un("--",!1),Te=/^[a-zA-Z\/0-9]/,ke=qn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ke=/^[^\r\n\t :,]/,xe=qn(["\r",` -`," "," ",":",","],!0,!1),tt="null",He=un("null",!1),x=function(){return null},I="true",P=un("true",!1),y=function(){return!0},R="false",z=un("false",!1),X=function(){return!1},$=oa("string"),se='"',be=un('"',!1),Fe=function(){return""},lt=function(ee){return ee},Et=function(ee){return ee.join("")},qt=/^[^"\\\0-\x1F\x7F]/,nr=qn(['"',"\\",["\0",""],"\x7F"],!0,!1),Pt='\\"',cn=un('\\"',!1),Sr=function(){return'"'},yr="\\\\",Rr=un("\\\\",!1),Xr=function(){return"\\"},$n="\\/",Xs=un("\\/",!1),Hi=function(){return"/"},Qs="\\b",Zs=un("\\b",!1),bi=function(){return"\b"},Fs="\\f",$s=un("\\f",!1),PA=function(){return"\f"},gu="\\n",op=un("\\n",!1),ap=function(){return` -`},Rs="\\r",Nn=un("\\r",!1),hs=function(){return"\r"},Ts="\\t",pc=un("\\t",!1),hc=function(){return" "},gc="\\u",xA=un("\\u",!1),bA=function(ee,ye,Ne,gt){return String.fromCharCode(parseInt(`0x${ee}${ye}${Ne}${gt}`))},Ro=/^[0-9a-fA-F]/,To=qn([["0","9"],["a","f"],["A","F"]],!1,!1),kA=oa("blank space"),pr=/^[ \t]/,Me=qn([" "," "],!1,!1),ia=oa("white space"),dc=/^[ \t\n\r]/,Er=qn([" "," ",` -`,"\r"],!1,!1),du=`\r -`,QA=un(`\r -`,!1),FA=` -`,mc=un(` -`,!1),yc="\r",Il=un("\r",!1),we=0,Tt=0,wl=[{line:1,column:1}],Bi=0,Ls=[],Ft=0,Bn;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function Lo(){return t.substring(Tt,we)}function ki(){return la(Tt,we)}function vi(ee,ye){throw ye=ye!==void 0?ye:la(Tt,we),mu([oa(ee)],t.substring(Tt,we),ye)}function sa(ee,ye){throw ye=ye!==void 0?ye:la(Tt,we),ca(ee,ye)}function un(ee,ye){return{type:"literal",text:ee,ignoreCase:ye}}function qn(ee,ye,Ne){return{type:"class",parts:ee,inverted:ye,ignoreCase:Ne}}function Ec(){return{type:"any"}}function lp(){return{type:"end"}}function oa(ee){return{type:"other",description:ee}}function aa(ee){var ye=wl[ee],Ne;if(ye)return ye;for(Ne=ee-1;!wl[Ne];)Ne--;for(ye=wl[Ne],ye={line:ye.line,column:ye.column};NeBi&&(Bi=we,Ls=[]),Ls.push(ee))}function ca(ee,ye){return new ig(ee,null,null,ye)}function mu(ee,ye,Ne){return new ig(ig.buildMessage(ee,ye),ee,ye,Ne)}function Bl(){var ee;return ee=RA(),ee}function dn(){var ee,ye,Ne;for(ee=we,ye=[],Ne=No();Ne!==r;)ye.push(Ne),Ne=No();return ye!==r&&(Tt=ee,ye=n(ye)),ee=ye,ee}function No(){var ee,ye,Ne,gt,mt;return ee=we,ye=qa(),ye!==r?(t.charCodeAt(we)===45?(Ne=u,we++):(Ne=r,Ft===0&&Ze(A)),Ne!==r?(gt=Dn(),gt!==r?(mt=Oo(),mt!==r?(Tt=ee,ye=p(mt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee}function RA(){var ee,ye,Ne;for(ee=we,ye=[],Ne=TA();Ne!==r;)ye.push(Ne),Ne=TA();return ye!==r&&(Tt=ee,ye=h(ye)),ee=ye,ee}function TA(){var ee,ye,Ne,gt,mt,Dt,er,sn,ei;if(ee=we,ye=Dn(),ye===r&&(ye=null),ye!==r){if(Ne=we,t.charCodeAt(we)===35?(gt=E,we++):(gt=r,Ft===0&&Ze(w)),gt!==r){if(mt=[],Dt=we,er=we,Ft++,sn=st(),Ft--,sn===r?er=void 0:(we=er,er=r),er!==r?(t.length>we?(sn=t.charAt(we),we++):(sn=r,Ft===0&&Ze(D)),sn!==r?(er=[er,sn],Dt=er):(we=Dt,Dt=r)):(we=Dt,Dt=r),Dt!==r)for(;Dt!==r;)mt.push(Dt),Dt=we,er=we,Ft++,sn=st(),Ft--,sn===r?er=void 0:(we=er,er=r),er!==r?(t.length>we?(sn=t.charAt(we),we++):(sn=r,Ft===0&&Ze(D)),sn!==r?(er=[er,sn],Dt=er):(we=Dt,Dt=r)):(we=Dt,Dt=r);else mt=r;mt!==r?(gt=[gt,mt],Ne=gt):(we=Ne,Ne=r)}else we=Ne,Ne=r;if(Ne===r&&(Ne=null),Ne!==r){if(gt=[],mt=Je(),mt!==r)for(;mt!==r;)gt.push(mt),mt=Je();else gt=r;gt!==r?(Tt=ee,ye=b(),ee=ye):(we=ee,ee=r)}else we=ee,ee=r}else we=ee,ee=r;if(ee===r&&(ee=we,ye=qa(),ye!==r?(Ne=ua(),Ne!==r?(gt=Dn(),gt===r&&(gt=null),gt!==r?(t.charCodeAt(we)===58?(mt=C,we++):(mt=r,Ft===0&&Ze(T)),mt!==r?(Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(er=Oo(),er!==r?(Tt=ee,ye=N(Ne,er),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r&&(ee=we,ye=qa(),ye!==r?(Ne=qi(),Ne!==r?(gt=Dn(),gt===r&&(gt=null),gt!==r?(t.charCodeAt(we)===58?(mt=C,we++):(mt=r,Ft===0&&Ze(T)),mt!==r?(Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(er=Oo(),er!==r?(Tt=ee,ye=N(Ne,er),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r))){if(ee=we,ye=qa(),ye!==r)if(Ne=qi(),Ne!==r)if(gt=Dn(),gt!==r)if(mt=Cc(),mt!==r){if(Dt=[],er=Je(),er!==r)for(;er!==r;)Dt.push(er),er=Je();else Dt=r;Dt!==r?(Tt=ee,ye=N(Ne,mt),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;else we=ee,ee=r;else we=ee,ee=r;else we=ee,ee=r;if(ee===r)if(ee=we,ye=qa(),ye!==r)if(Ne=qi(),Ne!==r){if(gt=[],mt=we,Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(t.charCodeAt(we)===44?(er=U,we++):(er=r,Ft===0&&Ze(J)),er!==r?(sn=Dn(),sn===r&&(sn=null),sn!==r?(ei=qi(),ei!==r?(Tt=mt,Dt=te(Ne,ei),mt=Dt):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r),mt!==r)for(;mt!==r;)gt.push(mt),mt=we,Dt=Dn(),Dt===r&&(Dt=null),Dt!==r?(t.charCodeAt(we)===44?(er=U,we++):(er=r,Ft===0&&Ze(J)),er!==r?(sn=Dn(),sn===r&&(sn=null),sn!==r?(ei=qi(),ei!==r?(Tt=mt,Dt=te(Ne,ei),mt=Dt):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r)):(we=mt,mt=r);else gt=r;gt!==r?(mt=Dn(),mt===r&&(mt=null),mt!==r?(t.charCodeAt(we)===58?(Dt=C,we++):(Dt=r,Ft===0&&Ze(T)),Dt!==r?(er=Dn(),er===r&&(er=null),er!==r?(sn=Oo(),sn!==r?(Tt=ee,ye=le(Ne,gt,sn),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)}else we=ee,ee=r;else we=ee,ee=r}return ee}function Oo(){var ee,ye,Ne,gt,mt,Dt,er;if(ee=we,ye=we,Ft++,Ne=we,gt=st(),gt!==r?(mt=Ot(),mt!==r?(t.charCodeAt(we)===45?(Dt=u,we++):(Dt=r,Ft===0&&Ze(A)),Dt!==r?(er=Dn(),er!==r?(gt=[gt,mt,Dt,er],Ne=gt):(we=Ne,Ne=r)):(we=Ne,Ne=r)):(we=Ne,Ne=r)):(we=Ne,Ne=r),Ft--,Ne!==r?(we=ye,ye=void 0):ye=r,ye!==r?(Ne=Je(),Ne!==r?(gt=vn(),gt!==r?(mt=dn(),mt!==r?(Dt=Mo(),Dt!==r?(Tt=ee,ye=ce(mt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r&&(ee=we,ye=st(),ye!==r?(Ne=vn(),Ne!==r?(gt=RA(),gt!==r?(mt=Mo(),mt!==r?(Tt=ee,ye=ce(gt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r),ee===r))if(ee=we,ye=vl(),ye!==r){if(Ne=[],gt=Je(),gt!==r)for(;gt!==r;)Ne.push(gt),gt=Je();else Ne=r;Ne!==r?(Tt=ee,ye=ue(ye),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;return ee}function qa(){var ee,ye,Ne;for(Ft++,ee=we,ye=[],t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));Ne!==r;)ye.push(Ne),t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));return ye!==r?(Tt=we,Ne=Ee(ye),Ne?Ne=void 0:Ne=r,Ne!==r?(ye=[ye,Ne],ee=ye):(we=ee,ee=r)):(we=ee,ee=r),Ft--,ee===r&&(ye=r,Ft===0&&Ze(Ie)),ee}function Ot(){var ee,ye,Ne;for(ee=we,ye=[],t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));Ne!==r;)ye.push(Ne),t.charCodeAt(we)===32?(Ne=he,we++):(Ne=r,Ft===0&&Ze(De));return ye!==r?(Tt=we,Ne=g(ye),Ne?Ne=void 0:Ne=r,Ne!==r?(ye=[ye,Ne],ee=ye):(we=ee,ee=r)):(we=ee,ee=r),ee}function vn(){var ee;return Tt=we,ee=me(),ee?ee=void 0:ee=r,ee}function Mo(){var ee;return Tt=we,ee=Ce(),ee?ee=void 0:ee=r,ee}function ua(){var ee;return ee=ja(),ee===r&&(ee=Dl()),ee}function qi(){var ee,ye,Ne;if(ee=ja(),ee===r){if(ee=we,ye=[],Ne=Aa(),Ne!==r)for(;Ne!==r;)ye.push(Ne),Ne=Aa();else ye=r;ye!==r&&(Tt=ee,ye=fe()),ee=ye}return ee}function vl(){var ee;return ee=Di(),ee===r&&(ee=rs(),ee===r&&(ee=ja(),ee===r&&(ee=Dl()))),ee}function Cc(){var ee;return ee=Di(),ee===r&&(ee=ja(),ee===r&&(ee=Aa())),ee}function Dl(){var ee,ye,Ne,gt,mt,Dt;if(Ft++,ee=we,Z.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Se)),ye!==r){for(Ne=[],gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Re.test(t.charAt(we))?(Dt=t.charAt(we),we++):(Dt=r,Ft===0&&Ze(ht)),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);gt!==r;)Ne.push(gt),gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Re.test(t.charAt(we))?(Dt=t.charAt(we),we++):(Dt=r,Ft===0&&Ze(ht)),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);Ne!==r?(Tt=ee,ye=q(),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;return Ft--,ee===r&&(ye=r,Ft===0&&Ze(ie)),ee}function Aa(){var ee,ye,Ne,gt,mt;if(ee=we,t.substr(we,2)===nt?(ye=nt,we+=2):(ye=r,Ft===0&&Ze(Le)),ye===r&&(ye=null),ye!==r)if(Te.test(t.charAt(we))?(Ne=t.charAt(we),we++):(Ne=r,Ft===0&&Ze(ke)),Ne!==r){for(gt=[],Ke.test(t.charAt(we))?(mt=t.charAt(we),we++):(mt=r,Ft===0&&Ze(xe));mt!==r;)gt.push(mt),Ke.test(t.charAt(we))?(mt=t.charAt(we),we++):(mt=r,Ft===0&&Ze(xe));gt!==r?(Tt=ee,ye=q(),ee=ye):(we=ee,ee=r)}else we=ee,ee=r;else we=ee,ee=r;return ee}function Di(){var ee,ye;return ee=we,t.substr(we,4)===tt?(ye=tt,we+=4):(ye=r,Ft===0&&Ze(He)),ye!==r&&(Tt=ee,ye=x()),ee=ye,ee}function rs(){var ee,ye;return ee=we,t.substr(we,4)===I?(ye=I,we+=4):(ye=r,Ft===0&&Ze(P)),ye!==r&&(Tt=ee,ye=y()),ee=ye,ee===r&&(ee=we,t.substr(we,5)===R?(ye=R,we+=5):(ye=r,Ft===0&&Ze(z)),ye!==r&&(Tt=ee,ye=X()),ee=ye),ee}function ja(){var ee,ye,Ne,gt;return Ft++,ee=we,t.charCodeAt(we)===34?(ye=se,we++):(ye=r,Ft===0&&Ze(be)),ye!==r?(t.charCodeAt(we)===34?(Ne=se,we++):(Ne=r,Ft===0&&Ze(be)),Ne!==r?(Tt=ee,ye=Fe(),ee=ye):(we=ee,ee=r)):(we=ee,ee=r),ee===r&&(ee=we,t.charCodeAt(we)===34?(ye=se,we++):(ye=r,Ft===0&&Ze(be)),ye!==r?(Ne=yu(),Ne!==r?(t.charCodeAt(we)===34?(gt=se,we++):(gt=r,Ft===0&&Ze(be)),gt!==r?(Tt=ee,ye=lt(Ne),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)),Ft--,ee===r&&(ye=r,Ft===0&&Ze($)),ee}function yu(){var ee,ye,Ne;if(ee=we,ye=[],Ne=Sl(),Ne!==r)for(;Ne!==r;)ye.push(Ne),Ne=Sl();else ye=r;return ye!==r&&(Tt=ee,ye=Et(ye)),ee=ye,ee}function Sl(){var ee,ye,Ne,gt,mt,Dt;return qt.test(t.charAt(we))?(ee=t.charAt(we),we++):(ee=r,Ft===0&&Ze(nr)),ee===r&&(ee=we,t.substr(we,2)===Pt?(ye=Pt,we+=2):(ye=r,Ft===0&&Ze(cn)),ye!==r&&(Tt=ee,ye=Sr()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===yr?(ye=yr,we+=2):(ye=r,Ft===0&&Ze(Rr)),ye!==r&&(Tt=ee,ye=Xr()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===$n?(ye=$n,we+=2):(ye=r,Ft===0&&Ze(Xs)),ye!==r&&(Tt=ee,ye=Hi()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Qs?(ye=Qs,we+=2):(ye=r,Ft===0&&Ze(Zs)),ye!==r&&(Tt=ee,ye=bi()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Fs?(ye=Fs,we+=2):(ye=r,Ft===0&&Ze($s)),ye!==r&&(Tt=ee,ye=PA()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===gu?(ye=gu,we+=2):(ye=r,Ft===0&&Ze(op)),ye!==r&&(Tt=ee,ye=ap()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Rs?(ye=Rs,we+=2):(ye=r,Ft===0&&Ze(Nn)),ye!==r&&(Tt=ee,ye=hs()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===Ts?(ye=Ts,we+=2):(ye=r,Ft===0&&Ze(pc)),ye!==r&&(Tt=ee,ye=hc()),ee=ye,ee===r&&(ee=we,t.substr(we,2)===gc?(ye=gc,we+=2):(ye=r,Ft===0&&Ze(xA)),ye!==r?(Ne=pi(),Ne!==r?(gt=pi(),gt!==r?(mt=pi(),mt!==r?(Dt=pi(),Dt!==r?(Tt=ee,ye=bA(Ne,gt,mt,Dt),ee=ye):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)):(we=ee,ee=r)))))))))),ee}function pi(){var ee;return Ro.test(t.charAt(we))?(ee=t.charAt(we),we++):(ee=r,Ft===0&&Ze(To)),ee}function Dn(){var ee,ye;if(Ft++,ee=[],pr.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Me)),ye!==r)for(;ye!==r;)ee.push(ye),pr.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Me));else ee=r;return Ft--,ee===r&&(ye=r,Ft===0&&Ze(kA)),ee}function Pl(){var ee,ye;if(Ft++,ee=[],dc.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Er)),ye!==r)for(;ye!==r;)ee.push(ye),dc.test(t.charAt(we))?(ye=t.charAt(we),we++):(ye=r,Ft===0&&Ze(Er));else ee=r;return Ft--,ee===r&&(ye=r,Ft===0&&Ze(ia)),ee}function Je(){var ee,ye,Ne,gt,mt,Dt;if(ee=we,ye=st(),ye!==r){for(Ne=[],gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Dt=st(),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);gt!==r;)Ne.push(gt),gt=we,mt=Dn(),mt===r&&(mt=null),mt!==r?(Dt=st(),Dt!==r?(mt=[mt,Dt],gt=mt):(we=gt,gt=r)):(we=gt,gt=r);Ne!==r?(ye=[ye,Ne],ee=ye):(we=ee,ee=r)}else we=ee,ee=r;return ee}function st(){var ee;return t.substr(we,2)===du?(ee=du,we+=2):(ee=r,Ft===0&&Ze(QA)),ee===r&&(t.charCodeAt(we)===10?(ee=FA,we++):(ee=r,Ft===0&&Ze(mc)),ee===r&&(t.charCodeAt(we)===13?(ee=yc,we++):(ee=r,Ft===0&&Ze(Il)))),ee}let vt=2,ar=0;if(Bn=a(),Bn!==r&&we===t.length)return Bn;throw Bn!==r&&we"u"?!0:typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.keys(t).every(e=>_K(t[e])):!1}function rL(t,e,r){if(t===null)return`null -`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} -`;if(typeof t=="string")return`${MK(t)} -`;if(Array.isArray(t)){if(t.length===0)return`[] -`;let o=" ".repeat(e);return` -${t.map(n=>`${o}- ${rL(n,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let[o,a]=t instanceof DS?[t.data,!1]:[t,!0],n=" ".repeat(e),u=Object.keys(o);a&&u.sort((p,h)=>{let E=OK.indexOf(p),w=OK.indexOf(h);return E===-1&&w===-1?ph?1:0:E!==-1&&w===-1?-1:E===-1&&w!==-1?1:E-w});let A=u.filter(p=>!_K(o[p])).map((p,h)=>{let E=o[p],w=MK(p),D=rL(E,e+1,!0),b=h>0||r?n:"",C=w.length>1024?`? ${w} -${b}:`:`${w}:`,T=D.startsWith(` -`)?D:` ${D}`;return`${b}${C}${T}`}).join(e===0?` -`:"")||` -`;return r?` -${A}`:`${A}`}throw new Error(`Unsupported value type (${t})`)}function Sa(t){try{let e=rL(t,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}function L6e(t){return t.endsWith(` -`)||(t+=` -`),(0,UK.parse)(t)}function O6e(t){if(N6e.test(t))return L6e(t);let e=(0,SS.safeLoad)(t,{schema:SS.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Vi(t){return O6e(t)}var SS,UK,T6e,OK,DS,N6e,HK=It(()=>{SS=et(TK()),UK=et(NK()),T6e=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,OK=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],DS=class{constructor(e){this.data=e}};Sa.PreserveOrdering=DS;N6e=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i});var Ew={};Vt(Ew,{parseResolution:()=>pS,parseShell:()=>uS,parseSyml:()=>Vi,stringifyArgument:()=>qT,stringifyArgumentSegment:()=>jT,stringifyArithmeticExpression:()=>fS,stringifyCommand:()=>HT,stringifyCommandChain:()=>mm,stringifyCommandChainThen:()=>_T,stringifyCommandLine:()=>AS,stringifyCommandLineThen:()=>UT,stringifyEnvSegment:()=>cS,stringifyRedirectArgument:()=>fw,stringifyResolution:()=>hS,stringifyShell:()=>dm,stringifyShellLine:()=>dm,stringifySyml:()=>Sa,stringifyValueArgument:()=>J0});var Ol=It(()=>{_Y();GY();HK()});var jK=_((tbt,nL)=>{"use strict";var M6e=t=>{let e=!1,r=!1,o=!1;for(let a=0;a{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=a=>e.pascalCase?a.charAt(0).toUpperCase()+a.slice(1):a;return Array.isArray(t)?t=t.map(a=>a.trim()).filter(a=>a.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=M6e(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(a,n)=>n.toUpperCase()).replace(/\d+(\w|$)/g,a=>a.toUpperCase()),r(t))};nL.exports=qK;nL.exports.default=qK});var GK=_((rbt,U6e)=>{U6e.exports=[{name:"Agola CI",constant:"AGOLA",env:"AGOLA_GIT_REF",pr:"AGOLA_PULL_REQUEST_ID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"TF_BUILD",pr:{BUILD_REASON:"PullRequest"}},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codemagic",constant:"CODEMAGIC",env:"CM_BUILD_ID",pr:"CM_PULL_REQUEST"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"Earthly",constant:"EARTHLY",env:"EARTHLY_CI"},{name:"Expo Application Services",constant:"EAS",env:"EAS_BUILD"},{name:"Gerrit",constant:"GERRIT",env:"GERRIT_PROJECT"},{name:"Gitea Actions",constant:"GITEA_ACTIONS",env:"GITEA_ACTIONS"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Google Cloud Build",constant:"GOOGLE_CLOUD_BUILD",env:"BUILDER_OUTPUT"},{name:"Harness CI",constant:"HARNESS",env:"HARNESS_BUILD_ID"},{name:"Heroku",constant:"HEROKU",env:{env:"NODE",includes:"/app/.heroku/node/bin/node"}},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Prow",constant:"PROW",env:"PROW_JOB_ID"},{name:"ReleaseHub",constant:"RELEASEHUB",env:"RELEASE_BUILD_ID"},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Sourcehut",constant:"SOURCEHUT",env:{CI_NAME:"sourcehut"}},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vela",constant:"VELA",env:"VELA",pr:{VELA_PULL_REQUEST:"1"}},{name:"Vercel",constant:"VERCEL",env:{any:["NOW_BUILDER","VERCEL"]},pr:"VERCEL_GIT_PULL_REQUEST_ID"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"},{name:"Woodpecker",constant:"WOODPECKER",env:{CI:"woodpecker"},pr:{CI_BUILD_EVENT:"pull_request"}},{name:"Xcode Cloud",constant:"XCODE_CLOUD",env:"CI_XCODE_PROJECT",pr:"CI_PULL_REQUEST_NUMBER"},{name:"Xcode Server",constant:"XCODE_SERVER",env:"XCS"}]});var sg=_(nl=>{"use strict";var YK=GK(),ls=process.env;Object.defineProperty(nl,"_vendors",{value:YK.map(function(t){return t.constant})});nl.name=null;nl.isPR=null;YK.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(o){return WK(o)});if(nl[t.constant]=r,!!r)switch(nl.name=t.name,typeof t.pr){case"string":nl.isPR=!!ls[t.pr];break;case"object":"env"in t.pr?nl.isPR=t.pr.env in ls&&ls[t.pr.env]!==t.pr.ne:"any"in t.pr?nl.isPR=t.pr.any.some(function(o){return!!ls[o]}):nl.isPR=WK(t.pr);break;default:nl.isPR=null}});nl.isCI=!!(ls.CI!=="false"&&(ls.BUILD_ID||ls.BUILD_NUMBER||ls.CI||ls.CI_APP_ID||ls.CI_BUILD_ID||ls.CI_BUILD_NUMBER||ls.CI_NAME||ls.CONTINUOUS_INTEGRATION||ls.RUN_ID||nl.name));function WK(t){return typeof t=="string"?!!ls[t]:"env"in t?ls[t.env]&&ls[t.env].includes(t.includes):"any"in t?t.any.some(function(e){return!!ls[e]}):Object.keys(t).every(function(e){return ls[e]===t[e]})}});var Vn,pn,og,iL,PS,VK,sL,oL,xS=It(()=>{(function(t){t.StartOfInput="\0",t.EndOfInput="",t.EndOfPartialInput=""})(Vn||(Vn={}));(function(t){t[t.InitialNode=0]="InitialNode",t[t.SuccessNode=1]="SuccessNode",t[t.ErrorNode=2]="ErrorNode",t[t.CustomNode=3]="CustomNode"})(pn||(pn={}));og=-1,iL=/^(-h|--help)(?:=([0-9]+))?$/,PS=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,VK=/^-[a-zA-Z]{2,}$/,sL=/^([^=]+)=([\s\S]*)$/,oL=process.env.DEBUG_CLI==="1"});var it,Dm,bS,aL,kS=It(()=>{xS();it=class extends Error{constructor(e){super(e),this.clipanion={type:"usage"},this.name="UsageError"}},Dm=class extends Error{constructor(e,r){if(super(),this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(o=>o.reason!==null&&o.reason===r[0].reason)){let[{reason:o}]=this.candidates;this.message=`${o} - -${this.candidates.map(({usage:a})=>`$ ${a}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:o}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${o} -${aL(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:o},a)=>`${`${a}.`.padStart(4)} ${o}`).join(` -`)} - -${aL(e)}`}},bS=class extends Error{constructor(e,r){super(),this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((o,a)=>`${`${a}.`.padStart(4)} ${o}`).join(` -`)} - -${aL(e)}`}},aL=t=>`While running ${t.filter(e=>e!==Vn.EndOfInput&&e!==Vn.EndOfPartialInput).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`});function _6e(t){let e=t.split(` -`),r=e.filter(a=>a.match(/\S/)),o=r.length>0?r.reduce((a,n)=>Math.min(a,n.length-n.trimStart().length),Number.MAX_VALUE):0;return e.map(a=>a.slice(o).trimRight()).join(` -`)}function yo(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` -`),t=_6e(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),t=t.replace(/\n(\n)?\n*/g,(o,a)=>a||" "),r&&(t=t.split(/\n/).map(o=>{let a=o.match(/^\s*[*-][\t ]+(.*)/);if(!a)return o.match(/(.{1,80})(?: |$)/g).join(` -`);let n=o.length-o.trimStart().length;return a[1].match(new RegExp(`(.{1,${78-n}})(?: |$)`,"g")).map((u,A)=>" ".repeat(n)+(A===0?"- ":" ")+u).join(` -`)}).join(` - -`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(o,a,n)=>e.code(a+n+a)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(o,a,n)=>e.bold(a+n+a)),t?`${t} -`:""}var lL,KK,JK,cL=It(()=>{lL=Array(80).fill("\u2501");for(let t=0;t<=24;++t)lL[lL.length-t]=`\x1B[38;5;${232+t}m\u2501`;KK={header:t=>`\x1B[1m\u2501\u2501\u2501 ${t}${t.length<75?` ${lL.slice(t.length+5).join("")}`:":"}\x1B[0m`,bold:t=>`\x1B[1m${t}\x1B[22m`,error:t=>`\x1B[31m\x1B[1m${t}\x1B[22m\x1B[39m`,code:t=>`\x1B[36m${t}\x1B[39m`},JK={header:t=>t,bold:t=>t,error:t=>t,code:t=>t}});function Wo(t){return{...t,[Cw]:!0}}function Yu(t,e){return typeof t>"u"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function QS(t,{mergeName:e=!1}={}){let r=t.match(/^([^:]+): (.*)$/m);if(!r)return"validation failed";let[,o,a]=r;return e&&(a=a[0].toLowerCase()+a.slice(1)),a=o!=="."||!e?`${o.replace(/^\.(\[|$)/,"$1")}: ${a}`:`: ${a}`,a}function Iw(t,e){return e.length===1?new it(`${t}${QS(e[0],{mergeName:!0})}`):new it(`${t}: -${e.map(r=>` -- ${QS(r)}`).join("")}`)}function ag(t,e,r){if(typeof r>"u")return e;let o=[],a=[],n=A=>{let p=e;return e=A,n.bind(null,p)};if(!r(e,{errors:o,coercions:a,coercion:n}))throw Iw(`Invalid value for ${t}`,o);for(let[,A]of a)A();return e}var Cw,yf=It(()=>{kS();Cw=Symbol("clipanion/isOption")});var Yo={};Vt(Yo,{KeyRelationship:()=>Vu,TypeAssertionError:()=>zp,applyCascade:()=>vw,as:()=>sqe,assert:()=>rqe,assertWithErrors:()=>nqe,cascade:()=>NS,fn:()=>oqe,hasAtLeastOneKey:()=>dL,hasExactLength:()=>eJ,hasForbiddenKeys:()=>Dqe,hasKeyRelationship:()=>Sw,hasMaxLength:()=>lqe,hasMinLength:()=>aqe,hasMutuallyExclusiveKeys:()=>Sqe,hasRequiredKeys:()=>vqe,hasUniqueItems:()=>cqe,isArray:()=>RS,isAtLeast:()=>hL,isAtMost:()=>fqe,isBase64:()=>Cqe,isBoolean:()=>K6e,isDate:()=>z6e,isDict:()=>$6e,isEnum:()=>js,isHexColor:()=>Eqe,isISO8601:()=>yqe,isInExclusiveRange:()=>hqe,isInInclusiveRange:()=>pqe,isInstanceOf:()=>tqe,isInteger:()=>gL,isJSON:()=>Iqe,isLiteral:()=>XK,isLowerCase:()=>gqe,isMap:()=>Z6e,isNegative:()=>uqe,isNullable:()=>Bqe,isNumber:()=>fL,isObject:()=>ZK,isOneOf:()=>pL,isOptional:()=>wqe,isPartial:()=>eqe,isPayload:()=>J6e,isPositive:()=>Aqe,isRecord:()=>LS,isSet:()=>X6e,isString:()=>Pm,isTuple:()=>TS,isUUID4:()=>mqe,isUnknown:()=>AL,isUpperCase:()=>dqe,makeTrait:()=>$K,makeValidator:()=>qr,matchesRegExp:()=>Bw,softAssert:()=>iqe});function Kn(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":typeof t=="symbol"?`<${t.toString()}>`:Array.isArray(t)?"an array":JSON.stringify(t)}function Sm(t,e){if(t.length===0)return"nothing";if(t.length===1)return Kn(t[0]);let r=t.slice(0,-1),o=t[t.length-1],a=t.length>2?`, ${e} `:` ${e} `;return`${r.map(n=>Kn(n)).join(", ")}${a}${Kn(o)}`}function Jp(t,e){var r,o,a;return typeof e=="number"?`${(r=t?.p)!==null&&r!==void 0?r:"."}[${e}]`:H6e.test(e)?`${(o=t?.p)!==null&&o!==void 0?o:""}.${e}`:`${(a=t?.p)!==null&&a!==void 0?a:"."}[${JSON.stringify(e)}]`}function uL(t,e,r){return t===1?e:r}function gr({errors:t,p:e}={},r){return t?.push(`${e??"."}: ${r}`),!1}function Y6e(t,e){return r=>{t[e]=r}}function Ku(t,e){return r=>{let o=t[e];return t[e]=r,Ku(t,e).bind(null,o)}}function ww(t,e,r){let o=()=>(t(r()),a),a=()=>(t(e),o);return o}function AL(){return qr({test:(t,e)=>!0})}function XK(t){return qr({test:(e,r)=>e!==t?gr(r,`Expected ${Kn(t)} (got ${Kn(e)})`):!0})}function Pm(){return qr({test:(t,e)=>typeof t!="string"?gr(e,`Expected a string (got ${Kn(t)})`):!0})}function js(t){let e=Array.isArray(t)?t:Object.values(t),r=e.every(a=>typeof a=="string"||typeof a=="number"),o=new Set(e);return o.size===1?XK([...o][0]):qr({test:(a,n)=>o.has(a)?!0:r?gr(n,`Expected one of ${Sm(e,"or")} (got ${Kn(a)})`):gr(n,`Expected a valid enumeration value (got ${Kn(a)})`)})}function K6e(){return qr({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return gr(e,"Unbound coercion result");let o=V6e.get(t);if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return gr(e,`Expected a boolean (got ${Kn(t)})`)}return!0}})}function fL(){return qr({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return gr(e,"Unbound coercion result");let o;if(typeof t=="string"){let a;try{a=JSON.parse(t)}catch{}if(typeof a=="number")if(JSON.stringify(a)===t)o=a;else return gr(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return gr(e,`Expected a number (got ${Kn(t)})`)}return!0}})}function J6e(t){return qr({test:(e,r)=>{var o;if(typeof r?.coercions>"u")return gr(r,"The isPayload predicate can only be used with coercion enabled");if(typeof r.coercion>"u")return gr(r,"Unbound coercion result");if(typeof e!="string")return gr(r,`Expected a string (got ${Kn(e)})`);let a;try{a=JSON.parse(e)}catch{return gr(r,`Expected a JSON string (got ${Kn(e)})`)}let n={value:a};return t(a,Object.assign(Object.assign({},r),{coercion:Ku(n,"value")}))?(r.coercions.push([(o=r.p)!==null&&o!==void 0?o:".",r.coercion.bind(null,n.value)]),!0):!1}})}function z6e(){return qr({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof e?.coercions<"u"){if(typeof e?.coercion>"u")return gr(e,"Unbound coercion result");let o;if(typeof t=="string"&&zK.test(t))o=new Date(t);else{let a;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch{}typeof n=="number"&&(a=n)}else typeof t=="number"&&(a=t);if(typeof a<"u")if(Number.isSafeInteger(a)||!Number.isSafeInteger(a*1e3))o=new Date(a*1e3);else return gr(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof o<"u")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,o)]),!0}return gr(e,`Expected a date (got ${Kn(t)})`)}return!0}})}function RS(t,{delimiter:e}={}){return qr({test:(r,o)=>{var a;let n=r;if(typeof r=="string"&&typeof e<"u"&&typeof o?.coercions<"u"){if(typeof o?.coercion>"u")return gr(o,"Unbound coercion result");r=r.split(e)}if(!Array.isArray(r))return gr(o,`Expected an array (got ${Kn(r)})`);let u=!0;for(let A=0,p=r.length;A{var n,u;if(Object.getPrototypeOf(o).toString()==="[object Set]")if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");let A=[...o],p=[...o];if(!r(p,Object.assign(Object.assign({},a),{coercion:void 0})))return!1;let h=()=>p.some((E,w)=>E!==A[w])?new Set(p):o;return a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",ww(a.coercion,o,h)]),!0}else{let A=!0;for(let p of o)if(A=t(p,Object.assign({},a))&&A,!A&&a?.errors==null)break;return A}if(typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");let A={value:o};return r(o,Object.assign(Object.assign({},a),{coercion:Ku(A,"value")}))?(a.coercions.push([(u=a.p)!==null&&u!==void 0?u:".",ww(a.coercion,o,()=>new Set(A.value))]),!0):!1}return gr(a,`Expected a set (got ${Kn(o)})`)}})}function Z6e(t,e){let r=RS(TS([t,e])),o=LS(e,{keys:t});return qr({test:(a,n)=>{var u,A,p;if(Object.getPrototypeOf(a).toString()==="[object Map]")if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return gr(n,"Unbound coercion result");let h=[...a],E=[...a];if(!r(E,Object.assign(Object.assign({},n),{coercion:void 0})))return!1;let w=()=>E.some((D,b)=>D[0]!==h[b][0]||D[1]!==h[b][1])?new Map(E):a;return n.coercions.push([(u=n.p)!==null&&u!==void 0?u:".",ww(n.coercion,a,w)]),!0}else{let h=!0;for(let[E,w]of a)if(h=t(E,Object.assign({},n))&&h,!h&&n?.errors==null||(h=e(w,Object.assign(Object.assign({},n),{p:Jp(n,E)}))&&h,!h&&n?.errors==null))break;return h}if(typeof n?.coercions<"u"){if(typeof n?.coercion>"u")return gr(n,"Unbound coercion result");let h={value:a};return Array.isArray(a)?r(a,Object.assign(Object.assign({},n),{coercion:void 0}))?(n.coercions.push([(A=n.p)!==null&&A!==void 0?A:".",ww(n.coercion,a,()=>new Map(h.value))]),!0):!1:o(a,Object.assign(Object.assign({},n),{coercion:Ku(h,"value")}))?(n.coercions.push([(p=n.p)!==null&&p!==void 0?p:".",ww(n.coercion,a,()=>new Map(Object.entries(h.value)))]),!0):!1}return gr(n,`Expected a map (got ${Kn(a)})`)}})}function TS(t,{delimiter:e}={}){let r=eJ(t.length);return qr({test:(o,a)=>{var n;if(typeof o=="string"&&typeof e<"u"&&typeof a?.coercions<"u"){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");o=o.split(e),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)])}if(!Array.isArray(o))return gr(a,`Expected a tuple (got ${Kn(o)})`);let u=r(o,Object.assign({},a));for(let A=0,p=o.length;A{var n;if(Array.isArray(o)&&typeof a?.coercions<"u")return typeof a?.coercion>"u"?gr(a,"Unbound coercion result"):r(o,Object.assign(Object.assign({},a),{coercion:void 0}))?(o=Object.fromEntries(o),a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,o)]),!0):!1;if(typeof o!="object"||o===null)return gr(a,`Expected an object (got ${Kn(o)})`);let u=Object.keys(o),A=!0;for(let p=0,h=u.length;p{if(typeof a!="object"||a===null)return gr(n,`Expected an object (got ${Kn(a)})`);let u=new Set([...r,...Object.keys(a)]),A={},p=!0;for(let h of u){if(h==="constructor"||h==="__proto__")p=gr(Object.assign(Object.assign({},n),{p:Jp(n,h)}),"Unsafe property name");else{let E=Object.prototype.hasOwnProperty.call(t,h)?t[h]:void 0,w=Object.prototype.hasOwnProperty.call(a,h)?a[h]:void 0;typeof E<"u"?p=E(w,Object.assign(Object.assign({},n),{p:Jp(n,h),coercion:Ku(a,h)}))&&p:e===null?p=gr(Object.assign(Object.assign({},n),{p:Jp(n,h)}),`Extraneous property (got ${Kn(w)})`):Object.defineProperty(A,h,{enumerable:!0,get:()=>w,set:Y6e(a,h)})}if(!p&&n?.errors==null)break}return e!==null&&(p||n?.errors!=null)&&(p=e(A,n)&&p),p}});return Object.assign(o,{properties:t})}function eqe(t){return ZK(t,{extra:LS(AL())})}function $K(t){return()=>t}function qr({test:t}){return $K(t)()}function rqe(t,e){if(!e(t))throw new zp}function nqe(t,e){let r=[];if(!e(t,{errors:r}))throw new zp({errors:r})}function iqe(t,e){}function sqe(t,e,{coerce:r=!1,errors:o,throw:a}={}){let n=o?[]:void 0;if(!r){if(e(t,{errors:n}))return a?t:{value:t,errors:void 0};if(a)throw new zp({errors:n});return{value:void 0,errors:n??!0}}let u={value:t},A=Ku(u,"value"),p=[];if(!e(t,{errors:n,coercion:A,coercions:p})){if(a)throw new zp({errors:n});return{value:void 0,errors:n??!0}}for(let[,h]of p)h();return a?u.value:{value:u.value,errors:void 0}}function oqe(t,e){let r=TS(t);return(...o)=>{if(!r(o))throw new zp;return e(...o)}}function aqe(t){return qr({test:(e,r)=>e.length>=t?!0:gr(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)})}function lqe(t){return qr({test:(e,r)=>e.length<=t?!0:gr(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)})}function eJ(t){return qr({test:(e,r)=>e.length!==t?gr(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0})}function cqe({map:t}={}){return qr({test:(e,r)=>{let o=new Set,a=new Set;for(let n=0,u=e.length;nt<=0?!0:gr(e,`Expected to be negative (got ${t})`)})}function Aqe(){return qr({test:(t,e)=>t>=0?!0:gr(e,`Expected to be positive (got ${t})`)})}function hL(t){return qr({test:(e,r)=>e>=t?!0:gr(r,`Expected to be at least ${t} (got ${e})`)})}function fqe(t){return qr({test:(e,r)=>e<=t?!0:gr(r,`Expected to be at most ${t} (got ${e})`)})}function pqe(t,e){return qr({test:(r,o)=>r>=t&&r<=e?!0:gr(o,`Expected to be in the [${t}; ${e}] range (got ${r})`)})}function hqe(t,e){return qr({test:(r,o)=>r>=t&&re!==Math.round(e)?gr(r,`Expected to be an integer (got ${e})`):!t&&!Number.isSafeInteger(e)?gr(r,`Expected to be a safe integer (got ${e})`):!0})}function Bw(t){return qr({test:(e,r)=>t.test(e)?!0:gr(r,`Expected to match the pattern ${t.toString()} (got ${Kn(e)})`)})}function gqe(){return qr({test:(t,e)=>t!==t.toLowerCase()?gr(e,`Expected to be all-lowercase (got ${t})`):!0})}function dqe(){return qr({test:(t,e)=>t!==t.toUpperCase()?gr(e,`Expected to be all-uppercase (got ${t})`):!0})}function mqe(){return qr({test:(t,e)=>W6e.test(t)?!0:gr(e,`Expected to be a valid UUID v4 (got ${Kn(t)})`)})}function yqe(){return qr({test:(t,e)=>zK.test(t)?!0:gr(e,`Expected to be a valid ISO 8601 date string (got ${Kn(t)})`)})}function Eqe({alpha:t=!1}){return qr({test:(e,r)=>(t?q6e.test(e):j6e.test(e))?!0:gr(r,`Expected to be a valid hexadecimal color string (got ${Kn(e)})`)})}function Cqe(){return qr({test:(t,e)=>G6e.test(t)?!0:gr(e,`Expected to be a valid base 64 string (got ${Kn(t)})`)})}function Iqe(t=AL()){return qr({test:(e,r)=>{let o;try{o=JSON.parse(e)}catch{return gr(r,`Expected to be a valid JSON string (got ${Kn(e)})`)}return t(o,r)}})}function NS(t,...e){let r=Array.isArray(e[0])?e[0]:e;return qr({test:(o,a)=>{var n,u;let A={value:o},p=typeof a?.coercions<"u"?Ku(A,"value"):void 0,h=typeof a?.coercions<"u"?[]:void 0;if(!t(o,Object.assign(Object.assign({},a),{coercion:p,coercions:h})))return!1;let E=[];if(typeof h<"u")for(let[,w]of h)E.push(w());try{if(typeof a?.coercions<"u"){if(A.value!==o){if(typeof a?.coercion>"u")return gr(a,"Unbound coercion result");a.coercions.push([(n=a.p)!==null&&n!==void 0?n:".",a.coercion.bind(null,A.value)])}(u=a?.coercions)===null||u===void 0||u.push(...h)}return r.every(w=>w(A.value,a))}finally{for(let w of E)w()}}})}function vw(t,...e){let r=Array.isArray(e[0])?e[0]:e;return NS(t,r)}function wqe(t){return qr({test:(e,r)=>typeof e>"u"?!0:t(e,r)})}function Bqe(t){return qr({test:(e,r)=>e===null?!0:t(e,r)})}function vqe(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)||p.push(h);return p.length>0?gr(u,`Missing required ${uL(p.length,"property","properties")} ${Sm(p,"and")}`):!0}})}function dL(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>Object.keys(n).some(h=>a(o,h,n))?!0:gr(u,`Missing at least one property from ${Sm(Array.from(o),"or")}`)})}function Dqe(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>0?gr(u,`Forbidden ${uL(p.length,"property","properties")} ${Sm(p,"and")}`):!0}})}function Sqe(t,e){var r;let o=new Set(t),a=Dw[(r=e?.missingIf)!==null&&r!==void 0?r:"missing"];return qr({test:(n,u)=>{let A=new Set(Object.keys(n)),p=[];for(let h of o)a(A,h,n)&&p.push(h);return p.length>1?gr(u,`Mutually exclusive properties ${Sm(p,"and")}`):!0}})}function Sw(t,e,r,o){var a,n;let u=new Set((a=o?.ignore)!==null&&a!==void 0?a:[]),A=Dw[(n=o?.missingIf)!==null&&n!==void 0?n:"missing"],p=new Set(r),h=Pqe[e],E=e===Vu.Forbids?"or":"and";return qr({test:(w,D)=>{let b=new Set(Object.keys(w));if(!A(b,t,w)||u.has(w[t]))return!0;let C=[];for(let T of p)(A(b,T,w)&&!u.has(w[T]))!==h.expect&&C.push(T);return C.length>=1?gr(D,`Property "${t}" ${h.message} ${uL(C.length,"property","properties")} ${Sm(C,E)}`):!0}})}var H6e,q6e,j6e,G6e,W6e,zK,V6e,tqe,pL,zp,Dw,Vu,Pqe,il=It(()=>{H6e=/^[a-zA-Z_][a-zA-Z0-9_]*$/;q6e=/^#[0-9a-f]{6}$/i,j6e=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,G6e=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,W6e=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,zK=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/;V6e=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]);tqe=t=>qr({test:(e,r)=>e instanceof t?!0:gr(r,`Expected an instance of ${t.name} (got ${Kn(e)})`)}),pL=(t,{exclusive:e=!1}={})=>qr({test:(r,o)=>{var a,n,u;let A=[],p=typeof o?.errors<"u"?[]:void 0;for(let h=0,E=t.length;h1?gr(o,`Expected to match exactly a single predicate (matched ${A.join(", ")})`):(u=o?.errors)===null||u===void 0||u.push(...p),!1}});zp=class extends Error{constructor({errors:e}={}){let r="Type mismatch";if(e&&e.length>0){r+=` -`;for(let o of e)r+=` -- ${o}`}super(r)}};Dw={missing:(t,e)=>t.has(e),undefined:(t,e,r)=>t.has(e)&&typeof r[e]<"u",nil:(t,e,r)=>t.has(e)&&r[e]!=null,falsy:(t,e,r)=>t.has(e)&&!!r[e]};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Vu||(Vu={}));Pqe={[Vu.Forbids]:{expect:!1,message:"forbids using"},[Vu.Requires]:{expect:!0,message:"requires using"}}});var ot,Xp=It(()=>{yf();ot=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(Array.isArray(r)){let{isDict:a,isUnknown:n,applyCascade:u}=await Promise.resolve().then(()=>(il(),Yo)),A=u(a(n()),r),p=[],h=[];if(!A(this,{errors:p,coercions:h}))throw Iw("Invalid option schema",p);for(let[,w]of h)w()}else if(r!=null)throw new Error("Invalid command schema");let o=await this.execute();return typeof o<"u"?o:0}};ot.isOption=Cw;ot.Default=[]});function Pa(t){oL&&console.log(t)}function rJ(){let t={nodes:[]};for(let e=0;e{if(e.has(o))return;e.add(o);let a=t.nodes[o];for(let u of Object.values(a.statics))for(let{to:A}of u)r(A);for(let[,{to:u}]of a.dynamics)r(u);for(let{to:u}of a.shortcuts)r(u);let n=new Set(a.shortcuts.map(({to:u})=>u));for(;a.shortcuts.length>0;){let{to:u}=a.shortcuts.shift(),A=t.nodes[u];for(let[p,h]of Object.entries(A.statics)){let E=Object.prototype.hasOwnProperty.call(a.statics,p)?a.statics[p]:a.statics[p]=[];for(let w of h)E.some(({to:D})=>w.to===D)||E.push(w)}for(let[p,h]of A.dynamics)a.dynamics.some(([E,{to:w}])=>p===E&&h.to===w)||a.dynamics.push([p,h]);for(let p of A.shortcuts)n.has(p.to)||(a.shortcuts.push(p),n.add(p.to))}};r(pn.InitialNode)}function kqe(t,{prefix:e=""}={}){if(oL){Pa(`${e}Nodes are:`);for(let r=0;rE!==pn.ErrorNode).map(({state:E})=>({usage:E.candidateUsage,reason:null})));if(h.every(({node:E})=>E===pn.ErrorNode))throw new Dm(e,h.map(({state:E})=>({usage:E.candidateUsage,reason:E.errorMessage})));o=Rqe(h)}if(o.length>0){Pa(" Results:");for(let n of o)Pa(` - ${n.node} -> ${JSON.stringify(n.state)}`)}else Pa(" No results");return o}function Fqe(t,e,{endToken:r=Vn.EndOfInput}={}){let o=Qqe(t,[...e,r]);return Tqe(e,o.map(({state:a})=>a))}function Rqe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function Tqe(t,e){let r=e.filter(D=>D.selectedIndex!==null),o=r.filter(D=>!D.partial);if(o.length>0&&(r=o),r.length===0)throw new Error;let a=r.filter(D=>D.selectedIndex===og||D.requiredOptions.every(b=>b.some(C=>D.options.find(T=>T.name===C))));if(a.length===0)throw new Dm(t,r.map(D=>({usage:D.candidateUsage,reason:null})));let n=0;for(let D of a)D.path.length>n&&(n=D.path.length);let u=a.filter(D=>D.path.length===n),A=D=>D.positionals.filter(({extra:b})=>!b).length+D.options.length,p=u.map(D=>({state:D,positionalCount:A(D)})),h=0;for(let{positionalCount:D}of p)D>h&&(h=D);let E=p.filter(({positionalCount:D})=>D===h).map(({state:D})=>D),w=Lqe(E);if(w.length>1)throw new bS(t,w.map(D=>D.candidateUsage));return w[0]}function Lqe(t){let e=[],r=[];for(let o of t)o.selectedIndex===og?r.push(o):e.push(o);return r.length>0&&e.push({...tJ,path:nJ(...r.map(o=>o.path)),options:r.reduce((o,a)=>o.concat(a.options),[])}),e}function nJ(t,e,...r){return e===void 0?Array.from(t):nJ(t.filter((o,a)=>o===e[a]),...r)}function sl(){return{dynamics:[],shortcuts:[],statics:{}}}function iJ(t){return t===pn.SuccessNode||t===pn.ErrorNode}function mL(t,e=0){return{to:iJ(t.to)?t.to:t.to>=pn.CustomNode?t.to+e-pn.CustomNode+1:t.to+e,reducer:t.reducer}}function Nqe(t,e=0){let r=sl();for(let[o,a]of t.dynamics)r.dynamics.push([o,mL(a,e)]);for(let o of t.shortcuts)r.shortcuts.push(mL(o,e));for(let[o,a]of Object.entries(t.statics))r.statics[o]=a.map(n=>mL(n,e));return r}function Bs(t,e,r,o,a){t.nodes[e].dynamics.push([r,{to:o,reducer:a}])}function xm(t,e,r,o){t.nodes[e].shortcuts.push({to:r,reducer:o})}function Vo(t,e,r,o,a){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:o,reducer:a})}function OS(t,e,r,o,a){if(Array.isArray(e)){let[n,...u]=e;return t[n](r,o,a,...u)}else return t[e](r,o,a)}var tJ,Oqe,yL,ol,EL,MS,US=It(()=>{xS();kS();tJ={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:og,partial:!1,tokens:[]};Oqe={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,o)=>!t.ignoreOptions&&e===o,isBatchOption:(t,e,r,o)=>!t.ignoreOptions&&VK.test(e)&&[...e.slice(1)].every(a=>o.has(`-${a}`)),isBoundOption:(t,e,r,o,a)=>{let n=e.match(sL);return!t.ignoreOptions&&!!n&&PS.test(n[1])&&o.has(n[1])&&a.filter(u=>u.nameSet.includes(n[1])).every(u=>u.allowBinding)},isNegatedOption:(t,e,r,o)=>!t.ignoreOptions&&e===`--no-${o.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&iL.test(e),isUnsupportedOption:(t,e,r,o)=>!t.ignoreOptions&&e.startsWith("-")&&PS.test(e)&&!o.has(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!PS.test(e)},yL={setCandidateState:(t,e,r,o)=>({...t,...o}),setSelectedIndex:(t,e,r,o)=>({...t,selectedIndex:o}),setPartialIndex:(t,e,r,o)=>({...t,selectedIndex:o,partial:!0}),pushBatch:(t,e,r,o)=>{let a=t.options.slice(),n=t.tokens.slice();for(let u=1;u{let[,o,a]=e.match(sL),n=t.options.concat({name:o,value:a}),u=t.tokens.concat([{segmentIndex:r,type:"option",slice:[0,o.length],option:o},{segmentIndex:r,type:"assign",slice:[o.length,o.length+1]},{segmentIndex:r,type:"value",slice:[o.length+1,o.length+a.length+1]}]);return{...t,options:n,tokens:u}},pushPath:(t,e,r)=>{let o=t.path.concat(e),a=t.tokens.concat({segmentIndex:r,type:"path"});return{...t,path:o,tokens:a}},pushPositional:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!1}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtra:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:!0}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushExtraNoLimits:(t,e,r)=>{let o=t.positionals.concat({value:e,extra:ol}),a=t.tokens.concat({segmentIndex:r,type:"positional"});return{...t,positionals:o,tokens:a}},pushTrue:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushFalse:(t,e,r,o)=>{let a=t.options.concat({name:o,value:!1}),n=t.tokens.concat({segmentIndex:r,type:"option",option:o});return{...t,options:a,tokens:n}},pushUndefined:(t,e,r,o)=>{let a=t.options.concat({name:e,value:void 0}),n=t.tokens.concat({segmentIndex:r,type:"option",option:e});return{...t,options:a,tokens:n}},pushStringValue:(t,e,r)=>{var o;let a=t.options[t.options.length-1],n=t.options.slice(),u=t.tokens.concat({segmentIndex:r,type:"value"});return a.value=((o=a.value)!==null&&o!==void 0?o:[]).concat([e]),{...t,options:n,tokens:u}},setStringValue:(t,e,r)=>{let o=t.options[t.options.length-1],a=t.options.slice(),n=t.tokens.concat({segmentIndex:r,type:"value"});return o.value=e,{...t,options:a,tokens:n}},inhibateOptions:t=>({...t,ignoreOptions:!0}),useHelp:(t,e,r,o)=>{let[,,a]=e.match(iL);return typeof a<"u"?{...t,options:[{name:"-c",value:String(o)},{name:"-i",value:a}]}:{...t,options:[{name:"-c",value:String(o)}]}},setError:(t,e,r,o)=>e===Vn.EndOfInput||e===Vn.EndOfPartialInput?{...t,errorMessage:`${o}.`}:{...t,errorMessage:`${o} ("${e}").`},setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return{...t,errorMessage:`Not enough arguments to option ${r.name}.`}}},ol=Symbol(),EL=class{constructor(e,r){this.allOptionNames=new Map,this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:o=this.arity.extra,proxy:a=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:o,proxy:a})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===ol)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==ol?this.arity.extra.push(e):this.arity.extra!==ol&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===ol)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let o=0;o1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(o))throw new Error(`The arity must be an integer, got ${o}`);if(o<0)throw new Error(`The arity must be positive, got ${o}`);let A=e.reduce((p,h)=>h.length>p.length?h:p,"");for(let p of e)this.allOptionNames.set(p,A);this.options.push({preferredName:A,nameSet:e,description:r,arity:o,hidden:a,required:n,allowBinding:u})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let o=[this.cliOpts.binaryName],a=[];if(this.paths.length>0&&o.push(...this.paths[0]),e){for(let{preferredName:u,nameSet:A,arity:p,hidden:h,description:E,required:w}of this.options){if(h)continue;let D=[];for(let C=0;C`:`[${b}]`)}o.push(...this.arity.leading.map(u=>`<${u}>`)),this.arity.extra===ol?o.push("..."):o.push(...this.arity.extra.map(u=>`[${u}]`)),o.push(...this.arity.trailing.map(u=>`<${u}>`))}return{usage:o.join(" "),options:a}}compile(){if(typeof this.context>"u")throw new Error("Assertion failed: No context attached");let e=rJ(),r=pn.InitialNode,o=this.usage().usage,a=this.options.filter(A=>A.required).map(A=>A.nameSet);r=jc(e,sl()),Vo(e,pn.InitialNode,Vn.StartOfInput,r,["setCandidateState",{candidateUsage:o,requiredOptions:a}]);let n=this.arity.proxy?"always":"isNotOptionLike",u=this.paths.length>0?this.paths:[[]];for(let A of u){let p=r;if(A.length>0){let D=jc(e,sl());xm(e,p,D),this.registerOptions(e,D),p=D}for(let D=0;D0||!this.arity.proxy){let D=jc(e,sl());Bs(e,p,"isHelp",D,["useHelp",this.cliIndex]),Bs(e,D,"always",D,"pushExtra"),Vo(e,D,Vn.EndOfInput,pn.SuccessNode,["setSelectedIndex",og]),this.registerOptions(e,p)}this.arity.leading.length>0&&(Vo(e,p,Vn.EndOfInput,pn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,p,Vn.EndOfPartialInput,pn.SuccessNode,["setPartialIndex",this.cliIndex]));let h=p;for(let D=0;D0||D+1!==this.arity.leading.length)&&(Vo(e,b,Vn.EndOfInput,pn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,b,Vn.EndOfPartialInput,pn.SuccessNode,["setPartialIndex",this.cliIndex])),Bs(e,h,"isNotOptionLike",b,"pushPositional"),h=b}let E=h;if(this.arity.extra===ol||this.arity.extra.length>0){let D=jc(e,sl());if(xm(e,h,D),this.arity.extra===ol){let b=jc(e,sl());this.arity.proxy||this.registerOptions(e,b),Bs(e,h,n,b,"pushExtraNoLimits"),Bs(e,b,n,b,"pushExtraNoLimits"),xm(e,b,D)}else for(let b=0;b0)&&this.registerOptions(e,C),Bs(e,E,n,C,"pushExtra"),xm(e,C,D),E=C}E=D}this.arity.trailing.length>0&&(Vo(e,E,Vn.EndOfInput,pn.ErrorNode,["setError","Not enough positional arguments"]),Vo(e,E,Vn.EndOfPartialInput,pn.SuccessNode,["setPartialIndex",this.cliIndex]));let w=E;for(let D=0;D=0&&e{let u=n?Vn.EndOfPartialInput:Vn.EndOfInput;return Fqe(o,a,{endToken:u})}}}}});function oJ(){return _S.default&&"getColorDepth"in _S.default.WriteStream.prototype?_S.default.WriteStream.prototype.getColorDepth():process.env.FORCE_COLOR==="0"?1:process.env.FORCE_COLOR==="1"||typeof process.stdout<"u"&&process.stdout.isTTY?8:1}function aJ(t){let e=sJ;if(typeof e>"u"){if(t.stdout===process.stdout&&t.stderr===process.stderr)return null;let{AsyncLocalStorage:r}=ve("async_hooks");e=sJ=new r;let o=process.stdout._write;process.stdout._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?o.call(this,n,u,A):p.stdout.write(n,u,A)};let a=process.stderr._write;process.stderr._write=function(n,u,A){let p=e.getStore();return typeof p>"u"?a.call(this,n,u,A):p.stderr.write(n,u,A)}}return r=>e.run(t,r)}var _S,sJ,lJ=It(()=>{_S=et(ve("tty"),1)});var HS,cJ=It(()=>{Xp();HS=class t extends ot{constructor(e){super(),this.contexts=e,this.commands=[]}static from(e,r){let o=new t(r);o.path=e.path;for(let a of e.options)switch(a.name){case"-c":o.commands.push(Number(a.value));break;case"-i":o.index=Number(a.value);break}return o}async execute(){let e=this.commands;if(typeof this.index<"u"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let r=0;for(let o of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[o].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}}});async function fJ(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=hJ(t);return Ko.from(r,e).runExit(o,a)}async function pJ(...t){let{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}=hJ(t);return Ko.from(r,e).run(o,a)}function hJ(t){let e,r,o,a;switch(typeof process<"u"&&typeof process.argv<"u"&&(o=process.argv.slice(2)),t.length){case 1:r=t[0];break;case 2:t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],Array.isArray(t[1])?o=t[1]:a=t[1]):(e=t[0],r=t[1]);break;case 3:Array.isArray(t[2])?(e=t[0],r=t[1],o=t[2]):t[0]&&t[0].prototype instanceof ot||Array.isArray(t[0])?(r=t[0],o=t[1],a=t[2]):(e=t[0],r=t[1],a=t[2]);break;default:e=t[0],r=t[1],o=t[2],a=t[3];break}if(typeof o>"u")throw new Error("The argv parameter must be provided when running Clipanion outside of a Node context");return{resolvedOptions:e,resolvedCommandClasses:r,resolvedArgv:o,resolvedContext:a}}function AJ(t){return t()}var uJ,Ko,gJ=It(()=>{xS();US();cL();lJ();Xp();cJ();uJ=Symbol("clipanion/errorCommand");Ko=class t{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:o,enableCapture:a=!1,enableColors:n}={}){this.registrations=new Map,this.builder=new MS({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=o,this.enableCapture=a,this.enableColors=n}static from(e,r={}){let o=new t(r),a=Array.isArray(e)?e:[e];for(let n of a)o.register(n);return o}register(e){var r;let o=new Map,a=new e;for(let p in a){let h=a[p];typeof h=="object"&&h!==null&&h[ot.isOption]&&o.set(p,h)}let n=this.builder.command(),u=n.cliIndex,A=(r=e.paths)!==null&&r!==void 0?r:a.paths;if(typeof A<"u")for(let p of A)n.addPath(p);this.registrations.set(e,{specs:o,builder:n,index:u});for(let[p,{definition:h}]of o.entries())h(n,p);n.setContext({commandClass:e})}process(e,r){let{input:o,context:a,partial:n}=typeof e=="object"&&Array.isArray(e)?{input:e,context:r}:e,{contexts:u,process:A}=this.builder.compile(),p=A(o,{partial:n}),h={...t.defaultContext,...a};switch(p.selectedIndex){case og:{let E=HS.from(p,u);return E.context=h,E.tokens=p.tokens,E}default:{let{commandClass:E}=u[p.selectedIndex],w=this.registrations.get(E);if(typeof w>"u")throw new Error("Assertion failed: Expected the command class to have been registered.");let D=new E;D.context=h,D.tokens=p.tokens,D.path=p.path;try{for(let[b,{transformer:C}]of w.specs.entries())D[b]=C(w.builder,b,p,h);return D}catch(b){throw b[uJ]=D,b}}break}}async run(e,r){var o,a;let n,u={...t.defaultContext,...r},A=(o=this.enableColors)!==null&&o!==void 0?o:u.colorDepth>1;if(!Array.isArray(e))n=e;else try{n=this.process(e,u)}catch(E){return u.stdout.write(this.error(E,{colored:A})),1}if(n.help)return u.stdout.write(this.usage(n,{colored:A,detailed:!0})),0;n.context=u,n.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableCapture:this.enableCapture,enableColors:this.enableColors,definitions:()=>this.definitions(),definition:E=>this.definition(E),error:(E,w)=>this.error(E,w),format:E=>this.format(E),process:(E,w)=>this.process(E,{...u,...w}),run:(E,w)=>this.run(E,{...u,...w}),usage:(E,w)=>this.usage(E,w)};let p=this.enableCapture&&(a=aJ(u))!==null&&a!==void 0?a:AJ,h;try{h=await p(()=>n.validateAndExecute().catch(E=>n.catch(E).then(()=>0)))}catch(E){return u.stdout.write(this.error(E,{colored:A,command:n})),1}return h}async runExit(e,r){process.exitCode=await this.run(e,r)}definition(e,{colored:r=!1}={}){if(!e.usage)return null;let{usage:o}=this.getUsageByRegistration(e,{detailed:!1}),{usage:a,options:n}=this.getUsageByRegistration(e,{detailed:!0,inlineOptions:!1}),u=typeof e.usage.category<"u"?yo(e.usage.category,{format:this.format(r),paragraphs:!1}):void 0,A=typeof e.usage.description<"u"?yo(e.usage.description,{format:this.format(r),paragraphs:!1}):void 0,p=typeof e.usage.details<"u"?yo(e.usage.details,{format:this.format(r),paragraphs:!0}):void 0,h=typeof e.usage.examples<"u"?e.usage.examples.map(([E,w])=>[yo(E,{format:this.format(r),paragraphs:!1}),w.replace(/\$0/g,this.binaryName)]):void 0;return{path:o,usage:a,category:u,description:A,details:p,examples:h,options:n}}definitions({colored:e=!1}={}){let r=[];for(let o of this.registrations.keys()){let a=this.definition(o,{colored:e});a&&r.push(a)}return r}usage(e=null,{colored:r,detailed:o=!1,prefix:a="$ "}={}){var n;if(e===null){for(let p of this.registrations.keys()){let h=p.paths,E=typeof p.usage<"u";if(!h||h.length===0||h.length===1&&h[0].length===0||((n=h?.some(b=>b.length===0))!==null&&n!==void 0?n:!1))if(e){e=null;break}else e=p;else if(E){e=null;continue}}e&&(o=!0)}let u=e!==null&&e instanceof ot?e.constructor:e,A="";if(u)if(o){let{description:p="",details:h="",examples:E=[]}=u.usage||{};p!==""&&(A+=yo(p,{format:this.format(r),paragraphs:!1}).replace(/^./,b=>b.toUpperCase()),A+=` -`),(h!==""||E.length>0)&&(A+=`${this.format(r).header("Usage")} -`,A+=` -`);let{usage:w,options:D}=this.getUsageByRegistration(u,{inlineOptions:!1});if(A+=`${this.format(r).bold(a)}${w} -`,D.length>0){A+=` -`,A+=`${this.format(r).header("Options")} -`;let b=D.reduce((C,T)=>Math.max(C,T.definition.length),0);A+=` -`;for(let{definition:C,description:T}of D)A+=` ${this.format(r).bold(C.padEnd(b))} ${yo(T,{format:this.format(r),paragraphs:!1})}`}if(h!==""&&(A+=` -`,A+=`${this.format(r).header("Details")} -`,A+=` -`,A+=yo(h,{format:this.format(r),paragraphs:!0})),E.length>0){A+=` -`,A+=`${this.format(r).header("Examples")} -`;for(let[b,C]of E)A+=` -`,A+=yo(b,{format:this.format(r),paragraphs:!1}),A+=`${C.replace(/^/m,` ${this.format(r).bold(a)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:p}=this.getUsageByRegistration(u);A+=`${this.format(r).bold(a)}${p} -`}else{let p=new Map;for(let[D,{index:b}]of this.registrations.entries()){if(typeof D.usage>"u")continue;let C=typeof D.usage.category<"u"?yo(D.usage.category,{format:this.format(r),paragraphs:!1}):null,T=p.get(C);typeof T>"u"&&p.set(C,T=[]);let{usage:N}=this.getUsageByIndex(b);T.push({commandClass:D,usage:N})}let h=Array.from(p.keys()).sort((D,b)=>D===null?-1:b===null?1:D.localeCompare(b,"en",{usage:"sort",caseFirst:"upper"})),E=typeof this.binaryLabel<"u",w=typeof this.binaryVersion<"u";E||w?(E&&w?A+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:E?A+=`${this.format(r).header(`${this.binaryLabel}`)} -`:A+=`${this.format(r).header(`${this.binaryVersion}`)} -`,A+=` ${this.format(r).bold(a)}${this.binaryName} -`):A+=`${this.format(r).bold(a)}${this.binaryName} -`;for(let D of h){let b=p.get(D).slice().sort((T,N)=>T.usage.localeCompare(N.usage,"en",{usage:"sort",caseFirst:"upper"})),C=D!==null?D.trim():"General commands";A+=` -`,A+=`${this.format(r).header(`${C}`)} -`;for(let{commandClass:T,usage:N}of b){let U=T.usage.description||"undocumented";A+=` -`,A+=` ${this.format(r).bold(N)} -`,A+=` ${yo(U,{format:this.format(r),paragraphs:!1})}`}}A+=` -`,A+=yo("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return A}error(e,r){var o,{colored:a,command:n=(o=e[uJ])!==null&&o!==void 0?o:null}=r===void 0?{}:r;(!e||typeof e!="object"||!("stack"in e))&&(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let u="",A=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");A==="Error"&&(A="Internal Error"),u+=`${this.format(a).error(A)}: ${e.message} -`;let p=e.clipanion;return typeof p<"u"?p.type==="usage"&&(u+=` -`,u+=this.usage(n)):e.stack&&(u+=`${e.stack.replace(/^.*\n/,"")} -`),u}format(e){var r;return((r=e??this.enableColors)!==null&&r!==void 0?r:t.defaultContext.colorDepth>1)?KK:JK}getUsageByRegistration(e,r){let o=this.registrations.get(e);if(typeof o>"u")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(o.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}};Ko.defaultContext={env:process.env,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr,colorDepth:oJ()}});var Pw,dJ=It(()=>{Xp();Pw=class extends ot{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};Pw.paths=[["--clipanion=definitions"]]});var xw,mJ=It(()=>{Xp();xw=class extends ot{async execute(){this.context.stdout.write(this.cli.usage())}};xw.paths=[["-h"],["--help"]]});function qS(t={}){return Wo({definition(e,r){var o;e.addProxy({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){return o.positionals.map(({value:a})=>a)}})}var CL=It(()=>{yf()});var bw,yJ=It(()=>{Xp();CL();bw=class extends ot{constructor(){super(...arguments),this.args=qS()}async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.process(this.args).tokens,null,2)} -`)}};bw.paths=[["--clipanion=tokens"]]});var kw,EJ=It(()=>{Xp();kw=class extends ot{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};kw.paths=[["-v"],["--version"]]});var IL={};Vt(IL,{DefinitionsCommand:()=>Pw,HelpCommand:()=>xw,TokensCommand:()=>bw,VersionCommand:()=>kw});var CJ=It(()=>{dJ();mJ();yJ();EJ()});function IJ(t,e,r){let[o,a]=Yu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Wo({definition(p){p.addOption({names:u,arity:n,hidden:a?.hidden,description:a?.description,required:a.required})},transformer(p,h,E){let w,D=typeof o<"u"?[...o]:void 0;for(let{name:b,value:C}of E.options)A.has(b)&&(w=b,D=D??[],D.push(C));return typeof D<"u"?ag(w??h,D,a.validator):D}})}var wJ=It(()=>{yf()});function BJ(t,e,r){let[o,a]=Yu(e,r??{}),n=t.split(","),u=new Set(n);return Wo({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:w,value:D}of h.options)u.has(w)&&(E=D);return E}})}var vJ=It(()=>{yf()});function DJ(t,e,r){let[o,a]=Yu(e,r??{}),n=t.split(","),u=new Set(n);return Wo({definition(A){A.addOption({names:n,allowBinding:!1,arity:0,hidden:a.hidden,description:a.description,required:a.required})},transformer(A,p,h){let E=o;for(let{name:w,value:D}of h.options)u.has(w)&&(E??(E=0),D?E+=1:E=0);return E}})}var SJ=It(()=>{yf()});function PJ(t={}){return Wo({definition(e,r){var o;e.addRest({name:(o=t.name)!==null&&o!==void 0?o:r,required:t.required})},transformer(e,r,o){let a=u=>{let A=o.positionals[u];return A.extra===ol||A.extra===!1&&uu)}})}var xJ=It(()=>{US();yf()});function Mqe(t,e,r){let[o,a]=Yu(e,r??{}),{arity:n=1}=a,u=t.split(","),A=new Set(u);return Wo({definition(p){p.addOption({names:u,arity:a.tolerateBoolean?0:n,hidden:a.hidden,description:a.description,required:a.required})},transformer(p,h,E,w){let D,b=o;typeof a.env<"u"&&w.env[a.env]&&(D=a.env,b=w.env[a.env]);for(let{name:C,value:T}of E.options)A.has(C)&&(D=C,b=T);return typeof b=="string"?ag(D??h,b,a.validator):b}})}function Uqe(t={}){let{required:e=!0}=t;return Wo({definition(r,o){var a;r.addPositional({name:(a=t.name)!==null&&a!==void 0?a:o,required:t.required})},transformer(r,o,a){var n;for(let u=0;u{US();yf()});var de={};Vt(de,{Array:()=>IJ,Boolean:()=>BJ,Counter:()=>DJ,Proxy:()=>qS,Rest:()=>PJ,String:()=>bJ,applyValidator:()=>ag,cleanValidationError:()=>QS,formatError:()=>Iw,isOptionSymbol:()=>Cw,makeCommandOption:()=>Wo,rerouteArguments:()=>Yu});var QJ=It(()=>{yf();CL();wJ();vJ();SJ();xJ();kJ()});var Qw={};Vt(Qw,{Builtins:()=>IL,Cli:()=>Ko,Command:()=>ot,Option:()=>de,UsageError:()=>it,formatMarkdownish:()=>yo,run:()=>pJ,runExit:()=>fJ});var Gt=It(()=>{kS();cL();Xp();gJ();CJ();QJ()});var FJ=_((ckt,_qe)=>{_qe.exports={name:"dotenv",version:"16.3.1",description:"Loads environment variables from .env file",main:"lib/main.js",types:"lib/main.d.ts",exports:{".":{types:"./lib/main.d.ts",require:"./lib/main.js",default:"./lib/main.js"},"./config":"./config.js","./config.js":"./config.js","./lib/env-options":"./lib/env-options.js","./lib/env-options.js":"./lib/env-options.js","./lib/cli-options":"./lib/cli-options.js","./lib/cli-options.js":"./lib/cli-options.js","./package.json":"./package.json"},scripts:{"dts-check":"tsc --project tests/types/tsconfig.json",lint:"standard","lint-readme":"standard-markdown",pretest:"npm run lint && npm run dts-check",test:"tap tests/*.js --100 -Rspec",prerelease:"npm test",release:"standard-version"},repository:{type:"git",url:"git://github.com/motdotla/dotenv.git"},funding:"https://github.com/motdotla/dotenv?sponsor=1",keywords:["dotenv","env",".env","environment","variables","config","settings"],readmeFilename:"README.md",license:"BSD-2-Clause",devDependencies:{"@definitelytyped/dtslint":"^0.0.133","@types/node":"^18.11.3",decache:"^4.6.1",sinon:"^14.0.1",standard:"^17.0.0","standard-markdown":"^7.1.0","standard-version":"^9.5.0",tap:"^16.3.0",tar:"^6.1.11",typescript:"^4.8.4"},engines:{node:">=12"},browser:{fs:!1}}});var NJ=_((ukt,Ef)=>{var RJ=ve("fs"),BL=ve("path"),Hqe=ve("os"),qqe=ve("crypto"),jqe=FJ(),vL=jqe.version,Gqe=/(?:^|^)\s*(?:export\s+)?([\w.-]+)(?:\s*=\s*?|:\s+?)(\s*'(?:\\'|[^'])*'|\s*"(?:\\"|[^"])*"|\s*`(?:\\`|[^`])*`|[^#\r\n]+)?\s*(?:#.*)?(?:$|$)/mg;function Wqe(t){let e={},r=t.toString();r=r.replace(/\r\n?/mg,` -`);let o;for(;(o=Gqe.exec(r))!=null;){let a=o[1],n=o[2]||"";n=n.trim();let u=n[0];n=n.replace(/^(['"`])([\s\S]*)\1$/mg,"$2"),u==='"'&&(n=n.replace(/\\n/g,` -`),n=n.replace(/\\r/g,"\r")),e[a]=n}return e}function Yqe(t){let e=LJ(t),r=vs.configDotenv({path:e});if(!r.parsed)throw new Error(`MISSING_DATA: Cannot parse ${e} for an unknown reason`);let o=TJ(t).split(","),a=o.length,n;for(let u=0;u=a)throw A}return vs.parse(n)}function Vqe(t){console.log(`[dotenv@${vL}][INFO] ${t}`)}function Kqe(t){console.log(`[dotenv@${vL}][WARN] ${t}`)}function wL(t){console.log(`[dotenv@${vL}][DEBUG] ${t}`)}function TJ(t){return t&&t.DOTENV_KEY&&t.DOTENV_KEY.length>0?t.DOTENV_KEY:process.env.DOTENV_KEY&&process.env.DOTENV_KEY.length>0?process.env.DOTENV_KEY:""}function Jqe(t,e){let r;try{r=new URL(e)}catch(A){throw A.code==="ERR_INVALID_URL"?new Error("INVALID_DOTENV_KEY: Wrong format. Must be in valid uri format like dotenv://:key_1234@dotenv.org/vault/.env.vault?environment=development"):A}let o=r.password;if(!o)throw new Error("INVALID_DOTENV_KEY: Missing key part");let a=r.searchParams.get("environment");if(!a)throw new Error("INVALID_DOTENV_KEY: Missing environment part");let n=`DOTENV_VAULT_${a.toUpperCase()}`,u=t.parsed[n];if(!u)throw new Error(`NOT_FOUND_DOTENV_ENVIRONMENT: Cannot locate environment ${n} in your .env.vault file.`);return{ciphertext:u,key:o}}function LJ(t){let e=BL.resolve(process.cwd(),".env");return t&&t.path&&t.path.length>0&&(e=t.path),e.endsWith(".vault")?e:`${e}.vault`}function zqe(t){return t[0]==="~"?BL.join(Hqe.homedir(),t.slice(1)):t}function Xqe(t){Vqe("Loading env from encrypted .env.vault");let e=vs._parseVault(t),r=process.env;return t&&t.processEnv!=null&&(r=t.processEnv),vs.populate(r,e,t),{parsed:e}}function Zqe(t){let e=BL.resolve(process.cwd(),".env"),r="utf8",o=!!(t&&t.debug);t&&(t.path!=null&&(e=zqe(t.path)),t.encoding!=null&&(r=t.encoding));try{let a=vs.parse(RJ.readFileSync(e,{encoding:r})),n=process.env;return t&&t.processEnv!=null&&(n=t.processEnv),vs.populate(n,a,t),{parsed:a}}catch(a){return o&&wL(`Failed to load ${e} ${a.message}`),{error:a}}}function $qe(t){let e=LJ(t);return TJ(t).length===0?vs.configDotenv(t):RJ.existsSync(e)?vs._configVault(t):(Kqe(`You set DOTENV_KEY but you are missing a .env.vault file at ${e}. Did you forget to build it?`),vs.configDotenv(t))}function eje(t,e){let r=Buffer.from(e.slice(-64),"hex"),o=Buffer.from(t,"base64"),a=o.slice(0,12),n=o.slice(-16);o=o.slice(12,-16);try{let u=qqe.createDecipheriv("aes-256-gcm",r,a);return u.setAuthTag(n),`${u.update(o)}${u.final()}`}catch(u){let A=u instanceof RangeError,p=u.message==="Invalid key length",h=u.message==="Unsupported state or unable to authenticate data";if(A||p){let E="INVALID_DOTENV_KEY: It must be 64 characters long (or more)";throw new Error(E)}else if(h){let E="DECRYPTION_FAILED: Please check your DOTENV_KEY";throw new Error(E)}else throw console.error("Error: ",u.code),console.error("Error: ",u.message),u}}function tje(t,e,r={}){let o=!!(r&&r.debug),a=!!(r&&r.override);if(typeof e!="object")throw new Error("OBJECT_REQUIRED: Please check the processEnv argument being passed to populate");for(let n of Object.keys(e))Object.prototype.hasOwnProperty.call(t,n)?(a===!0&&(t[n]=e[n]),o&&wL(a===!0?`"${n}" is already defined and WAS overwritten`:`"${n}" is already defined and was NOT overwritten`)):t[n]=e[n]}var vs={configDotenv:Zqe,_configVault:Xqe,_parseVault:Yqe,config:$qe,decrypt:eje,parse:Wqe,populate:tje};Ef.exports.configDotenv=vs.configDotenv;Ef.exports._configVault=vs._configVault;Ef.exports._parseVault=vs._parseVault;Ef.exports.config=vs.config;Ef.exports.decrypt=vs.decrypt;Ef.exports.parse=vs.parse;Ef.exports.populate=vs.populate;Ef.exports=vs});var MJ=_((Akt,OJ)=>{"use strict";OJ.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var lg=_((fkt,DL)=>{"use strict";var rje=MJ(),UJ=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,o=()=>{r--,e.length>0&&e.shift()()},a=(A,p,...h)=>{r++;let E=rje(A,...h);p(E),E.then(o,o)},n=(A,p,...h)=>{rnew Promise(h=>n(A,h,...p));return Object.defineProperties(u,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),u};DL.exports=UJ;DL.exports.default=UJ});function Ju(t){return`YN${t.toString(10).padStart(4,"0")}`}function jS(t){let e=Number(t.slice(2));if(typeof vr[e]>"u")throw new Error(`Unknown message name: "${t}"`);return e}var vr,GS=It(()=>{vr=(Me=>(Me[Me.UNNAMED=0]="UNNAMED",Me[Me.EXCEPTION=1]="EXCEPTION",Me[Me.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",Me[Me.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",Me[Me.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",Me[Me.BUILD_DISABLED=5]="BUILD_DISABLED",Me[Me.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",Me[Me.MUST_BUILD=7]="MUST_BUILD",Me[Me.MUST_REBUILD=8]="MUST_REBUILD",Me[Me.BUILD_FAILED=9]="BUILD_FAILED",Me[Me.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",Me[Me.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",Me[Me.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",Me[Me.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",Me[Me.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",Me[Me.REMOTE_INVALID=15]="REMOTE_INVALID",Me[Me.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",Me[Me.RESOLUTION_PACK=17]="RESOLUTION_PACK",Me[Me.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",Me[Me.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",Me[Me.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",Me[Me.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",Me[Me.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",Me[Me.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",Me[Me.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",Me[Me.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",Me[Me.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",Me[Me.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",Me[Me.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",Me[Me.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",Me[Me.FETCH_FAILED=30]="FETCH_FAILED",Me[Me.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",Me[Me.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",Me[Me.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",Me[Me.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",Me[Me.NETWORK_ERROR=35]="NETWORK_ERROR",Me[Me.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",Me[Me.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",Me[Me.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",Me[Me.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",Me[Me.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",Me[Me.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",Me[Me.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",Me[Me.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",Me[Me.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",Me[Me.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",Me[Me.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",Me[Me.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",Me[Me.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",Me[Me.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",Me[Me.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",Me[Me.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",Me[Me.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",Me[Me.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",Me[Me.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",Me[Me.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",Me[Me.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",Me[Me.INVALID_MANIFEST=57]="INVALID_MANIFEST",Me[Me.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",Me[Me.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",Me[Me.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",Me[Me.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",Me[Me.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",Me[Me.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",Me[Me.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",Me[Me.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",Me[Me.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",Me[Me.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",Me[Me.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",Me[Me.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",Me[Me.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",Me[Me.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",Me[Me.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",Me[Me.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",Me[Me.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",Me[Me.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",Me[Me.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",Me[Me.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE",Me[Me.RESOLUTION_MISMATCH=78]="RESOLUTION_MISMATCH",Me[Me.PROLOG_LIMIT_EXCEEDED=79]="PROLOG_LIMIT_EXCEEDED",Me[Me.NETWORK_DISABLED=80]="NETWORK_DISABLED",Me[Me.NETWORK_UNSAFE_HTTP=81]="NETWORK_UNSAFE_HTTP",Me[Me.RESOLUTION_FAILED=82]="RESOLUTION_FAILED",Me[Me.AUTOMERGE_GIT_ERROR=83]="AUTOMERGE_GIT_ERROR",Me[Me.CONSTRAINTS_CHECK_FAILED=84]="CONSTRAINTS_CHECK_FAILED",Me[Me.UPDATED_RESOLUTION_RECORD=85]="UPDATED_RESOLUTION_RECORD",Me[Me.EXPLAIN_PEER_DEPENDENCIES_CTA=86]="EXPLAIN_PEER_DEPENDENCIES_CTA",Me[Me.MIGRATION_SUCCESS=87]="MIGRATION_SUCCESS",Me[Me.VERSION_NOTICE=88]="VERSION_NOTICE",Me[Me.TIPS_NOTICE=89]="TIPS_NOTICE",Me[Me.OFFLINE_MODE_ENABLED=90]="OFFLINE_MODE_ENABLED",Me))(vr||{})});var Fw=_((hkt,_J)=>{var nje="2.0.0",ije=Number.MAX_SAFE_INTEGER||9007199254740991,sje=16,oje=250,aje=["major","premajor","minor","preminor","patch","prepatch","prerelease"];_J.exports={MAX_LENGTH:256,MAX_SAFE_COMPONENT_LENGTH:sje,MAX_SAFE_BUILD_LENGTH:oje,MAX_SAFE_INTEGER:ije,RELEASE_TYPES:aje,SEMVER_SPEC_VERSION:nje,FLAG_INCLUDE_PRERELEASE:1,FLAG_LOOSE:2}});var Rw=_((gkt,HJ)=>{var lje=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};HJ.exports=lje});var bm=_((Cf,qJ)=>{var{MAX_SAFE_COMPONENT_LENGTH:SL,MAX_SAFE_BUILD_LENGTH:cje,MAX_LENGTH:uje}=Fw(),Aje=Rw();Cf=qJ.exports={};var fje=Cf.re=[],pje=Cf.safeRe=[],tr=Cf.src=[],rr=Cf.t={},hje=0,PL="[a-zA-Z0-9-]",gje=[["\\s",1],["\\d",uje],[PL,cje]],dje=t=>{for(let[e,r]of gje)t=t.split(`${e}*`).join(`${e}{0,${r}}`).split(`${e}+`).join(`${e}{1,${r}}`);return t},Gr=(t,e,r)=>{let o=dje(e),a=hje++;Aje(t,a,e),rr[t]=a,tr[a]=e,fje[a]=new RegExp(e,r?"g":void 0),pje[a]=new RegExp(o,r?"g":void 0)};Gr("NUMERICIDENTIFIER","0|[1-9]\\d*");Gr("NUMERICIDENTIFIERLOOSE","\\d+");Gr("NONNUMERICIDENTIFIER",`\\d*[a-zA-Z-]${PL}*`);Gr("MAINVERSION",`(${tr[rr.NUMERICIDENTIFIER]})\\.(${tr[rr.NUMERICIDENTIFIER]})\\.(${tr[rr.NUMERICIDENTIFIER]})`);Gr("MAINVERSIONLOOSE",`(${tr[rr.NUMERICIDENTIFIERLOOSE]})\\.(${tr[rr.NUMERICIDENTIFIERLOOSE]})\\.(${tr[rr.NUMERICIDENTIFIERLOOSE]})`);Gr("PRERELEASEIDENTIFIER",`(?:${tr[rr.NUMERICIDENTIFIER]}|${tr[rr.NONNUMERICIDENTIFIER]})`);Gr("PRERELEASEIDENTIFIERLOOSE",`(?:${tr[rr.NUMERICIDENTIFIERLOOSE]}|${tr[rr.NONNUMERICIDENTIFIER]})`);Gr("PRERELEASE",`(?:-(${tr[rr.PRERELEASEIDENTIFIER]}(?:\\.${tr[rr.PRERELEASEIDENTIFIER]})*))`);Gr("PRERELEASELOOSE",`(?:-?(${tr[rr.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${tr[rr.PRERELEASEIDENTIFIERLOOSE]})*))`);Gr("BUILDIDENTIFIER",`${PL}+`);Gr("BUILD",`(?:\\+(${tr[rr.BUILDIDENTIFIER]}(?:\\.${tr[rr.BUILDIDENTIFIER]})*))`);Gr("FULLPLAIN",`v?${tr[rr.MAINVERSION]}${tr[rr.PRERELEASE]}?${tr[rr.BUILD]}?`);Gr("FULL",`^${tr[rr.FULLPLAIN]}$`);Gr("LOOSEPLAIN",`[v=\\s]*${tr[rr.MAINVERSIONLOOSE]}${tr[rr.PRERELEASELOOSE]}?${tr[rr.BUILD]}?`);Gr("LOOSE",`^${tr[rr.LOOSEPLAIN]}$`);Gr("GTLT","((?:<|>)?=?)");Gr("XRANGEIDENTIFIERLOOSE",`${tr[rr.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);Gr("XRANGEIDENTIFIER",`${tr[rr.NUMERICIDENTIFIER]}|x|X|\\*`);Gr("XRANGEPLAIN",`[v=\\s]*(${tr[rr.XRANGEIDENTIFIER]})(?:\\.(${tr[rr.XRANGEIDENTIFIER]})(?:\\.(${tr[rr.XRANGEIDENTIFIER]})(?:${tr[rr.PRERELEASE]})?${tr[rr.BUILD]}?)?)?`);Gr("XRANGEPLAINLOOSE",`[v=\\s]*(${tr[rr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${tr[rr.XRANGEIDENTIFIERLOOSE]})(?:\\.(${tr[rr.XRANGEIDENTIFIERLOOSE]})(?:${tr[rr.PRERELEASELOOSE]})?${tr[rr.BUILD]}?)?)?`);Gr("XRANGE",`^${tr[rr.GTLT]}\\s*${tr[rr.XRANGEPLAIN]}$`);Gr("XRANGELOOSE",`^${tr[rr.GTLT]}\\s*${tr[rr.XRANGEPLAINLOOSE]}$`);Gr("COERCEPLAIN",`(^|[^\\d])(\\d{1,${SL}})(?:\\.(\\d{1,${SL}}))?(?:\\.(\\d{1,${SL}}))?`);Gr("COERCE",`${tr[rr.COERCEPLAIN]}(?:$|[^\\d])`);Gr("COERCEFULL",tr[rr.COERCEPLAIN]+`(?:${tr[rr.PRERELEASE]})?(?:${tr[rr.BUILD]})?(?:$|[^\\d])`);Gr("COERCERTL",tr[rr.COERCE],!0);Gr("COERCERTLFULL",tr[rr.COERCEFULL],!0);Gr("LONETILDE","(?:~>?)");Gr("TILDETRIM",`(\\s*)${tr[rr.LONETILDE]}\\s+`,!0);Cf.tildeTrimReplace="$1~";Gr("TILDE",`^${tr[rr.LONETILDE]}${tr[rr.XRANGEPLAIN]}$`);Gr("TILDELOOSE",`^${tr[rr.LONETILDE]}${tr[rr.XRANGEPLAINLOOSE]}$`);Gr("LONECARET","(?:\\^)");Gr("CARETTRIM",`(\\s*)${tr[rr.LONECARET]}\\s+`,!0);Cf.caretTrimReplace="$1^";Gr("CARET",`^${tr[rr.LONECARET]}${tr[rr.XRANGEPLAIN]}$`);Gr("CARETLOOSE",`^${tr[rr.LONECARET]}${tr[rr.XRANGEPLAINLOOSE]}$`);Gr("COMPARATORLOOSE",`^${tr[rr.GTLT]}\\s*(${tr[rr.LOOSEPLAIN]})$|^$`);Gr("COMPARATOR",`^${tr[rr.GTLT]}\\s*(${tr[rr.FULLPLAIN]})$|^$`);Gr("COMPARATORTRIM",`(\\s*)${tr[rr.GTLT]}\\s*(${tr[rr.LOOSEPLAIN]}|${tr[rr.XRANGEPLAIN]})`,!0);Cf.comparatorTrimReplace="$1$2$3";Gr("HYPHENRANGE",`^\\s*(${tr[rr.XRANGEPLAIN]})\\s+-\\s+(${tr[rr.XRANGEPLAIN]})\\s*$`);Gr("HYPHENRANGELOOSE",`^\\s*(${tr[rr.XRANGEPLAINLOOSE]})\\s+-\\s+(${tr[rr.XRANGEPLAINLOOSE]})\\s*$`);Gr("STAR","(<|>)?=?\\s*\\*");Gr("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$");Gr("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")});var WS=_((dkt,jJ)=>{var mje=Object.freeze({loose:!0}),yje=Object.freeze({}),Eje=t=>t?typeof t!="object"?mje:t:yje;jJ.exports=Eje});var xL=_((mkt,YJ)=>{var GJ=/^[0-9]+$/,WJ=(t,e)=>{let r=GJ.test(t),o=GJ.test(e);return r&&o&&(t=+t,e=+e),t===e?0:r&&!o?-1:o&&!r?1:tWJ(e,t);YJ.exports={compareIdentifiers:WJ,rcompareIdentifiers:Cje}});var Eo=_((ykt,zJ)=>{var YS=Rw(),{MAX_LENGTH:VJ,MAX_SAFE_INTEGER:VS}=Fw(),{safeRe:KJ,t:JJ}=bm(),Ije=WS(),{compareIdentifiers:km}=xL(),bL=class t{constructor(e,r){if(r=Ije(r),e instanceof t){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid version. Must be a string. Got type "${typeof e}".`);if(e.length>VJ)throw new TypeError(`version is longer than ${VJ} characters`);YS("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let o=e.trim().match(r.loose?KJ[JJ.LOOSE]:KJ[JJ.FULL]);if(!o)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+o[1],this.minor=+o[2],this.patch=+o[3],this.major>VS||this.major<0)throw new TypeError("Invalid major version");if(this.minor>VS||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>VS||this.patch<0)throw new TypeError("Invalid patch version");o[4]?this.prerelease=o[4].split(".").map(a=>{if(/^[0-9]+$/.test(a)){let n=+a;if(n>=0&&n=0;)typeof this.prerelease[n]=="number"&&(this.prerelease[n]++,n=-2);if(n===-1){if(r===this.prerelease.join(".")&&o===!1)throw new Error("invalid increment argument: identifier already exists");this.prerelease.push(a)}}if(r){let n=[r,a];o===!1&&(n=[r]),km(this.prerelease[0],r)===0?isNaN(this.prerelease[1])&&(this.prerelease=n):this.prerelease=n}break}default:throw new Error(`invalid increment argument: ${e}`)}return this.raw=this.format(),this.build.length&&(this.raw+=`+${this.build.join(".")}`),this}};zJ.exports=bL});var cg=_((Ekt,ZJ)=>{var XJ=Eo(),wje=(t,e,r=!1)=>{if(t instanceof XJ)return t;try{return new XJ(t,e)}catch(o){if(!r)return null;throw o}};ZJ.exports=wje});var ez=_((Ckt,$J)=>{var Bje=cg(),vje=(t,e)=>{let r=Bje(t,e);return r?r.version:null};$J.exports=vje});var rz=_((Ikt,tz)=>{var Dje=cg(),Sje=(t,e)=>{let r=Dje(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};tz.exports=Sje});var sz=_((wkt,iz)=>{var nz=Eo(),Pje=(t,e,r,o,a)=>{typeof r=="string"&&(a=o,o=r,r=void 0);try{return new nz(t instanceof nz?t.version:t,r).inc(e,o,a).version}catch{return null}};iz.exports=Pje});var lz=_((Bkt,az)=>{var oz=cg(),xje=(t,e)=>{let r=oz(t,null,!0),o=oz(e,null,!0),a=r.compare(o);if(a===0)return null;let n=a>0,u=n?r:o,A=n?o:r,p=!!u.prerelease.length;if(!!A.prerelease.length&&!p)return!A.patch&&!A.minor?"major":u.patch?"patch":u.minor?"minor":"major";let E=p?"pre":"";return r.major!==o.major?E+"major":r.minor!==o.minor?E+"minor":r.patch!==o.patch?E+"patch":"prerelease"};az.exports=xje});var uz=_((vkt,cz)=>{var bje=Eo(),kje=(t,e)=>new bje(t,e).major;cz.exports=kje});var fz=_((Dkt,Az)=>{var Qje=Eo(),Fje=(t,e)=>new Qje(t,e).minor;Az.exports=Fje});var hz=_((Skt,pz)=>{var Rje=Eo(),Tje=(t,e)=>new Rje(t,e).patch;pz.exports=Tje});var dz=_((Pkt,gz)=>{var Lje=cg(),Nje=(t,e)=>{let r=Lje(t,e);return r&&r.prerelease.length?r.prerelease:null};gz.exports=Nje});var Ml=_((xkt,yz)=>{var mz=Eo(),Oje=(t,e,r)=>new mz(t,r).compare(new mz(e,r));yz.exports=Oje});var Cz=_((bkt,Ez)=>{var Mje=Ml(),Uje=(t,e,r)=>Mje(e,t,r);Ez.exports=Uje});var wz=_((kkt,Iz)=>{var _je=Ml(),Hje=(t,e)=>_je(t,e,!0);Iz.exports=Hje});var KS=_((Qkt,vz)=>{var Bz=Eo(),qje=(t,e,r)=>{let o=new Bz(t,r),a=new Bz(e,r);return o.compare(a)||o.compareBuild(a)};vz.exports=qje});var Sz=_((Fkt,Dz)=>{var jje=KS(),Gje=(t,e)=>t.sort((r,o)=>jje(r,o,e));Dz.exports=Gje});var xz=_((Rkt,Pz)=>{var Wje=KS(),Yje=(t,e)=>t.sort((r,o)=>Wje(o,r,e));Pz.exports=Yje});var Tw=_((Tkt,bz)=>{var Vje=Ml(),Kje=(t,e,r)=>Vje(t,e,r)>0;bz.exports=Kje});var JS=_((Lkt,kz)=>{var Jje=Ml(),zje=(t,e,r)=>Jje(t,e,r)<0;kz.exports=zje});var kL=_((Nkt,Qz)=>{var Xje=Ml(),Zje=(t,e,r)=>Xje(t,e,r)===0;Qz.exports=Zje});var QL=_((Okt,Fz)=>{var $je=Ml(),eGe=(t,e,r)=>$je(t,e,r)!==0;Fz.exports=eGe});var zS=_((Mkt,Rz)=>{var tGe=Ml(),rGe=(t,e,r)=>tGe(t,e,r)>=0;Rz.exports=rGe});var XS=_((Ukt,Tz)=>{var nGe=Ml(),iGe=(t,e,r)=>nGe(t,e,r)<=0;Tz.exports=iGe});var FL=_((_kt,Lz)=>{var sGe=kL(),oGe=QL(),aGe=Tw(),lGe=zS(),cGe=JS(),uGe=XS(),AGe=(t,e,r,o)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return sGe(t,r,o);case"!=":return oGe(t,r,o);case">":return aGe(t,r,o);case">=":return lGe(t,r,o);case"<":return cGe(t,r,o);case"<=":return uGe(t,r,o);default:throw new TypeError(`Invalid operator: ${e}`)}};Lz.exports=AGe});var Oz=_((Hkt,Nz)=>{var fGe=Eo(),pGe=cg(),{safeRe:ZS,t:$S}=bm(),hGe=(t,e)=>{if(t instanceof fGe)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(e.includePrerelease?ZS[$S.COERCEFULL]:ZS[$S.COERCE]);else{let p=e.includePrerelease?ZS[$S.COERCERTLFULL]:ZS[$S.COERCERTL],h;for(;(h=p.exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||h.index+h[0].length!==r.index+r[0].length)&&(r=h),p.lastIndex=h.index+h[1].length+h[2].length;p.lastIndex=-1}if(r===null)return null;let o=r[2],a=r[3]||"0",n=r[4]||"0",u=e.includePrerelease&&r[5]?`-${r[5]}`:"",A=e.includePrerelease&&r[6]?`+${r[6]}`:"";return pGe(`${o}.${a}.${n}${u}${A}`,e)};Nz.exports=hGe});var Uz=_((qkt,Mz)=>{"use strict";Mz.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var eP=_((jkt,_z)=>{"use strict";_z.exports=xn;xn.Node=ug;xn.create=xn;function xn(t){var e=this;if(e instanceof xn||(e=new xn),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(a){e.push(a)});else if(arguments.length>0)for(var r=0,o=arguments.length;r1)r=e;else if(this.head)o=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=0;o!==null;a++)r=t(r,o.value,a),o=o.next;return r};xn.prototype.reduceReverse=function(t,e){var r,o=this.tail;if(arguments.length>1)r=e;else if(this.tail)o=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var a=this.length-1;o!==null;a--)r=t(r,o.value,a),o=o.prev;return r};xn.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};xn.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};xn.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new xn;if(ethis.length&&(e=this.length);for(var o=0,a=this.head;a!==null&&othis.length&&(e=this.length);for(var o=this.length,a=this.tail;a!==null&&o>e;o--)a=a.prev;for(;a!==null&&o>t;o--,a=a.prev)r.push(a.value);return r};xn.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var o=0,a=this.head;a!==null&&o{"use strict";var yGe=eP(),Ag=Symbol("max"),wf=Symbol("length"),Qm=Symbol("lengthCalculator"),Nw=Symbol("allowStale"),fg=Symbol("maxAge"),If=Symbol("dispose"),Hz=Symbol("noDisposeOnSet"),Ds=Symbol("lruList"),Gc=Symbol("cache"),jz=Symbol("updateAgeOnGet"),RL=()=>1,LL=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[Ag]=e.max||1/0,o=e.length||RL;if(this[Qm]=typeof o!="function"?RL:o,this[Nw]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[fg]=e.maxAge||0,this[If]=e.dispose,this[Hz]=e.noDisposeOnSet||!1,this[jz]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Ag]=e||1/0,Lw(this)}get max(){return this[Ag]}set allowStale(e){this[Nw]=!!e}get allowStale(){return this[Nw]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[fg]=e,Lw(this)}get maxAge(){return this[fg]}set lengthCalculator(e){typeof e!="function"&&(e=RL),e!==this[Qm]&&(this[Qm]=e,this[wf]=0,this[Ds].forEach(r=>{r.length=this[Qm](r.value,r.key),this[wf]+=r.length})),Lw(this)}get lengthCalculator(){return this[Qm]}get length(){return this[wf]}get itemCount(){return this[Ds].length}rforEach(e,r){r=r||this;for(let o=this[Ds].tail;o!==null;){let a=o.prev;qz(this,e,o,r),o=a}}forEach(e,r){r=r||this;for(let o=this[Ds].head;o!==null;){let a=o.next;qz(this,e,o,r),o=a}}keys(){return this[Ds].toArray().map(e=>e.key)}values(){return this[Ds].toArray().map(e=>e.value)}reset(){this[If]&&this[Ds]&&this[Ds].length&&this[Ds].forEach(e=>this[If](e.key,e.value)),this[Gc]=new Map,this[Ds]=new yGe,this[wf]=0}dump(){return this[Ds].map(e=>tP(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[Ds]}set(e,r,o){if(o=o||this[fg],o&&typeof o!="number")throw new TypeError("maxAge must be a number");let a=o?Date.now():0,n=this[Qm](r,e);if(this[Gc].has(e)){if(n>this[Ag])return Fm(this,this[Gc].get(e)),!1;let p=this[Gc].get(e).value;return this[If]&&(this[Hz]||this[If](e,p.value)),p.now=a,p.maxAge=o,p.value=r,this[wf]+=n-p.length,p.length=n,this.get(e),Lw(this),!0}let u=new NL(e,r,n,a,o);return u.length>this[Ag]?(this[If]&&this[If](e,r),!1):(this[wf]+=u.length,this[Ds].unshift(u),this[Gc].set(e,this[Ds].head),Lw(this),!0)}has(e){if(!this[Gc].has(e))return!1;let r=this[Gc].get(e).value;return!tP(this,r)}get(e){return TL(this,e,!0)}peek(e){return TL(this,e,!1)}pop(){let e=this[Ds].tail;return e?(Fm(this,e),e.value):null}del(e){Fm(this,this[Gc].get(e))}load(e){this.reset();let r=Date.now();for(let o=e.length-1;o>=0;o--){let a=e[o],n=a.e||0;if(n===0)this.set(a.k,a.v);else{let u=n-r;u>0&&this.set(a.k,a.v,u)}}}prune(){this[Gc].forEach((e,r)=>TL(this,r,!1))}},TL=(t,e,r)=>{let o=t[Gc].get(e);if(o){let a=o.value;if(tP(t,a)){if(Fm(t,o),!t[Nw])return}else r&&(t[jz]&&(o.value.now=Date.now()),t[Ds].unshiftNode(o));return a.value}},tP=(t,e)=>{if(!e||!e.maxAge&&!t[fg])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[fg]&&r>t[fg]},Lw=t=>{if(t[wf]>t[Ag])for(let e=t[Ds].tail;t[wf]>t[Ag]&&e!==null;){let r=e.prev;Fm(t,e),e=r}},Fm=(t,e)=>{if(e){let r=e.value;t[If]&&t[If](r.key,r.value),t[wf]-=r.length,t[Gc].delete(r.key),t[Ds].removeNode(e)}},NL=class{constructor(e,r,o,a,n){this.key=e,this.value=r,this.length=o,this.now=a,this.maxAge=n||0}},qz=(t,e,r,o)=>{let a=r.value;tP(t,a)&&(Fm(t,r),t[Nw]||(a=void 0)),a&&e.call(o,a.value,a.key,t)};Gz.exports=LL});var Ul=_((Wkt,Jz)=>{var OL=class t{constructor(e,r){if(r=CGe(r),e instanceof t)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new t(e.raw,r);if(e instanceof ML)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e.trim().split(/\s+/).join(" "),this.set=this.raw.split("||").map(o=>this.parseRange(o.trim())).filter(o=>o.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${this.raw}`);if(this.set.length>1){let o=this.set[0];if(this.set=this.set.filter(a=>!Vz(a[0])),this.set.length===0)this.set=[o];else if(this.set.length>1){for(let a of this.set)if(a.length===1&&PGe(a[0])){this.set=[a];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){let o=((this.options.includePrerelease&&DGe)|(this.options.loose&&SGe))+":"+e,a=Yz.get(o);if(a)return a;let n=this.options.loose,u=n?xa[Jo.HYPHENRANGELOOSE]:xa[Jo.HYPHENRANGE];e=e.replace(u,OGe(this.options.includePrerelease)),gi("hyphen replace",e),e=e.replace(xa[Jo.COMPARATORTRIM],wGe),gi("comparator trim",e),e=e.replace(xa[Jo.TILDETRIM],BGe),gi("tilde trim",e),e=e.replace(xa[Jo.CARETTRIM],vGe),gi("caret trim",e);let A=e.split(" ").map(w=>xGe(w,this.options)).join(" ").split(/\s+/).map(w=>NGe(w,this.options));n&&(A=A.filter(w=>(gi("loose invalid filter",w,this.options),!!w.match(xa[Jo.COMPARATORLOOSE])))),gi("range list",A);let p=new Map,h=A.map(w=>new ML(w,this.options));for(let w of h){if(Vz(w))return[w];p.set(w.value,w)}p.size>1&&p.has("")&&p.delete("");let E=[...p.values()];return Yz.set(o,E),E}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Range is required");return this.set.some(o=>Kz(o,r)&&e.set.some(a=>Kz(a,r)&&o.every(n=>a.every(u=>n.intersects(u,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new IGe(e,this.options)}catch{return!1}for(let r=0;rt.value==="<0.0.0-0",PGe=t=>t.value==="",Kz=(t,e)=>{let r=!0,o=t.slice(),a=o.pop();for(;r&&o.length;)r=o.every(n=>a.intersects(n,e)),a=o.pop();return r},xGe=(t,e)=>(gi("comp",t,e),t=QGe(t,e),gi("caret",t),t=bGe(t,e),gi("tildes",t),t=RGe(t,e),gi("xrange",t),t=LGe(t,e),gi("stars",t),t),zo=t=>!t||t.toLowerCase()==="x"||t==="*",bGe=(t,e)=>t.trim().split(/\s+/).map(r=>kGe(r,e)).join(" "),kGe=(t,e)=>{let r=e.loose?xa[Jo.TILDELOOSE]:xa[Jo.TILDE];return t.replace(r,(o,a,n,u,A)=>{gi("tilde",t,o,a,n,u,A);let p;return zo(a)?p="":zo(n)?p=`>=${a}.0.0 <${+a+1}.0.0-0`:zo(u)?p=`>=${a}.${n}.0 <${a}.${+n+1}.0-0`:A?(gi("replaceTilde pr",A),p=`>=${a}.${n}.${u}-${A} <${a}.${+n+1}.0-0`):p=`>=${a}.${n}.${u} <${a}.${+n+1}.0-0`,gi("tilde return",p),p})},QGe=(t,e)=>t.trim().split(/\s+/).map(r=>FGe(r,e)).join(" "),FGe=(t,e)=>{gi("caret",t,e);let r=e.loose?xa[Jo.CARETLOOSE]:xa[Jo.CARET],o=e.includePrerelease?"-0":"";return t.replace(r,(a,n,u,A,p)=>{gi("caret",t,a,n,u,A,p);let h;return zo(n)?h="":zo(u)?h=`>=${n}.0.0${o} <${+n+1}.0.0-0`:zo(A)?n==="0"?h=`>=${n}.${u}.0${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.0${o} <${+n+1}.0.0-0`:p?(gi("replaceCaret pr",p),n==="0"?u==="0"?h=`>=${n}.${u}.${A}-${p} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}-${p} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A}-${p} <${+n+1}.0.0-0`):(gi("no pr"),n==="0"?u==="0"?h=`>=${n}.${u}.${A}${o} <${n}.${u}.${+A+1}-0`:h=`>=${n}.${u}.${A}${o} <${n}.${+u+1}.0-0`:h=`>=${n}.${u}.${A} <${+n+1}.0.0-0`),gi("caret return",h),h})},RGe=(t,e)=>(gi("replaceXRanges",t,e),t.split(/\s+/).map(r=>TGe(r,e)).join(" ")),TGe=(t,e)=>{t=t.trim();let r=e.loose?xa[Jo.XRANGELOOSE]:xa[Jo.XRANGE];return t.replace(r,(o,a,n,u,A,p)=>{gi("xRange",t,o,a,n,u,A,p);let h=zo(n),E=h||zo(u),w=E||zo(A),D=w;return a==="="&&D&&(a=""),p=e.includePrerelease?"-0":"",h?a===">"||a==="<"?o="<0.0.0-0":o="*":a&&D?(E&&(u=0),A=0,a===">"?(a=">=",E?(n=+n+1,u=0,A=0):(u=+u+1,A=0)):a==="<="&&(a="<",E?n=+n+1:u=+u+1),a==="<"&&(p="-0"),o=`${a+n}.${u}.${A}${p}`):E?o=`>=${n}.0.0${p} <${+n+1}.0.0-0`:w&&(o=`>=${n}.${u}.0${p} <${n}.${+u+1}.0-0`),gi("xRange return",o),o})},LGe=(t,e)=>(gi("replaceStars",t,e),t.trim().replace(xa[Jo.STAR],"")),NGe=(t,e)=>(gi("replaceGTE0",t,e),t.trim().replace(xa[e.includePrerelease?Jo.GTE0PRE:Jo.GTE0],"")),OGe=t=>(e,r,o,a,n,u,A,p,h,E,w,D,b)=>(zo(o)?r="":zo(a)?r=`>=${o}.0.0${t?"-0":""}`:zo(n)?r=`>=${o}.${a}.0${t?"-0":""}`:u?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,zo(h)?p="":zo(E)?p=`<${+h+1}.0.0-0`:zo(w)?p=`<${h}.${+E+1}.0-0`:D?p=`<=${h}.${E}.${w}-${D}`:t?p=`<${h}.${E}.${+w+1}-0`:p=`<=${p}`,`${r} ${p}`.trim()),MGe=(t,e,r)=>{for(let o=0;o0){let a=t[o].semver;if(a.major===e.major&&a.minor===e.minor&&a.patch===e.patch)return!0}return!1}return!0}});var Ow=_((Ykt,tX)=>{var Mw=Symbol("SemVer ANY"),HL=class t{static get ANY(){return Mw}constructor(e,r){if(r=zz(r),e instanceof t){if(e.loose===!!r.loose)return e;e=e.value}e=e.trim().split(/\s+/).join(" "),_L("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===Mw?this.value="":this.value=this.operator+this.semver.version,_L("comp",this)}parse(e){let r=this.options.loose?Xz[Zz.COMPARATORLOOSE]:Xz[Zz.COMPARATOR],o=e.match(r);if(!o)throw new TypeError(`Invalid comparator: ${e}`);this.operator=o[1]!==void 0?o[1]:"",this.operator==="="&&(this.operator=""),o[2]?this.semver=new $z(o[2],this.options.loose):this.semver=Mw}toString(){return this.value}test(e){if(_L("Comparator.test",e,this.options.loose),this.semver===Mw||e===Mw)return!0;if(typeof e=="string")try{e=new $z(e,this.options)}catch{return!1}return UL(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof t))throw new TypeError("a Comparator is required");return this.operator===""?this.value===""?!0:new eX(e.value,r).test(this.value):e.operator===""?e.value===""?!0:new eX(this.value,r).test(e.semver):(r=zz(r),r.includePrerelease&&(this.value==="<0.0.0-0"||e.value==="<0.0.0-0")||!r.includePrerelease&&(this.value.startsWith("<0.0.0")||e.value.startsWith("<0.0.0"))?!1:!!(this.operator.startsWith(">")&&e.operator.startsWith(">")||this.operator.startsWith("<")&&e.operator.startsWith("<")||this.semver.version===e.semver.version&&this.operator.includes("=")&&e.operator.includes("=")||UL(this.semver,"<",e.semver,r)&&this.operator.startsWith(">")&&e.operator.startsWith("<")||UL(this.semver,">",e.semver,r)&&this.operator.startsWith("<")&&e.operator.startsWith(">")))}};tX.exports=HL;var zz=WS(),{safeRe:Xz,t:Zz}=bm(),UL=FL(),_L=Rw(),$z=Eo(),eX=Ul()});var Uw=_((Vkt,rX)=>{var UGe=Ul(),_Ge=(t,e,r)=>{try{e=new UGe(e,r)}catch{return!1}return e.test(t)};rX.exports=_Ge});var iX=_((Kkt,nX)=>{var HGe=Ul(),qGe=(t,e)=>new HGe(t,e).set.map(r=>r.map(o=>o.value).join(" ").trim().split(" "));nX.exports=qGe});var oX=_((Jkt,sX)=>{var jGe=Eo(),GGe=Ul(),WGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new GGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===-1)&&(o=u,a=new jGe(o,r))}),o};sX.exports=WGe});var lX=_((zkt,aX)=>{var YGe=Eo(),VGe=Ul(),KGe=(t,e,r)=>{let o=null,a=null,n=null;try{n=new VGe(e,r)}catch{return null}return t.forEach(u=>{n.test(u)&&(!o||a.compare(u)===1)&&(o=u,a=new YGe(o,r))}),o};aX.exports=KGe});var AX=_((Xkt,uX)=>{var qL=Eo(),JGe=Ul(),cX=Tw(),zGe=(t,e)=>{t=new JGe(t,e);let r=new qL("0.0.0");if(t.test(r)||(r=new qL("0.0.0-0"),t.test(r)))return r;r=null;for(let o=0;o{let A=new qL(u.semver.version);switch(u.operator){case">":A.prerelease.length===0?A.patch++:A.prerelease.push(0),A.raw=A.format();case"":case">=":(!n||cX(A,n))&&(n=A);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${u.operator}`)}}),n&&(!r||cX(r,n))&&(r=n)}return r&&t.test(r)?r:null};uX.exports=zGe});var pX=_((Zkt,fX)=>{var XGe=Ul(),ZGe=(t,e)=>{try{return new XGe(t,e).range||"*"}catch{return null}};fX.exports=ZGe});var rP=_(($kt,mX)=>{var $Ge=Eo(),dX=Ow(),{ANY:e5e}=dX,t5e=Ul(),r5e=Uw(),hX=Tw(),gX=JS(),n5e=XS(),i5e=zS(),s5e=(t,e,r,o)=>{t=new $Ge(t,o),e=new t5e(e,o);let a,n,u,A,p;switch(r){case">":a=hX,n=n5e,u=gX,A=">",p=">=";break;case"<":a=gX,n=i5e,u=hX,A="<",p="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(r5e(t,e,o))return!1;for(let h=0;h{b.semver===e5e&&(b=new dX(">=0.0.0")),w=w||b,D=D||b,a(b.semver,w.semver,o)?w=b:u(b.semver,D.semver,o)&&(D=b)}),w.operator===A||w.operator===p||(!D.operator||D.operator===A)&&n(t,D.semver))return!1;if(D.operator===p&&u(t,D.semver))return!1}return!0};mX.exports=s5e});var EX=_((eQt,yX)=>{var o5e=rP(),a5e=(t,e,r)=>o5e(t,e,">",r);yX.exports=a5e});var IX=_((tQt,CX)=>{var l5e=rP(),c5e=(t,e,r)=>l5e(t,e,"<",r);CX.exports=c5e});var vX=_((rQt,BX)=>{var wX=Ul(),u5e=(t,e,r)=>(t=new wX(t,r),e=new wX(e,r),t.intersects(e,r));BX.exports=u5e});var SX=_((nQt,DX)=>{var A5e=Uw(),f5e=Ml();DX.exports=(t,e,r)=>{let o=[],a=null,n=null,u=t.sort((E,w)=>f5e(E,w,r));for(let E of u)A5e(E,e,r)?(n=E,a||(a=E)):(n&&o.push([a,n]),n=null,a=null);a&&o.push([a,null]);let A=[];for(let[E,w]of o)E===w?A.push(E):!w&&E===u[0]?A.push("*"):w?E===u[0]?A.push(`<=${w}`):A.push(`${E} - ${w}`):A.push(`>=${E}`);let p=A.join(" || "),h=typeof e.raw=="string"?e.raw:String(e);return p.length{var PX=Ul(),WL=Ow(),{ANY:jL}=WL,_w=Uw(),YL=Ml(),p5e=(t,e,r={})=>{if(t===e)return!0;t=new PX(t,r),e=new PX(e,r);let o=!1;e:for(let a of t.set){for(let n of e.set){let u=g5e(a,n,r);if(o=o||u!==null,u)continue e}if(o)return!1}return!0},h5e=[new WL(">=0.0.0-0")],xX=[new WL(">=0.0.0")],g5e=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===jL){if(e.length===1&&e[0].semver===jL)return!0;r.includePrerelease?t=h5e:t=xX}if(e.length===1&&e[0].semver===jL){if(r.includePrerelease)return!0;e=xX}let o=new Set,a,n;for(let b of t)b.operator===">"||b.operator===">="?a=bX(a,b,r):b.operator==="<"||b.operator==="<="?n=kX(n,b,r):o.add(b.semver);if(o.size>1)return null;let u;if(a&&n){if(u=YL(a.semver,n.semver,r),u>0)return null;if(u===0&&(a.operator!==">="||n.operator!=="<="))return null}for(let b of o){if(a&&!_w(b,String(a),r)||n&&!_w(b,String(n),r))return null;for(let C of e)if(!_w(b,String(C),r))return!1;return!0}let A,p,h,E,w=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1,D=a&&!r.includePrerelease&&a.semver.prerelease.length?a.semver:!1;w&&w.prerelease.length===1&&n.operator==="<"&&w.prerelease[0]===0&&(w=!1);for(let b of e){if(E=E||b.operator===">"||b.operator===">=",h=h||b.operator==="<"||b.operator==="<=",a){if(D&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===D.major&&b.semver.minor===D.minor&&b.semver.patch===D.patch&&(D=!1),b.operator===">"||b.operator===">="){if(A=bX(a,b,r),A===b&&A!==a)return!1}else if(a.operator===">="&&!_w(a.semver,String(b),r))return!1}if(n){if(w&&b.semver.prerelease&&b.semver.prerelease.length&&b.semver.major===w.major&&b.semver.minor===w.minor&&b.semver.patch===w.patch&&(w=!1),b.operator==="<"||b.operator==="<="){if(p=kX(n,b,r),p===b&&p!==n)return!1}else if(n.operator==="<="&&!_w(n.semver,String(b),r))return!1}if(!b.operator&&(n||a)&&u!==0)return!1}return!(a&&h&&!n&&u!==0||n&&E&&!a&&u!==0||D||w)},bX=(t,e,r)=>{if(!t)return e;let o=YL(t.semver,e.semver,r);return o>0?t:o<0||e.operator===">"&&t.operator===">="?e:t},kX=(t,e,r)=>{if(!t)return e;let o=YL(t.semver,e.semver,r);return o<0?t:o>0||e.operator==="<"&&t.operator==="<="?e:t};QX.exports=p5e});var ni=_((sQt,LX)=>{var VL=bm(),RX=Fw(),d5e=Eo(),TX=xL(),m5e=cg(),y5e=ez(),E5e=rz(),C5e=sz(),I5e=lz(),w5e=uz(),B5e=fz(),v5e=hz(),D5e=dz(),S5e=Ml(),P5e=Cz(),x5e=wz(),b5e=KS(),k5e=Sz(),Q5e=xz(),F5e=Tw(),R5e=JS(),T5e=kL(),L5e=QL(),N5e=zS(),O5e=XS(),M5e=FL(),U5e=Oz(),_5e=Ow(),H5e=Ul(),q5e=Uw(),j5e=iX(),G5e=oX(),W5e=lX(),Y5e=AX(),V5e=pX(),K5e=rP(),J5e=EX(),z5e=IX(),X5e=vX(),Z5e=SX(),$5e=FX();LX.exports={parse:m5e,valid:y5e,clean:E5e,inc:C5e,diff:I5e,major:w5e,minor:B5e,patch:v5e,prerelease:D5e,compare:S5e,rcompare:P5e,compareLoose:x5e,compareBuild:b5e,sort:k5e,rsort:Q5e,gt:F5e,lt:R5e,eq:T5e,neq:L5e,gte:N5e,lte:O5e,cmp:M5e,coerce:U5e,Comparator:_5e,Range:H5e,satisfies:q5e,toComparators:j5e,maxSatisfying:G5e,minSatisfying:W5e,minVersion:Y5e,validRange:V5e,outside:K5e,gtr:J5e,ltr:z5e,intersects:X5e,simplifyRange:Z5e,subset:$5e,SemVer:d5e,re:VL.re,src:VL.src,tokens:VL.t,SEMVER_SPEC_VERSION:RX.SEMVER_SPEC_VERSION,RELEASE_TYPES:RX.RELEASE_TYPES,compareIdentifiers:TX.compareIdentifiers,rcompareIdentifiers:TX.rcompareIdentifiers}});var OX=_((oQt,NX)=>{"use strict";function e9e(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function pg(t,e,r,o){this.message=t,this.expected=e,this.found=r,this.location=o,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,pg)}e9e(pg,Error);pg.buildMessage=function(t,e){var r={literal:function(h){return'"'+a(h.text)+'"'},class:function(h){var E="",w;for(w=0;w0){for(w=1,D=1;w{switch(Fe[1]){case"|":return be|Fe[3];case"&":return be&Fe[3];case"^":return be^Fe[3]}},$)},D="!",b=Le("!",!1),C=function($){return!$},T="(",N=Le("(",!1),U=")",J=Le(")",!1),te=function($){return $},le=/^[^ \t\n\r()!|&\^]/,ce=Te([" "," ",` -`,"\r","(",")","!","|","&","^"],!0,!1),ue=function($){return e.queryPattern.test($)},Ie=function($){return e.checkFn($)},he=xe("whitespace"),De=/^[ \t\n\r]/,Ee=Te([" "," ",` -`,"\r"],!1,!1),g=0,me=0,Ce=[{line:1,column:1}],fe=0,ie=[],Z=0,Se;if("startRule"in e){if(!(e.startRule in o))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');a=o[e.startRule]}function Re(){return t.substring(me,g)}function ht(){return He(me,g)}function q($,se){throw se=se!==void 0?se:He(me,g),P([xe($)],t.substring(me,g),se)}function nt($,se){throw se=se!==void 0?se:He(me,g),I($,se)}function Le($,se){return{type:"literal",text:$,ignoreCase:se}}function Te($,se,be){return{type:"class",parts:$,inverted:se,ignoreCase:be}}function ke(){return{type:"any"}}function Ke(){return{type:"end"}}function xe($){return{type:"other",description:$}}function tt($){var se=Ce[$],be;if(se)return se;for(be=$-1;!Ce[be];)be--;for(se=Ce[be],se={line:se.line,column:se.column};be<$;)t.charCodeAt(be)===10?(se.line++,se.column=1):se.column++,be++;return Ce[$]=se,se}function He($,se){var be=tt($),Fe=tt(se);return{start:{offset:$,line:be.line,column:be.column},end:{offset:se,line:Fe.line,column:Fe.column}}}function x($){gfe&&(fe=g,ie=[]),ie.push($))}function I($,se){return new pg($,null,null,se)}function P($,se,be){return new pg(pg.buildMessage($,se),$,se,be)}function y(){var $,se,be,Fe,lt,Et,qt,nr;if($=g,se=R(),se!==r){for(be=[],Fe=g,lt=X(),lt!==r?(t.charCodeAt(g)===124?(Et=n,g++):(Et=r,Z===0&&x(u)),Et===r&&(t.charCodeAt(g)===38?(Et=A,g++):(Et=r,Z===0&&x(p)),Et===r&&(t.charCodeAt(g)===94?(Et=h,g++):(Et=r,Z===0&&x(E)))),Et!==r?(qt=X(),qt!==r?(nr=R(),nr!==r?(lt=[lt,Et,qt,nr],Fe=lt):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r);Fe!==r;)be.push(Fe),Fe=g,lt=X(),lt!==r?(t.charCodeAt(g)===124?(Et=n,g++):(Et=r,Z===0&&x(u)),Et===r&&(t.charCodeAt(g)===38?(Et=A,g++):(Et=r,Z===0&&x(p)),Et===r&&(t.charCodeAt(g)===94?(Et=h,g++):(Et=r,Z===0&&x(E)))),Et!==r?(qt=X(),qt!==r?(nr=R(),nr!==r?(lt=[lt,Et,qt,nr],Fe=lt):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r)):(g=Fe,Fe=r);be!==r?(me=$,se=w(se,be),$=se):(g=$,$=r)}else g=$,$=r;return $}function R(){var $,se,be,Fe,lt,Et;return $=g,t.charCodeAt(g)===33?(se=D,g++):(se=r,Z===0&&x(b)),se!==r?(be=R(),be!==r?(me=$,se=C(be),$=se):(g=$,$=r)):(g=$,$=r),$===r&&($=g,t.charCodeAt(g)===40?(se=T,g++):(se=r,Z===0&&x(N)),se!==r?(be=X(),be!==r?(Fe=y(),Fe!==r?(lt=X(),lt!==r?(t.charCodeAt(g)===41?(Et=U,g++):(Et=r,Z===0&&x(J)),Et!==r?(me=$,se=te(Fe),$=se):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r)):(g=$,$=r),$===r&&($=z())),$}function z(){var $,se,be,Fe,lt;if($=g,se=X(),se!==r){if(be=g,Fe=[],le.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,Z===0&&x(ce)),lt!==r)for(;lt!==r;)Fe.push(lt),le.test(t.charAt(g))?(lt=t.charAt(g),g++):(lt=r,Z===0&&x(ce));else Fe=r;Fe!==r?be=t.substring(be,g):be=Fe,be!==r?(me=g,Fe=ue(be),Fe?Fe=void 0:Fe=r,Fe!==r?(me=$,se=Ie(be),$=se):(g=$,$=r)):(g=$,$=r)}else g=$,$=r;return $}function X(){var $,se;for(Z++,$=[],De.test(t.charAt(g))?(se=t.charAt(g),g++):(se=r,Z===0&&x(Ee));se!==r;)$.push(se),De.test(t.charAt(g))?(se=t.charAt(g),g++):(se=r,Z===0&&x(Ee));return Z--,$===r&&(se=r,Z===0&&x(he)),$}if(Se=a(),Se!==r&&g===t.length)return Se;throw Se!==r&&g{var{parse:r9e}=OX();nP.makeParser=(t=/[a-z]+/)=>(e,r)=>r9e(e,{queryPattern:t,checkFn:r});nP.parse=nP.makeParser()});var _X=_((lQt,UX)=>{"use strict";UX.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var KL=_((cQt,qX)=>{var Hw=_X(),HX={};for(let t of Object.keys(Hw))HX[Hw[t]]=t;var fr={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};qX.exports=fr;for(let t of Object.keys(fr)){if(!("channels"in fr[t]))throw new Error("missing channels property: "+t);if(!("labels"in fr[t]))throw new Error("missing channel labels property: "+t);if(fr[t].labels.length!==fr[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=fr[t];delete fr[t].channels,delete fr[t].labels,Object.defineProperty(fr[t],"channels",{value:e}),Object.defineProperty(fr[t],"labels",{value:r})}fr.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(e,r,o),n=Math.max(e,r,o),u=n-a,A,p;n===a?A=0:e===n?A=(r-o)/u:r===n?A=2+(o-e)/u:o===n&&(A=4+(e-r)/u),A=Math.min(A*60,360),A<0&&(A+=360);let h=(a+n)/2;return n===a?p=0:h<=.5?p=u/(n+a):p=u/(2-n-a),[A,p*100,h*100]};fr.rgb.hsv=function(t){let e,r,o,a,n,u=t[0]/255,A=t[1]/255,p=t[2]/255,h=Math.max(u,A,p),E=h-Math.min(u,A,p),w=function(D){return(h-D)/6/E+1/2};return E===0?(a=0,n=0):(n=E/h,e=w(u),r=w(A),o=w(p),u===h?a=o-r:A===h?a=1/3+e-o:p===h&&(a=2/3+r-e),a<0?a+=1:a>1&&(a-=1)),[a*360,n*100,h*100]};fr.rgb.hwb=function(t){let e=t[0],r=t[1],o=t[2],a=fr.rgb.hsl(t)[0],n=1/255*Math.min(e,Math.min(r,o));return o=1-1/255*Math.max(e,Math.max(r,o)),[a,n*100,o*100]};fr.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(1-e,1-r,1-o),n=(1-e-a)/(1-a)||0,u=(1-r-a)/(1-a)||0,A=(1-o-a)/(1-a)||0;return[n*100,u*100,A*100,a*100]};function n9e(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}fr.rgb.keyword=function(t){let e=HX[t];if(e)return e;let r=1/0,o;for(let a of Object.keys(Hw)){let n=Hw[a],u=n9e(t,n);u.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,o=o>.04045?((o+.055)/1.055)**2.4:o/12.92;let a=e*.4124+r*.3576+o*.1805,n=e*.2126+r*.7152+o*.0722,u=e*.0193+r*.1192+o*.9505;return[a*100,n*100,u*100]};fr.rgb.lab=function(t){let e=fr.rgb.xyz(t),r=e[0],o=e[1],a=e[2];r/=95.047,o/=100,a/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116,a=a>.008856?a**(1/3):7.787*a+16/116;let n=116*o-16,u=500*(r-o),A=200*(o-a);return[n,u,A]};fr.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a,n,u;if(r===0)return u=o*255,[u,u,u];o<.5?a=o*(1+r):a=o+r-o*r;let A=2*o-a,p=[0,0,0];for(let h=0;h<3;h++)n=e+1/3*-(h-1),n<0&&n++,n>1&&n--,6*n<1?u=A+(a-A)*6*n:2*n<1?u=a:3*n<2?u=A+(a-A)*(2/3-n)*6:u=A,p[h]=u*255;return p};fr.hsl.hsv=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=r,n=Math.max(o,.01);o*=2,r*=o<=1?o:2-o,a*=n<=1?n:2-n;let u=(o+r)/2,A=o===0?2*a/(n+a):2*r/(o+r);return[e,A*100,u*100]};fr.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,o=t[2]/100,a=Math.floor(e)%6,n=e-Math.floor(e),u=255*o*(1-r),A=255*o*(1-r*n),p=255*o*(1-r*(1-n));switch(o*=255,a){case 0:return[o,p,u];case 1:return[A,o,u];case 2:return[u,o,p];case 3:return[u,A,o];case 4:return[p,u,o];case 5:return[o,u,A]}};fr.hsv.hsl=function(t){let e=t[0],r=t[1]/100,o=t[2]/100,a=Math.max(o,.01),n,u;u=(2-r)*o;let A=(2-r)*a;return n=r*a,n/=A<=1?A:2-A,n=n||0,u/=2,[e,n*100,u*100]};fr.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100,a=r+o,n;a>1&&(r/=a,o/=a);let u=Math.floor(6*e),A=1-o;n=6*e-u,u&1&&(n=1-n);let p=r+n*(A-r),h,E,w;switch(u){default:case 6:case 0:h=A,E=p,w=r;break;case 1:h=p,E=A,w=r;break;case 2:h=r,E=A,w=p;break;case 3:h=r,E=p,w=A;break;case 4:h=p,E=r,w=A;break;case 5:h=A,E=r,w=p;break}return[h*255,E*255,w*255]};fr.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a=t[3]/100,n=1-Math.min(1,e*(1-a)+a),u=1-Math.min(1,r*(1-a)+a),A=1-Math.min(1,o*(1-a)+a);return[n*255,u*255,A*255]};fr.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,o=t[2]/100,a,n,u;return a=e*3.2406+r*-1.5372+o*-.4986,n=e*-.9689+r*1.8758+o*.0415,u=e*.0557+r*-.204+o*1.057,a=a>.0031308?1.055*a**(1/2.4)-.055:a*12.92,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,u=u>.0031308?1.055*u**(1/2.4)-.055:u*12.92,a=Math.min(Math.max(0,a),1),n=Math.min(Math.max(0,n),1),u=Math.min(Math.max(0,u),1),[a*255,n*255,u*255]};fr.xyz.lab=function(t){let e=t[0],r=t[1],o=t[2];e/=95.047,r/=100,o/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,o=o>.008856?o**(1/3):7.787*o+16/116;let a=116*r-16,n=500*(e-r),u=200*(r-o);return[a,n,u]};fr.lab.xyz=function(t){let e=t[0],r=t[1],o=t[2],a,n,u;n=(e+16)/116,a=r/500+n,u=n-o/200;let A=n**3,p=a**3,h=u**3;return n=A>.008856?A:(n-16/116)/7.787,a=p>.008856?p:(a-16/116)/7.787,u=h>.008856?h:(u-16/116)/7.787,a*=95.047,n*=100,u*=108.883,[a,n,u]};fr.lab.lch=function(t){let e=t[0],r=t[1],o=t[2],a;a=Math.atan2(o,r)*360/2/Math.PI,a<0&&(a+=360);let u=Math.sqrt(r*r+o*o);return[e,u,a]};fr.lch.lab=function(t){let e=t[0],r=t[1],a=t[2]/360*2*Math.PI,n=r*Math.cos(a),u=r*Math.sin(a);return[e,n,u]};fr.rgb.ansi16=function(t,e=null){let[r,o,a]=t,n=e===null?fr.rgb.hsv(t)[2]:e;if(n=Math.round(n/50),n===0)return 30;let u=30+(Math.round(a/255)<<2|Math.round(o/255)<<1|Math.round(r/255));return n===2&&(u+=60),u};fr.hsv.ansi16=function(t){return fr.rgb.ansi16(fr.hsv.rgb(t),t[2])};fr.rgb.ansi256=function(t){let e=t[0],r=t[1],o=t[2];return e===r&&r===o?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(o/255*5)};fr.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,o=(e&1)*r*255,a=(e>>1&1)*r*255,n=(e>>2&1)*r*255;return[o,a,n]};fr.ansi256.rgb=function(t){if(t>=232){let n=(t-232)*10+8;return[n,n,n]}t-=16;let e,r=Math.floor(t/36)/5*255,o=Math.floor((e=t%36)/6)/5*255,a=e%6/5*255;return[r,o,a]};fr.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};fr.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(A=>A+A).join(""));let o=parseInt(r,16),a=o>>16&255,n=o>>8&255,u=o&255;return[a,n,u]};fr.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.max(Math.max(e,r),o),n=Math.min(Math.min(e,r),o),u=a-n,A,p;return u<1?A=n/(1-u):A=0,u<=0?p=0:a===e?p=(r-o)/u%6:a===r?p=2+(o-e)/u:p=4+(e-r)/u,p/=6,p%=1,[p*360,u*100,A*100]};fr.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=r<.5?2*e*r:2*e*(1-r),a=0;return o<1&&(a=(r-.5*o)/(1-o)),[t[0],o*100,a*100]};fr.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,o=e*r,a=0;return o<1&&(a=(r-o)/(1-o)),[t[0],o*100,a*100]};fr.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,o=t[2]/100;if(r===0)return[o*255,o*255,o*255];let a=[0,0,0],n=e%1*6,u=n%1,A=1-u,p=0;switch(Math.floor(n)){case 0:a[0]=1,a[1]=u,a[2]=0;break;case 1:a[0]=A,a[1]=1,a[2]=0;break;case 2:a[0]=0,a[1]=1,a[2]=u;break;case 3:a[0]=0,a[1]=A,a[2]=1;break;case 4:a[0]=u,a[1]=0,a[2]=1;break;default:a[0]=1,a[1]=0,a[2]=A}return p=(1-r)*o,[(r*a[0]+p)*255,(r*a[1]+p)*255,(r*a[2]+p)*255]};fr.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e),a=0;return o>0&&(a=e/o),[t[0],a*100,o*100]};fr.hcg.hsl=function(t){let e=t[1]/100,o=t[2]/100*(1-e)+.5*e,a=0;return o>0&&o<.5?a=e/(2*o):o>=.5&&o<1&&(a=e/(2*(1-o))),[t[0],a*100,o*100]};fr.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,o=e+r*(1-e);return[t[0],(o-e)*100,(1-o)*100]};fr.hwb.hcg=function(t){let e=t[1]/100,o=1-t[2]/100,a=o-e,n=0;return a<1&&(n=(o-a)/(1-a)),[t[0],a*100,n*100]};fr.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};fr.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};fr.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};fr.gray.hsl=function(t){return[0,0,t[0]]};fr.gray.hsv=fr.gray.hsl;fr.gray.hwb=function(t){return[0,100,t[0]]};fr.gray.cmyk=function(t){return[0,0,0,t[0]]};fr.gray.lab=function(t){return[t[0],0,0]};fr.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,o=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(o.length)+o};fr.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var GX=_((uQt,jX)=>{var iP=KL();function i9e(){let t={},e=Object.keys(iP);for(let r=e.length,o=0;o{var JL=KL(),l9e=GX(),Rm={},c9e=Object.keys(JL);function u9e(t){let e=function(...r){let o=r[0];return o==null?o:(o.length>1&&(r=o),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function A9e(t){let e=function(...r){let o=r[0];if(o==null)return o;o.length>1&&(r=o);let a=t(r);if(typeof a=="object")for(let n=a.length,u=0;u{Rm[t]={},Object.defineProperty(Rm[t],"channels",{value:JL[t].channels}),Object.defineProperty(Rm[t],"labels",{value:JL[t].labels});let e=l9e(t);Object.keys(e).forEach(o=>{let a=e[o];Rm[t][o]=A9e(a),Rm[t][o].raw=u9e(a)})});WX.exports=Rm});var qw=_((fQt,XX)=>{"use strict";var VX=(t,e)=>(...r)=>`\x1B[${t(...r)+e}m`,KX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};5;${o}m`},JX=(t,e)=>(...r)=>{let o=t(...r);return`\x1B[${38+e};2;${o[0]};${o[1]};${o[2]}m`},sP=t=>t,zX=(t,e,r)=>[t,e,r],Tm=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let o=r();return Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0}),o},enumerable:!0,configurable:!0})},zL,Lm=(t,e,r,o)=>{zL===void 0&&(zL=YX());let a=o?10:0,n={};for(let[u,A]of Object.entries(zL)){let p=u==="ansi16"?"ansi":u;u===e?n[p]=t(r,a):typeof A=="object"&&(n[p]=t(A[e],a))}return n};function f9e(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,o]of Object.entries(e)){for(let[a,n]of Object.entries(o))e[a]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},o[a]=e[a],t.set(n[0],n[1]);Object.defineProperty(e,r,{value:o,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="\x1B[39m",e.bgColor.close="\x1B[49m",Tm(e.color,"ansi",()=>Lm(VX,"ansi16",sP,!1)),Tm(e.color,"ansi256",()=>Lm(KX,"ansi256",sP,!1)),Tm(e.color,"ansi16m",()=>Lm(JX,"rgb",zX,!1)),Tm(e.bgColor,"ansi",()=>Lm(VX,"ansi16",sP,!0)),Tm(e.bgColor,"ansi256",()=>Lm(KX,"ansi256",sP,!0)),Tm(e.bgColor,"ansi16m",()=>Lm(JX,"rgb",zX,!0)),e}Object.defineProperty(XX,"exports",{enumerable:!0,get:f9e})});var $X=_((pQt,ZX)=>{"use strict";ZX.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",o=e.indexOf(r+t),a=e.indexOf("--");return o!==-1&&(a===-1||o{"use strict";var p9e=ve("os"),eZ=ve("tty"),_l=$X(),{env:cs}=process,Zp;_l("no-color")||_l("no-colors")||_l("color=false")||_l("color=never")?Zp=0:(_l("color")||_l("colors")||_l("color=true")||_l("color=always"))&&(Zp=1);"FORCE_COLOR"in cs&&(cs.FORCE_COLOR==="true"?Zp=1:cs.FORCE_COLOR==="false"?Zp=0:Zp=cs.FORCE_COLOR.length===0?1:Math.min(parseInt(cs.FORCE_COLOR,10),3));function XL(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function ZL(t,e){if(Zp===0)return 0;if(_l("color=16m")||_l("color=full")||_l("color=truecolor"))return 3;if(_l("color=256"))return 2;if(t&&!e&&Zp===void 0)return 0;let r=Zp||0;if(cs.TERM==="dumb")return r;if(process.platform==="win32"){let o=p9e.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in cs)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(o=>o in cs)||cs.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in cs)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(cs.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in cs)return 1;if(cs.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in cs){let o=parseInt((cs.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(cs.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(cs.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(cs.TERM)||"COLORTERM"in cs?1:r}function h9e(t){let e=ZL(t,t&&t.isTTY);return XL(e)}tZ.exports={supportsColor:h9e,stdout:XL(ZL(!0,eZ.isatty(1))),stderr:XL(ZL(!0,eZ.isatty(2)))}});var nZ=_((gQt,rZ)=>{"use strict";var g9e=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},d9e=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r -`:` -`)+r,a=o+1,o=t.indexOf(` -`,a)}while(o!==-1);return n+=t.substr(a),n};rZ.exports={stringReplaceAll:g9e,stringEncaseCRLFWithFirstIndex:d9e}});var lZ=_((dQt,aZ)=>{"use strict";var m9e=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,iZ=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,y9e=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,E9e=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,C9e=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function oZ(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):C9e.get(t)||t}function I9e(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(y9e))r.push(a[2].replace(E9e,(A,p,h)=>p?oZ(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function w9e(t){iZ.lastIndex=0;let e=[],r;for(;(r=iZ.exec(t))!==null;){let o=r[1];if(r[2]){let a=I9e(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function sZ(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}aZ.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(m9e,(n,u,A,p,h,E)=>{if(u)a.push(oZ(u));else if(p){let w=a.join("");a=[],o.push(r.length===0?w:sZ(t,r)(w)),r.push({inverse:A,styles:w9e(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(sZ(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var sN=_((mQt,fZ)=>{"use strict";var jw=qw(),{stdout:tN,stderr:rN}=$L(),{stringReplaceAll:B9e,stringEncaseCRLFWithFirstIndex:v9e}=nZ(),cZ=["ansi","ansi","ansi256","ansi16m"],Nm=Object.create(null),D9e=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=tN?tN.level:0;t.level=e.level===void 0?r:e.level},nN=class{constructor(e){return uZ(e)}},uZ=t=>{let e={};return D9e(e,t),e.template=(...r)=>x9e(e.template,...r),Object.setPrototypeOf(e,oP.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=nN,e.template};function oP(t){return uZ(t)}for(let[t,e]of Object.entries(jw))Nm[t]={get(){let r=aP(this,iN(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Nm.visible={get(){let t=aP(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var AZ=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of AZ)Nm[t]={get(){let{level:e}=this;return function(...r){let o=iN(jw.color[cZ[e]][t](...r),jw.color.close,this._styler);return aP(this,o,this._isEmpty)}}};for(let t of AZ){let e="bg"+t[0].toUpperCase()+t.slice(1);Nm[e]={get(){let{level:r}=this;return function(...o){let a=iN(jw.bgColor[cZ[r]][t](...o),jw.bgColor.close,this._styler);return aP(this,a,this._isEmpty)}}}}var S9e=Object.defineProperties(()=>{},{...Nm,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),iN=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},aP=(t,e,r)=>{let o=(...a)=>P9e(o,a.length===1?""+a[0]:a.join(" "));return o.__proto__=S9e,o._generator=t,o._styler=e,o._isEmpty=r,o},P9e=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=B9e(e,r.close,r.open),r=r.parent;let n=e.indexOf(` -`);return n!==-1&&(e=v9e(e,a,o,n)),o+e+a},eN,x9e=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";Hl.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;Hl.find=(t,e)=>t.nodes.find(r=>r.type===e);Hl.exceedsLimit=(t,e,r=1,o)=>o===!1||!Hl.isInteger(t)||!Hl.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=o;Hl.escapeNode=(t,e=0,r)=>{let o=t.nodes[e];o&&(r&&o.type===r||o.type==="open"||o.type==="close")&&o.escaped!==!0&&(o.value="\\"+o.value,o.escaped=!0)};Hl.encloseBrace=t=>t.type!=="brace"||t.commas>>0+t.ranges>>0?!1:(t.invalid=!0,!0);Hl.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:!(t.commas>>0+t.ranges>>0)||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;Hl.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;Hl.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);Hl.flatten=(...t)=>{let e=[],r=o=>{for(let a=0;a{"use strict";var pZ=lP();hZ.exports=(t,e={})=>{let r=(o,a={})=>{let n=e.escapeInvalid&&pZ.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A="";if(o.value)return(n||u)&&pZ.isOpenOrClose(o)?"\\"+o.value:o.value;if(o.value)return o.value;if(o.nodes)for(let p of o.nodes)A+=r(p);return A};return r(t)}});var dZ=_((CQt,gZ)=>{"use strict";gZ.exports=function(t){return typeof t=="number"?t-t===0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var DZ=_((IQt,vZ)=>{"use strict";var mZ=dZ(),hg=(t,e,r)=>{if(mZ(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(mZ(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let o={relaxZeros:!0,...r};typeof o.strictZeros=="boolean"&&(o.relaxZeros=o.strictZeros===!1);let a=String(o.relaxZeros),n=String(o.shorthand),u=String(o.capture),A=String(o.wrap),p=t+":"+e+"="+a+n+u+A;if(hg.cache.hasOwnProperty(p))return hg.cache[p].result;let h=Math.min(t,e),E=Math.max(t,e);if(Math.abs(h-E)===1){let T=t+"|"+e;return o.capture?`(${T})`:o.wrap===!1?T:`(?:${T})`}let w=BZ(t)||BZ(e),D={min:t,max:e,a:h,b:E},b=[],C=[];if(w&&(D.isPadded=w,D.maxLen=String(D.max).length),h<0){let T=E<0?Math.abs(E):1;C=yZ(T,Math.abs(h),D,o),h=D.a=0}return E>=0&&(b=yZ(h,E,D,o)),D.negatives=C,D.positives=b,D.result=b9e(C,b,o),o.capture===!0?D.result=`(${D.result})`:o.wrap!==!1&&b.length+C.length>1&&(D.result=`(?:${D.result})`),hg.cache[p]=D,D.result};function b9e(t,e,r){let o=oN(t,e,"-",!1,r)||[],a=oN(e,t,"",!1,r)||[],n=oN(t,e,"-?",!0,r)||[];return o.concat(n).concat(a).join("|")}function k9e(t,e){let r=1,o=1,a=CZ(t,r),n=new Set([e]);for(;t<=a&&a<=e;)n.add(a),r+=1,a=CZ(t,r);for(a=IZ(e+1,o)-1;t1&&A.count.pop(),A.count.push(E.count[0]),A.string=A.pattern+wZ(A.count),u=h+1;continue}r.isPadded&&(w=L9e(h,r,o)),E.string=w+E.pattern+wZ(E.count),n.push(E),u=h+1,A=E}return n}function oN(t,e,r,o,a){let n=[];for(let u of t){let{string:A}=u;!o&&!EZ(e,"string",A)&&n.push(r+A),o&&EZ(e,"string",A)&&n.push(r+A)}return n}function F9e(t,e){let r=[];for(let o=0;oe?1:e>t?-1:0}function EZ(t,e,r){return t.some(o=>o[e]===r)}function CZ(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function IZ(t,e){return t-t%Math.pow(10,e)}function wZ(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function T9e(t,e,r){return`[${t}${e-t===1?"":"-"}${e}]`}function BZ(t){return/^-?(0+)\d/.test(t)}function L9e(t,e,r){if(!e.isPadded)return t;let o=Math.abs(e.maxLen-String(t).length),a=r.relaxZeros!==!1;switch(o){case 0:return"";case 1:return a?"0?":"0";case 2:return a?"0{0,2}":"00";default:return a?`0{0,${o}}`:`0{${o}}`}}hg.cache={};hg.clearCache=()=>hg.cache={};vZ.exports=hg});var cN=_((wQt,RZ)=>{"use strict";var N9e=ve("util"),xZ=DZ(),SZ=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),O9e=t=>e=>t===!0?Number(e):String(e),aN=t=>typeof t=="number"||typeof t=="string"&&t!=="",Ww=t=>Number.isInteger(+t),lN=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},M9e=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,U9e=(t,e,r)=>{if(e>0){let o=t[0]==="-"?"-":"";o&&(t=t.slice(1)),t=o+t.padStart(o?e-1:e,"0")}return r===!1?String(t):t},PZ=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((u,A)=>uA?1:0),t.positives.sort((u,A)=>uA?1:0);let r=e.capture?"":"?:",o="",a="",n;return t.positives.length&&(o=t.positives.join("|")),t.negatives.length&&(a=`-(${r}${t.negatives.join("|")})`),o&&a?n=`${o}|${a}`:n=o||a,e.wrap?`(${r}${n})`:n},bZ=(t,e,r,o)=>{if(r)return xZ(t,e,{wrap:!1,...o});let a=String.fromCharCode(t);if(t===e)return a;let n=String.fromCharCode(e);return`[${a}-${n}]`},kZ=(t,e,r)=>{if(Array.isArray(t)){let o=r.wrap===!0,a=r.capture?"":"?:";return o?`(${a}${t.join("|")})`:t.join("|")}return xZ(t,e,r)},QZ=(...t)=>new RangeError("Invalid range arguments: "+N9e.inspect(...t)),FZ=(t,e,r)=>{if(r.strictRanges===!0)throw QZ([t,e]);return[]},H9e=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},q9e=(t,e,r=1,o={})=>{let a=Number(t),n=Number(e);if(!Number.isInteger(a)||!Number.isInteger(n)){if(o.strictRanges===!0)throw QZ([t,e]);return[]}a===0&&(a=0),n===0&&(n=0);let u=a>n,A=String(t),p=String(e),h=String(r);r=Math.max(Math.abs(r),1);let E=lN(A)||lN(p)||lN(h),w=E?Math.max(A.length,p.length,h.length):0,D=E===!1&&M9e(t,e,o)===!1,b=o.transform||O9e(D);if(o.toRegex&&r===1)return bZ(PZ(t,w),PZ(e,w),!0,o);let C={negatives:[],positives:[]},T=J=>C[J<0?"negatives":"positives"].push(Math.abs(J)),N=[],U=0;for(;u?a>=n:a<=n;)o.toRegex===!0&&r>1?T(a):N.push(U9e(b(a,U),w,D)),a=u?a-r:a+r,U++;return o.toRegex===!0?r>1?_9e(C,o):kZ(N,null,{wrap:!1,...o}):N},j9e=(t,e,r=1,o={})=>{if(!Ww(t)&&t.length>1||!Ww(e)&&e.length>1)return FZ(t,e,o);let a=o.transform||(D=>String.fromCharCode(D)),n=`${t}`.charCodeAt(0),u=`${e}`.charCodeAt(0),A=n>u,p=Math.min(n,u),h=Math.max(n,u);if(o.toRegex&&r===1)return bZ(p,h,!1,o);let E=[],w=0;for(;A?n>=u:n<=u;)E.push(a(n,w)),n=A?n-r:n+r,w++;return o.toRegex===!0?kZ(E,null,{wrap:!1,options:o}):E},uP=(t,e,r,o={})=>{if(e==null&&aN(t))return[t];if(!aN(t)||!aN(e))return FZ(t,e,o);if(typeof r=="function")return uP(t,e,1,{transform:r});if(SZ(r))return uP(t,e,0,r);let a={...o};return a.capture===!0&&(a.wrap=!0),r=r||a.step||1,Ww(r)?Ww(t)&&Ww(e)?q9e(t,e,r,a):j9e(t,e,Math.max(Math.abs(r),1),a):r!=null&&!SZ(r)?H9e(r,a):uP(t,e,1,r)};RZ.exports=uP});var NZ=_((BQt,LZ)=>{"use strict";var G9e=cN(),TZ=lP(),W9e=(t,e={})=>{let r=(o,a={})=>{let n=TZ.isInvalidBrace(a),u=o.invalid===!0&&e.escapeInvalid===!0,A=n===!0||u===!0,p=e.escapeInvalid===!0?"\\":"",h="";if(o.isOpen===!0||o.isClose===!0)return p+o.value;if(o.type==="open")return A?p+o.value:"(";if(o.type==="close")return A?p+o.value:")";if(o.type==="comma")return o.prev.type==="comma"?"":A?o.value:"|";if(o.value)return o.value;if(o.nodes&&o.ranges>0){let E=TZ.reduce(o.nodes),w=G9e(...E,{...e,wrap:!1,toRegex:!0});if(w.length!==0)return E.length>1&&w.length>1?`(${w})`:w}if(o.nodes)for(let E of o.nodes)h+=r(E,o);return h};return r(t)};LZ.exports=W9e});var UZ=_((vQt,MZ)=>{"use strict";var Y9e=cN(),OZ=cP(),Om=lP(),gg=(t="",e="",r=!1)=>{let o=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?Om.flatten(e).map(a=>`{${a}}`):e;for(let a of t)if(Array.isArray(a))for(let n of a)o.push(gg(n,e,r));else for(let n of e)r===!0&&typeof n=="string"&&(n=`{${n}}`),o.push(Array.isArray(n)?gg(a,n,r):a+n);return Om.flatten(o)},V9e=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,o=(a,n={})=>{a.queue=[];let u=n,A=n.queue;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,A=u.queue;if(a.invalid||a.dollar){A.push(gg(A.pop(),OZ(a,e)));return}if(a.type==="brace"&&a.invalid!==!0&&a.nodes.length===2){A.push(gg(A.pop(),["{}"]));return}if(a.nodes&&a.ranges>0){let w=Om.reduce(a.nodes);if(Om.exceedsLimit(...w,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let D=Y9e(...w,e);D.length===0&&(D=OZ(a,e)),A.push(gg(A.pop(),D)),a.nodes=[];return}let p=Om.encloseBrace(a),h=a.queue,E=a;for(;E.type!=="brace"&&E.type!=="root"&&E.parent;)E=E.parent,h=E.queue;for(let w=0;w{"use strict";_Z.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var YZ=_((SQt,WZ)=>{"use strict";var K9e=cP(),{MAX_LENGTH:qZ,CHAR_BACKSLASH:uN,CHAR_BACKTICK:J9e,CHAR_COMMA:z9e,CHAR_DOT:X9e,CHAR_LEFT_PARENTHESES:Z9e,CHAR_RIGHT_PARENTHESES:$9e,CHAR_LEFT_CURLY_BRACE:e7e,CHAR_RIGHT_CURLY_BRACE:t7e,CHAR_LEFT_SQUARE_BRACKET:jZ,CHAR_RIGHT_SQUARE_BRACKET:GZ,CHAR_DOUBLE_QUOTE:r7e,CHAR_SINGLE_QUOTE:n7e,CHAR_NO_BREAK_SPACE:i7e,CHAR_ZERO_WIDTH_NOBREAK_SPACE:s7e}=HZ(),o7e=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},o=typeof r.maxLength=="number"?Math.min(qZ,r.maxLength):qZ;if(t.length>o)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${o})`);let a={type:"root",input:t,nodes:[]},n=[a],u=a,A=a,p=0,h=t.length,E=0,w=0,D,b={},C=()=>t[E++],T=N=>{if(N.type==="text"&&A.type==="dot"&&(A.type="text"),A&&A.type==="text"&&N.type==="text"){A.value+=N.value;return}return u.nodes.push(N),N.parent=u,N.prev=A,A=N,N};for(T({type:"bos"});E0){if(u.ranges>0){u.ranges=0;let N=u.nodes.shift();u.nodes=[N,{type:"text",value:K9e(u)}]}T({type:"comma",value:D}),u.commas++;continue}if(D===X9e&&w>0&&u.commas===0){let N=u.nodes;if(w===0||N.length===0){T({type:"text",value:D});continue}if(A.type==="dot"){if(u.range=[],A.value+=D,A.type="range",u.nodes.length!==3&&u.nodes.length!==5){u.invalid=!0,u.ranges=0,A.type="text";continue}u.ranges++,u.args=[];continue}if(A.type==="range"){N.pop();let U=N[N.length-1];U.value+=A.value+D,A=U,u.ranges--;continue}T({type:"dot",value:D});continue}T({type:"text",value:D})}do if(u=n.pop(),u.type!=="root"){u.nodes.forEach(J=>{J.nodes||(J.type==="open"&&(J.isOpen=!0),J.type==="close"&&(J.isClose=!0),J.nodes||(J.type="text"),J.invalid=!0)});let N=n[n.length-1],U=N.nodes.indexOf(u);N.nodes.splice(U,1,...u.nodes)}while(n.length>0);return T({type:"eos"}),a};WZ.exports=o7e});var JZ=_((PQt,KZ)=>{"use strict";var VZ=cP(),a7e=NZ(),l7e=UZ(),c7e=YZ(),al=(t,e={})=>{let r=[];if(Array.isArray(t))for(let o of t){let a=al.create(o,e);Array.isArray(a)?r.push(...a):r.push(a)}else r=[].concat(al.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};al.parse=(t,e={})=>c7e(t,e);al.stringify=(t,e={})=>VZ(typeof t=="string"?al.parse(t,e):t,e);al.compile=(t,e={})=>(typeof t=="string"&&(t=al.parse(t,e)),a7e(t,e));al.expand=(t,e={})=>{typeof t=="string"&&(t=al.parse(t,e));let r=l7e(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};al.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?al.compile(t,e):al.expand(t,e);KZ.exports=al});var Yw=_((xQt,e$)=>{"use strict";var u7e=ve("path"),zu="\\\\/",zZ=`[^${zu}]`,Bf="\\.",A7e="\\+",f7e="\\?",AP="\\/",p7e="(?=.)",XZ="[^/]",AN=`(?:${AP}|$)`,ZZ=`(?:^|${AP})`,fN=`${Bf}{1,2}${AN}`,h7e=`(?!${Bf})`,g7e=`(?!${ZZ}${fN})`,d7e=`(?!${Bf}{0,1}${AN})`,m7e=`(?!${fN})`,y7e=`[^.${AP}]`,E7e=`${XZ}*?`,$Z={DOT_LITERAL:Bf,PLUS_LITERAL:A7e,QMARK_LITERAL:f7e,SLASH_LITERAL:AP,ONE_CHAR:p7e,QMARK:XZ,END_ANCHOR:AN,DOTS_SLASH:fN,NO_DOT:h7e,NO_DOTS:g7e,NO_DOT_SLASH:d7e,NO_DOTS_SLASH:m7e,QMARK_NO_DOT:y7e,STAR:E7e,START_ANCHOR:ZZ},C7e={...$Z,SLASH_LITERAL:`[${zu}]`,QMARK:zZ,STAR:`${zZ}*?`,DOTS_SLASH:`${Bf}{1,2}(?:[${zu}]|$)`,NO_DOT:`(?!${Bf})`,NO_DOTS:`(?!(?:^|[${zu}])${Bf}{1,2}(?:[${zu}]|$))`,NO_DOT_SLASH:`(?!${Bf}{0,1}(?:[${zu}]|$))`,NO_DOTS_SLASH:`(?!${Bf}{1,2}(?:[${zu}]|$))`,QMARK_NO_DOT:`[^.${zu}]`,START_ANCHOR:`(?:^|[${zu}])`,END_ANCHOR:`(?:[${zu}]|$)`},I7e={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};e$.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:I7e,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:u7e.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?C7e:$Z}}});var Vw=_(ba=>{"use strict";var w7e=ve("path"),B7e=process.platform==="win32",{REGEX_BACKSLASH:v7e,REGEX_REMOVE_BACKSLASH:D7e,REGEX_SPECIAL_CHARS:S7e,REGEX_SPECIAL_CHARS_GLOBAL:P7e}=Yw();ba.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);ba.hasRegexChars=t=>S7e.test(t);ba.isRegexChar=t=>t.length===1&&ba.hasRegexChars(t);ba.escapeRegex=t=>t.replace(P7e,"\\$1");ba.toPosixSlashes=t=>t.replace(v7e,"/");ba.removeBackslashes=t=>t.replace(D7e,e=>e==="\\"?"":e);ba.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};ba.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:B7e===!0||w7e.sep==="\\";ba.escapeLast=(t,e,r)=>{let o=t.lastIndexOf(e,r);return o===-1?t:t[o-1]==="\\"?ba.escapeLast(t,e,o-1):`${t.slice(0,o)}\\${t.slice(o)}`};ba.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};ba.wrapOutput=(t,e={},r={})=>{let o=r.contains?"":"^",a=r.contains?"":"$",n=`${o}(?:${t})${a}`;return e.negated===!0&&(n=`(?:^(?!${n}).*$)`),n}});var l$=_((kQt,a$)=>{"use strict";var t$=Vw(),{CHAR_ASTERISK:pN,CHAR_AT:x7e,CHAR_BACKWARD_SLASH:Kw,CHAR_COMMA:b7e,CHAR_DOT:hN,CHAR_EXCLAMATION_MARK:gN,CHAR_FORWARD_SLASH:o$,CHAR_LEFT_CURLY_BRACE:dN,CHAR_LEFT_PARENTHESES:mN,CHAR_LEFT_SQUARE_BRACKET:k7e,CHAR_PLUS:Q7e,CHAR_QUESTION_MARK:r$,CHAR_RIGHT_CURLY_BRACE:F7e,CHAR_RIGHT_PARENTHESES:n$,CHAR_RIGHT_SQUARE_BRACKET:R7e}=Yw(),i$=t=>t===o$||t===Kw,s$=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?1/0:1)},T7e=(t,e)=>{let r=e||{},o=t.length-1,a=r.parts===!0||r.scanToEnd===!0,n=[],u=[],A=[],p=t,h=-1,E=0,w=0,D=!1,b=!1,C=!1,T=!1,N=!1,U=!1,J=!1,te=!1,le=!1,ce=!1,ue=0,Ie,he,De={value:"",depth:0,isGlob:!1},Ee=()=>h>=o,g=()=>p.charCodeAt(h+1),me=()=>(Ie=he,p.charCodeAt(++h));for(;h0&&(fe=p.slice(0,E),p=p.slice(E),w-=E),Ce&&C===!0&&w>0?(Ce=p.slice(0,w),ie=p.slice(w)):C===!0?(Ce="",ie=p):Ce=p,Ce&&Ce!==""&&Ce!=="/"&&Ce!==p&&i$(Ce.charCodeAt(Ce.length-1))&&(Ce=Ce.slice(0,-1)),r.unescape===!0&&(ie&&(ie=t$.removeBackslashes(ie)),Ce&&J===!0&&(Ce=t$.removeBackslashes(Ce)));let Z={prefix:fe,input:t,start:E,base:Ce,glob:ie,isBrace:D,isBracket:b,isGlob:C,isExtglob:T,isGlobstar:N,negated:te,negatedExtglob:le};if(r.tokens===!0&&(Z.maxDepth=0,i$(he)||u.push(De),Z.tokens=u),r.parts===!0||r.tokens===!0){let Se;for(let Re=0;Re{"use strict";var fP=Yw(),ll=Vw(),{MAX_LENGTH:pP,POSIX_REGEX_SOURCE:L7e,REGEX_NON_SPECIAL_CHARS:N7e,REGEX_SPECIAL_CHARS_BACKREF:O7e,REPLACEMENTS:c$}=fP,M7e=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch{return t.map(a=>ll.escapeRegex(a)).join("..")}return r},Mm=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,yN=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=c$[t]||t;let r={...e},o=typeof r.maxLength=="number"?Math.min(pP,r.maxLength):pP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);let n={type:"bos",value:"",output:r.prepend||""},u=[n],A=r.capture?"":"?:",p=ll.isWindows(e),h=fP.globChars(p),E=fP.extglobChars(h),{DOT_LITERAL:w,PLUS_LITERAL:D,SLASH_LITERAL:b,ONE_CHAR:C,DOTS_SLASH:T,NO_DOT:N,NO_DOT_SLASH:U,NO_DOTS_SLASH:J,QMARK:te,QMARK_NO_DOT:le,STAR:ce,START_ANCHOR:ue}=h,Ie=x=>`(${A}(?:(?!${ue}${x.dot?T:w}).)*?)`,he=r.dot?"":N,De=r.dot?te:le,Ee=r.bash===!0?Ie(r):ce;r.capture&&(Ee=`(${Ee})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let g={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:u};t=ll.removePrefix(t,g),a=t.length;let me=[],Ce=[],fe=[],ie=n,Z,Se=()=>g.index===a-1,Re=g.peek=(x=1)=>t[g.index+x],ht=g.advance=()=>t[++g.index]||"",q=()=>t.slice(g.index+1),nt=(x="",I=0)=>{g.consumed+=x,g.index+=I},Le=x=>{g.output+=x.output!=null?x.output:x.value,nt(x.value)},Te=()=>{let x=1;for(;Re()==="!"&&(Re(2)!=="("||Re(3)==="?");)ht(),g.start++,x++;return x%2===0?!1:(g.negated=!0,g.start++,!0)},ke=x=>{g[x]++,fe.push(x)},Ke=x=>{g[x]--,fe.pop()},xe=x=>{if(ie.type==="globstar"){let I=g.braces>0&&(x.type==="comma"||x.type==="brace"),P=x.extglob===!0||me.length&&(x.type==="pipe"||x.type==="paren");x.type!=="slash"&&x.type!=="paren"&&!I&&!P&&(g.output=g.output.slice(0,-ie.output.length),ie.type="star",ie.value="*",ie.output=Ee,g.output+=ie.output)}if(me.length&&x.type!=="paren"&&(me[me.length-1].inner+=x.value),(x.value||x.output)&&Le(x),ie&&ie.type==="text"&&x.type==="text"){ie.value+=x.value,ie.output=(ie.output||"")+x.value;return}x.prev=ie,u.push(x),ie=x},tt=(x,I)=>{let P={...E[I],conditions:1,inner:""};P.prev=ie,P.parens=g.parens,P.output=g.output;let y=(r.capture?"(":"")+P.open;ke("parens"),xe({type:x,value:I,output:g.output?"":C}),xe({type:"paren",extglob:!0,value:ht(),output:y}),me.push(P)},He=x=>{let I=x.close+(r.capture?")":""),P;if(x.type==="negate"){let y=Ee;if(x.inner&&x.inner.length>1&&x.inner.includes("/")&&(y=Ie(r)),(y!==Ee||Se()||/^\)+$/.test(q()))&&(I=x.close=`)$))${y}`),x.inner.includes("*")&&(P=q())&&/^\.[^\\/.]+$/.test(P)){let R=yN(P,{...e,fastpaths:!1}).output;I=x.close=`)${R})${y})`}x.prev.type==="bos"&&(g.negatedExtglob=!0)}xe({type:"paren",extglob:!0,value:Z,output:I}),Ke("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let x=!1,I=t.replace(O7e,(P,y,R,z,X,$)=>z==="\\"?(x=!0,P):z==="?"?y?y+z+(X?te.repeat(X.length):""):$===0?De+(X?te.repeat(X.length):""):te.repeat(R.length):z==="."?w.repeat(R.length):z==="*"?y?y+z+(X?Ee:""):Ee:y?P:`\\${P}`);return x===!0&&(r.unescape===!0?I=I.replace(/\\/g,""):I=I.replace(/\\+/g,P=>P.length%2===0?"\\\\":P?"\\":"")),I===t&&r.contains===!0?(g.output=t,g):(g.output=ll.wrapOutput(I,g,e),g)}for(;!Se();){if(Z=ht(),Z==="\0")continue;if(Z==="\\"){let P=Re();if(P==="/"&&r.bash!==!0||P==="."||P===";")continue;if(!P){Z+="\\",xe({type:"text",value:Z});continue}let y=/^\\+/.exec(q()),R=0;if(y&&y[0].length>2&&(R=y[0].length,g.index+=R,R%2!==0&&(Z+="\\")),r.unescape===!0?Z=ht():Z+=ht(),g.brackets===0){xe({type:"text",value:Z});continue}}if(g.brackets>0&&(Z!=="]"||ie.value==="["||ie.value==="[^")){if(r.posix!==!1&&Z===":"){let P=ie.value.slice(1);if(P.includes("[")&&(ie.posix=!0,P.includes(":"))){let y=ie.value.lastIndexOf("["),R=ie.value.slice(0,y),z=ie.value.slice(y+2),X=L7e[z];if(X){ie.value=R+X,g.backtrack=!0,ht(),!n.output&&u.indexOf(ie)===1&&(n.output=C);continue}}}(Z==="["&&Re()!==":"||Z==="-"&&Re()==="]")&&(Z=`\\${Z}`),Z==="]"&&(ie.value==="["||ie.value==="[^")&&(Z=`\\${Z}`),r.posix===!0&&Z==="!"&&ie.value==="["&&(Z="^"),ie.value+=Z,Le({value:Z});continue}if(g.quotes===1&&Z!=='"'){Z=ll.escapeRegex(Z),ie.value+=Z,Le({value:Z});continue}if(Z==='"'){g.quotes=g.quotes===1?0:1,r.keepQuotes===!0&&xe({type:"text",value:Z});continue}if(Z==="("){ke("parens"),xe({type:"paren",value:Z});continue}if(Z===")"){if(g.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Mm("opening","("));let P=me[me.length-1];if(P&&g.parens===P.parens+1){He(me.pop());continue}xe({type:"paren",value:Z,output:g.parens?")":"\\)"}),Ke("parens");continue}if(Z==="["){if(r.nobracket===!0||!q().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Mm("closing","]"));Z=`\\${Z}`}else ke("brackets");xe({type:"bracket",value:Z});continue}if(Z==="]"){if(r.nobracket===!0||ie&&ie.type==="bracket"&&ie.value.length===1){xe({type:"text",value:Z,output:`\\${Z}`});continue}if(g.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Mm("opening","["));xe({type:"text",value:Z,output:`\\${Z}`});continue}Ke("brackets");let P=ie.value.slice(1);if(ie.posix!==!0&&P[0]==="^"&&!P.includes("/")&&(Z=`/${Z}`),ie.value+=Z,Le({value:Z}),r.literalBrackets===!1||ll.hasRegexChars(P))continue;let y=ll.escapeRegex(ie.value);if(g.output=g.output.slice(0,-ie.value.length),r.literalBrackets===!0){g.output+=y,ie.value=y;continue}ie.value=`(${A}${y}|${ie.value})`,g.output+=ie.value;continue}if(Z==="{"&&r.nobrace!==!0){ke("braces");let P={type:"brace",value:Z,output:"(",outputIndex:g.output.length,tokensIndex:g.tokens.length};Ce.push(P),xe(P);continue}if(Z==="}"){let P=Ce[Ce.length-1];if(r.nobrace===!0||!P){xe({type:"text",value:Z,output:Z});continue}let y=")";if(P.dots===!0){let R=u.slice(),z=[];for(let X=R.length-1;X>=0&&(u.pop(),R[X].type!=="brace");X--)R[X].type!=="dots"&&z.unshift(R[X].value);y=M7e(z,r),g.backtrack=!0}if(P.comma!==!0&&P.dots!==!0){let R=g.output.slice(0,P.outputIndex),z=g.tokens.slice(P.tokensIndex);P.value=P.output="\\{",Z=y="\\}",g.output=R;for(let X of z)g.output+=X.output||X.value}xe({type:"brace",value:Z,output:y}),Ke("braces"),Ce.pop();continue}if(Z==="|"){me.length>0&&me[me.length-1].conditions++,xe({type:"text",value:Z});continue}if(Z===","){let P=Z,y=Ce[Ce.length-1];y&&fe[fe.length-1]==="braces"&&(y.comma=!0,P="|"),xe({type:"comma",value:Z,output:P});continue}if(Z==="/"){if(ie.type==="dot"&&g.index===g.start+1){g.start=g.index+1,g.consumed="",g.output="",u.pop(),ie=n;continue}xe({type:"slash",value:Z,output:b});continue}if(Z==="."){if(g.braces>0&&ie.type==="dot"){ie.value==="."&&(ie.output=w);let P=Ce[Ce.length-1];ie.type="dots",ie.output+=Z,ie.value+=Z,P.dots=!0;continue}if(g.braces+g.parens===0&&ie.type!=="bos"&&ie.type!=="slash"){xe({type:"text",value:Z,output:w});continue}xe({type:"dot",value:Z,output:w});continue}if(Z==="?"){if(!(ie&&ie.value==="(")&&r.noextglob!==!0&&Re()==="("&&Re(2)!=="?"){tt("qmark",Z);continue}if(ie&&ie.type==="paren"){let y=Re(),R=Z;if(y==="<"&&!ll.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(ie.value==="("&&!/[!=<:]/.test(y)||y==="<"&&!/<([!=]|\w+>)/.test(q()))&&(R=`\\${Z}`),xe({type:"text",value:Z,output:R});continue}if(r.dot!==!0&&(ie.type==="slash"||ie.type==="bos")){xe({type:"qmark",value:Z,output:le});continue}xe({type:"qmark",value:Z,output:te});continue}if(Z==="!"){if(r.noextglob!==!0&&Re()==="("&&(Re(2)!=="?"||!/[!=<:]/.test(Re(3)))){tt("negate",Z);continue}if(r.nonegate!==!0&&g.index===0){Te();continue}}if(Z==="+"){if(r.noextglob!==!0&&Re()==="("&&Re(2)!=="?"){tt("plus",Z);continue}if(ie&&ie.value==="("||r.regex===!1){xe({type:"plus",value:Z,output:D});continue}if(ie&&(ie.type==="bracket"||ie.type==="paren"||ie.type==="brace")||g.parens>0){xe({type:"plus",value:Z});continue}xe({type:"plus",value:D});continue}if(Z==="@"){if(r.noextglob!==!0&&Re()==="("&&Re(2)!=="?"){xe({type:"at",extglob:!0,value:Z,output:""});continue}xe({type:"text",value:Z});continue}if(Z!=="*"){(Z==="$"||Z==="^")&&(Z=`\\${Z}`);let P=N7e.exec(q());P&&(Z+=P[0],g.index+=P[0].length),xe({type:"text",value:Z});continue}if(ie&&(ie.type==="globstar"||ie.star===!0)){ie.type="star",ie.star=!0,ie.value+=Z,ie.output=Ee,g.backtrack=!0,g.globstar=!0,nt(Z);continue}let x=q();if(r.noextglob!==!0&&/^\([^?]/.test(x)){tt("star",Z);continue}if(ie.type==="star"){if(r.noglobstar===!0){nt(Z);continue}let P=ie.prev,y=P.prev,R=P.type==="slash"||P.type==="bos",z=y&&(y.type==="star"||y.type==="globstar");if(r.bash===!0&&(!R||x[0]&&x[0]!=="/")){xe({type:"star",value:Z,output:""});continue}let X=g.braces>0&&(P.type==="comma"||P.type==="brace"),$=me.length&&(P.type==="pipe"||P.type==="paren");if(!R&&P.type!=="paren"&&!X&&!$){xe({type:"star",value:Z,output:""});continue}for(;x.slice(0,3)==="/**";){let se=t[g.index+4];if(se&&se!=="/")break;x=x.slice(3),nt("/**",3)}if(P.type==="bos"&&Se()){ie.type="globstar",ie.value+=Z,ie.output=Ie(r),g.output=ie.output,g.globstar=!0,nt(Z);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&!z&&Se()){g.output=g.output.slice(0,-(P.output+ie.output).length),P.output=`(?:${P.output}`,ie.type="globstar",ie.output=Ie(r)+(r.strictSlashes?")":"|$)"),ie.value+=Z,g.globstar=!0,g.output+=P.output+ie.output,nt(Z);continue}if(P.type==="slash"&&P.prev.type!=="bos"&&x[0]==="/"){let se=x[1]!==void 0?"|$":"";g.output=g.output.slice(0,-(P.output+ie.output).length),P.output=`(?:${P.output}`,ie.type="globstar",ie.output=`${Ie(r)}${b}|${b}${se})`,ie.value+=Z,g.output+=P.output+ie.output,g.globstar=!0,nt(Z+ht()),xe({type:"slash",value:"/",output:""});continue}if(P.type==="bos"&&x[0]==="/"){ie.type="globstar",ie.value+=Z,ie.output=`(?:^|${b}|${Ie(r)}${b})`,g.output=ie.output,g.globstar=!0,nt(Z+ht()),xe({type:"slash",value:"/",output:""});continue}g.output=g.output.slice(0,-ie.output.length),ie.type="globstar",ie.output=Ie(r),ie.value+=Z,g.output+=ie.output,g.globstar=!0,nt(Z);continue}let I={type:"star",value:Z,output:Ee};if(r.bash===!0){I.output=".*?",(ie.type==="bos"||ie.type==="slash")&&(I.output=he+I.output),xe(I);continue}if(ie&&(ie.type==="bracket"||ie.type==="paren")&&r.regex===!0){I.output=Z,xe(I);continue}(g.index===g.start||ie.type==="slash"||ie.type==="dot")&&(ie.type==="dot"?(g.output+=U,ie.output+=U):r.dot===!0?(g.output+=J,ie.output+=J):(g.output+=he,ie.output+=he),Re()!=="*"&&(g.output+=C,ie.output+=C)),xe(I)}for(;g.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Mm("closing","]"));g.output=ll.escapeLast(g.output,"["),Ke("brackets")}for(;g.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Mm("closing",")"));g.output=ll.escapeLast(g.output,"("),Ke("parens")}for(;g.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Mm("closing","}"));g.output=ll.escapeLast(g.output,"{"),Ke("braces")}if(r.strictSlashes!==!0&&(ie.type==="star"||ie.type==="bracket")&&xe({type:"maybe_slash",value:"",output:`${b}?`}),g.backtrack===!0){g.output="";for(let x of g.tokens)g.output+=x.output!=null?x.output:x.value,x.suffix&&(g.output+=x.suffix)}return g};yN.fastpaths=(t,e)=>{let r={...e},o=typeof r.maxLength=="number"?Math.min(pP,r.maxLength):pP,a=t.length;if(a>o)throw new SyntaxError(`Input length: ${a}, exceeds maximum allowed length: ${o}`);t=c$[t]||t;let n=ll.isWindows(e),{DOT_LITERAL:u,SLASH_LITERAL:A,ONE_CHAR:p,DOTS_SLASH:h,NO_DOT:E,NO_DOTS:w,NO_DOTS_SLASH:D,STAR:b,START_ANCHOR:C}=fP.globChars(n),T=r.dot?w:E,N=r.dot?D:E,U=r.capture?"":"?:",J={negated:!1,prefix:""},te=r.bash===!0?".*?":b;r.capture&&(te=`(${te})`);let le=he=>he.noglobstar===!0?te:`(${U}(?:(?!${C}${he.dot?h:u}).)*?)`,ce=he=>{switch(he){case"*":return`${T}${p}${te}`;case".*":return`${u}${p}${te}`;case"*.*":return`${T}${te}${u}${p}${te}`;case"*/*":return`${T}${te}${A}${p}${N}${te}`;case"**":return T+le(r);case"**/*":return`(?:${T}${le(r)}${A})?${N}${p}${te}`;case"**/*.*":return`(?:${T}${le(r)}${A})?${N}${te}${u}${p}${te}`;case"**/.*":return`(?:${T}${le(r)}${A})?${u}${p}${te}`;default:{let De=/^(.*?)\.(\w+)$/.exec(he);if(!De)return;let Ee=ce(De[1]);return Ee?Ee+u+De[2]:void 0}}},ue=ll.removePrefix(t,J),Ie=ce(ue);return Ie&&r.strictSlashes!==!0&&(Ie+=`${A}?`),Ie};u$.exports=yN});var p$=_((FQt,f$)=>{"use strict";var U7e=ve("path"),_7e=l$(),EN=A$(),CN=Vw(),H7e=Yw(),q7e=t=>t&&typeof t=="object"&&!Array.isArray(t),Mi=(t,e,r=!1)=>{if(Array.isArray(t)){let E=t.map(D=>Mi(D,e,r));return D=>{for(let b of E){let C=b(D);if(C)return C}return!1}}let o=q7e(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!o)throw new TypeError("Expected pattern to be a non-empty string");let a=e||{},n=CN.isWindows(e),u=o?Mi.compileRe(t,e):Mi.makeRe(t,e,!1,!0),A=u.state;delete u.state;let p=()=>!1;if(a.ignore){let E={...e,ignore:null,onMatch:null,onResult:null};p=Mi(a.ignore,E,r)}let h=(E,w=!1)=>{let{isMatch:D,match:b,output:C}=Mi.test(E,u,e,{glob:t,posix:n}),T={glob:t,state:A,regex:u,posix:n,input:E,output:C,match:b,isMatch:D};return typeof a.onResult=="function"&&a.onResult(T),D===!1?(T.isMatch=!1,w?T:!1):p(E)?(typeof a.onIgnore=="function"&&a.onIgnore(T),T.isMatch=!1,w?T:!1):(typeof a.onMatch=="function"&&a.onMatch(T),w?T:!0)};return r&&(h.state=A),h};Mi.test=(t,e,r,{glob:o,posix:a}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let n=r||{},u=n.format||(a?CN.toPosixSlashes:null),A=t===o,p=A&&u?u(t):t;return A===!1&&(p=u?u(t):t,A=p===o),(A===!1||n.capture===!0)&&(n.matchBase===!0||n.basename===!0?A=Mi.matchBase(t,e,r,a):A=e.exec(p)),{isMatch:!!A,match:A,output:p}};Mi.matchBase=(t,e,r,o=CN.isWindows(r))=>(e instanceof RegExp?e:Mi.makeRe(e,r)).test(U7e.basename(t));Mi.isMatch=(t,e,r)=>Mi(e,r)(t);Mi.parse=(t,e)=>Array.isArray(t)?t.map(r=>Mi.parse(r,e)):EN(t,{...e,fastpaths:!1});Mi.scan=(t,e)=>_7e(t,e);Mi.compileRe=(t,e,r=!1,o=!1)=>{if(r===!0)return t.output;let a=e||{},n=a.contains?"":"^",u=a.contains?"":"$",A=`${n}(?:${t.output})${u}`;t&&t.negated===!0&&(A=`^(?!${A}).*$`);let p=Mi.toRegex(A,e);return o===!0&&(p.state=t),p};Mi.makeRe=(t,e={},r=!1,o=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let a={negated:!1,fastpaths:!0};return e.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a.output=EN.fastpaths(t,e)),a.output||(a=EN(t,e)),Mi.compileRe(a,e,r,o)};Mi.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Mi.constants=H7e;f$.exports=Mi});var g$=_((RQt,h$)=>{"use strict";h$.exports=p$()});var Xo=_((TQt,E$)=>{"use strict";var m$=ve("util"),y$=JZ(),Xu=g$(),IN=Vw(),d$=t=>t===""||t==="./",Ii=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let o=new Set,a=new Set,n=new Set,u=0,A=E=>{n.add(E.output),r&&r.onResult&&r.onResult(E)};for(let E=0;E!o.has(E));if(r&&h.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(E=>E.replace(/\\/g,"")):e}return h};Ii.match=Ii;Ii.matcher=(t,e)=>Xu(t,e);Ii.isMatch=(t,e,r)=>Xu(e,r)(t);Ii.any=Ii.isMatch;Ii.not=(t,e,r={})=>{e=[].concat(e).map(String);let o=new Set,a=[],n=A=>{r.onResult&&r.onResult(A),a.push(A.output)},u=new Set(Ii(t,e,{...r,onResult:n}));for(let A of a)u.has(A)||o.add(A);return[...o]};Ii.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${m$.inspect(t)}"`);if(Array.isArray(e))return e.some(o=>Ii.contains(t,o,r));if(typeof e=="string"){if(d$(t)||d$(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return Ii.isMatch(t,e,{...r,contains:!0})};Ii.matchKeys=(t,e,r)=>{if(!IN.isObject(t))throw new TypeError("Expected the first argument to be an object");let o=Ii(Object.keys(t),e,r),a={};for(let n of o)a[n]=t[n];return a};Ii.some=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Xu(String(a),r);if(o.some(u=>n(u)))return!0}return!1};Ii.every=(t,e,r)=>{let o=[].concat(t);for(let a of[].concat(e)){let n=Xu(String(a),r);if(!o.every(u=>n(u)))return!1}return!0};Ii.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${m$.inspect(t)}"`);return[].concat(e).every(o=>Xu(o,r)(t))};Ii.capture=(t,e,r)=>{let o=IN.isWindows(r),n=Xu.makeRe(String(t),{...r,capture:!0}).exec(o?IN.toPosixSlashes(e):e);if(n)return n.slice(1).map(u=>u===void 0?"":u)};Ii.makeRe=(...t)=>Xu.makeRe(...t);Ii.scan=(...t)=>Xu.scan(...t);Ii.parse=(t,e)=>{let r=[];for(let o of[].concat(t||[]))for(let a of y$(String(o),e))r.push(Xu.parse(a,e));return r};Ii.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:y$(t,e)};Ii.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return Ii.braces(t,{...e,expand:!0})};E$.exports=Ii});var I$=_((LQt,C$)=>{"use strict";C$.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var hP=_((NQt,w$)=>{"use strict";var j7e=I$();w$.exports=t=>typeof t=="string"?t.replace(j7e(),""):t});var v$=_((OQt,B$)=>{function G7e(){this.__data__=[],this.size=0}B$.exports=G7e});var Um=_((MQt,D$)=>{function W7e(t,e){return t===e||t!==t&&e!==e}D$.exports=W7e});var Jw=_((UQt,S$)=>{var Y7e=Um();function V7e(t,e){for(var r=t.length;r--;)if(Y7e(t[r][0],e))return r;return-1}S$.exports=V7e});var x$=_((_Qt,P$)=>{var K7e=Jw(),J7e=Array.prototype,z7e=J7e.splice;function X7e(t){var e=this.__data__,r=K7e(e,t);if(r<0)return!1;var o=e.length-1;return r==o?e.pop():z7e.call(e,r,1),--this.size,!0}P$.exports=X7e});var k$=_((HQt,b$)=>{var Z7e=Jw();function $7e(t){var e=this.__data__,r=Z7e(e,t);return r<0?void 0:e[r][1]}b$.exports=$7e});var F$=_((qQt,Q$)=>{var eWe=Jw();function tWe(t){return eWe(this.__data__,t)>-1}Q$.exports=tWe});var T$=_((jQt,R$)=>{var rWe=Jw();function nWe(t,e){var r=this.__data__,o=rWe(r,t);return o<0?(++this.size,r.push([t,e])):r[o][1]=e,this}R$.exports=nWe});var zw=_((GQt,L$)=>{var iWe=v$(),sWe=x$(),oWe=k$(),aWe=F$(),lWe=T$();function _m(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var cWe=zw();function uWe(){this.__data__=new cWe,this.size=0}N$.exports=uWe});var U$=_((YQt,M$)=>{function AWe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}M$.exports=AWe});var H$=_((VQt,_$)=>{function fWe(t){return this.__data__.get(t)}_$.exports=fWe});var j$=_((KQt,q$)=>{function pWe(t){return this.__data__.has(t)}q$.exports=pWe});var wN=_((JQt,G$)=>{var hWe=typeof global=="object"&&global&&global.Object===Object&&global;G$.exports=hWe});var ql=_((zQt,W$)=>{var gWe=wN(),dWe=typeof self=="object"&&self&&self.Object===Object&&self,mWe=gWe||dWe||Function("return this")();W$.exports=mWe});var dg=_((XQt,Y$)=>{var yWe=ql(),EWe=yWe.Symbol;Y$.exports=EWe});var z$=_((ZQt,J$)=>{var V$=dg(),K$=Object.prototype,CWe=K$.hasOwnProperty,IWe=K$.toString,Xw=V$?V$.toStringTag:void 0;function wWe(t){var e=CWe.call(t,Xw),r=t[Xw];try{t[Xw]=void 0;var o=!0}catch{}var a=IWe.call(t);return o&&(e?t[Xw]=r:delete t[Xw]),a}J$.exports=wWe});var Z$=_(($Qt,X$)=>{var BWe=Object.prototype,vWe=BWe.toString;function DWe(t){return vWe.call(t)}X$.exports=DWe});var mg=_((eFt,tee)=>{var $$=dg(),SWe=z$(),PWe=Z$(),xWe="[object Null]",bWe="[object Undefined]",eee=$$?$$.toStringTag:void 0;function kWe(t){return t==null?t===void 0?bWe:xWe:eee&&eee in Object(t)?SWe(t):PWe(t)}tee.exports=kWe});var cl=_((tFt,ree)=>{function QWe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}ree.exports=QWe});var gP=_((rFt,nee)=>{var FWe=mg(),RWe=cl(),TWe="[object AsyncFunction]",LWe="[object Function]",NWe="[object GeneratorFunction]",OWe="[object Proxy]";function MWe(t){if(!RWe(t))return!1;var e=FWe(t);return e==LWe||e==NWe||e==TWe||e==OWe}nee.exports=MWe});var see=_((nFt,iee)=>{var UWe=ql(),_We=UWe["__core-js_shared__"];iee.exports=_We});var lee=_((iFt,aee)=>{var BN=see(),oee=function(){var t=/[^.]+$/.exec(BN&&BN.keys&&BN.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function HWe(t){return!!oee&&oee in t}aee.exports=HWe});var vN=_((sFt,cee)=>{var qWe=Function.prototype,jWe=qWe.toString;function GWe(t){if(t!=null){try{return jWe.call(t)}catch{}try{return t+""}catch{}}return""}cee.exports=GWe});var Aee=_((oFt,uee)=>{var WWe=gP(),YWe=lee(),VWe=cl(),KWe=vN(),JWe=/[\\^$.*+?()[\]{}|]/g,zWe=/^\[object .+?Constructor\]$/,XWe=Function.prototype,ZWe=Object.prototype,$We=XWe.toString,eYe=ZWe.hasOwnProperty,tYe=RegExp("^"+$We.call(eYe).replace(JWe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function rYe(t){if(!VWe(t)||YWe(t))return!1;var e=WWe(t)?tYe:zWe;return e.test(KWe(t))}uee.exports=rYe});var pee=_((aFt,fee)=>{function nYe(t,e){return t?.[e]}fee.exports=nYe});var $p=_((lFt,hee)=>{var iYe=Aee(),sYe=pee();function oYe(t,e){var r=sYe(t,e);return iYe(r)?r:void 0}hee.exports=oYe});var dP=_((cFt,gee)=>{var aYe=$p(),lYe=ql(),cYe=aYe(lYe,"Map");gee.exports=cYe});var Zw=_((uFt,dee)=>{var uYe=$p(),AYe=uYe(Object,"create");dee.exports=AYe});var Eee=_((AFt,yee)=>{var mee=Zw();function fYe(){this.__data__=mee?mee(null):{},this.size=0}yee.exports=fYe});var Iee=_((fFt,Cee)=>{function pYe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}Cee.exports=pYe});var Bee=_((pFt,wee)=>{var hYe=Zw(),gYe="__lodash_hash_undefined__",dYe=Object.prototype,mYe=dYe.hasOwnProperty;function yYe(t){var e=this.__data__;if(hYe){var r=e[t];return r===gYe?void 0:r}return mYe.call(e,t)?e[t]:void 0}wee.exports=yYe});var Dee=_((hFt,vee)=>{var EYe=Zw(),CYe=Object.prototype,IYe=CYe.hasOwnProperty;function wYe(t){var e=this.__data__;return EYe?e[t]!==void 0:IYe.call(e,t)}vee.exports=wYe});var Pee=_((gFt,See)=>{var BYe=Zw(),vYe="__lodash_hash_undefined__";function DYe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=BYe&&e===void 0?vYe:e,this}See.exports=DYe});var bee=_((dFt,xee)=>{var SYe=Eee(),PYe=Iee(),xYe=Bee(),bYe=Dee(),kYe=Pee();function Hm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var kee=bee(),QYe=zw(),FYe=dP();function RYe(){this.size=0,this.__data__={hash:new kee,map:new(FYe||QYe),string:new kee}}Qee.exports=RYe});var Tee=_((yFt,Ree)=>{function TYe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}Ree.exports=TYe});var $w=_((EFt,Lee)=>{var LYe=Tee();function NYe(t,e){var r=t.__data__;return LYe(e)?r[typeof e=="string"?"string":"hash"]:r.map}Lee.exports=NYe});var Oee=_((CFt,Nee)=>{var OYe=$w();function MYe(t){var e=OYe(this,t).delete(t);return this.size-=e?1:0,e}Nee.exports=MYe});var Uee=_((IFt,Mee)=>{var UYe=$w();function _Ye(t){return UYe(this,t).get(t)}Mee.exports=_Ye});var Hee=_((wFt,_ee)=>{var HYe=$w();function qYe(t){return HYe(this,t).has(t)}_ee.exports=qYe});var jee=_((BFt,qee)=>{var jYe=$w();function GYe(t,e){var r=jYe(this,t),o=r.size;return r.set(t,e),this.size+=r.size==o?0:1,this}qee.exports=GYe});var mP=_((vFt,Gee)=>{var WYe=Fee(),YYe=Oee(),VYe=Uee(),KYe=Hee(),JYe=jee();function qm(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var zYe=zw(),XYe=dP(),ZYe=mP(),$Ye=200;function eVe(t,e){var r=this.__data__;if(r instanceof zYe){var o=r.__data__;if(!XYe||o.length<$Ye-1)return o.push([t,e]),this.size=++r.size,this;r=this.__data__=new ZYe(o)}return r.set(t,e),this.size=r.size,this}Wee.exports=eVe});var yP=_((SFt,Vee)=>{var tVe=zw(),rVe=O$(),nVe=U$(),iVe=H$(),sVe=j$(),oVe=Yee();function jm(t){var e=this.__data__=new tVe(t);this.size=e.size}jm.prototype.clear=rVe;jm.prototype.delete=nVe;jm.prototype.get=iVe;jm.prototype.has=sVe;jm.prototype.set=oVe;Vee.exports=jm});var Jee=_((PFt,Kee)=>{var aVe="__lodash_hash_undefined__";function lVe(t){return this.__data__.set(t,aVe),this}Kee.exports=lVe});var Xee=_((xFt,zee)=>{function cVe(t){return this.__data__.has(t)}zee.exports=cVe});var $ee=_((bFt,Zee)=>{var uVe=mP(),AVe=Jee(),fVe=Xee();function EP(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new uVe;++e{function pVe(t,e){for(var r=-1,o=t==null?0:t.length;++r{function hVe(t,e){return t.has(e)}rte.exports=hVe});var DN=_((FFt,ite)=>{var gVe=$ee(),dVe=tte(),mVe=nte(),yVe=1,EVe=2;function CVe(t,e,r,o,a,n){var u=r&yVe,A=t.length,p=e.length;if(A!=p&&!(u&&p>A))return!1;var h=n.get(t),E=n.get(e);if(h&&E)return h==e&&E==t;var w=-1,D=!0,b=r&EVe?new gVe:void 0;for(n.set(t,e),n.set(e,t);++w{var IVe=ql(),wVe=IVe.Uint8Array;ste.exports=wVe});var ate=_((TFt,ote)=>{function BVe(t){var e=-1,r=Array(t.size);return t.forEach(function(o,a){r[++e]=[a,o]}),r}ote.exports=BVe});var cte=_((LFt,lte)=>{function vVe(t){var e=-1,r=Array(t.size);return t.forEach(function(o){r[++e]=o}),r}lte.exports=vVe});var hte=_((NFt,pte)=>{var ute=dg(),Ate=SN(),DVe=Um(),SVe=DN(),PVe=ate(),xVe=cte(),bVe=1,kVe=2,QVe="[object Boolean]",FVe="[object Date]",RVe="[object Error]",TVe="[object Map]",LVe="[object Number]",NVe="[object RegExp]",OVe="[object Set]",MVe="[object String]",UVe="[object Symbol]",_Ve="[object ArrayBuffer]",HVe="[object DataView]",fte=ute?ute.prototype:void 0,PN=fte?fte.valueOf:void 0;function qVe(t,e,r,o,a,n,u){switch(r){case HVe:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case _Ve:return!(t.byteLength!=e.byteLength||!n(new Ate(t),new Ate(e)));case QVe:case FVe:case LVe:return DVe(+t,+e);case RVe:return t.name==e.name&&t.message==e.message;case NVe:case MVe:return t==e+"";case TVe:var A=PVe;case OVe:var p=o&bVe;if(A||(A=xVe),t.size!=e.size&&!p)return!1;var h=u.get(t);if(h)return h==e;o|=kVe,u.set(t,e);var E=SVe(A(t),A(e),o,a,n,u);return u.delete(t),E;case UVe:if(PN)return PN.call(t)==PN.call(e)}return!1}pte.exports=qVe});var CP=_((OFt,gte)=>{function jVe(t,e){for(var r=-1,o=e.length,a=t.length;++r{var GVe=Array.isArray;dte.exports=GVe});var xN=_((UFt,mte)=>{var WVe=CP(),YVe=jl();function VVe(t,e,r){var o=e(t);return YVe(t)?o:WVe(o,r(t))}mte.exports=VVe});var Ete=_((_Ft,yte)=>{function KVe(t,e){for(var r=-1,o=t==null?0:t.length,a=0,n=[];++r{function JVe(){return[]}Cte.exports=JVe});var IP=_((qFt,wte)=>{var zVe=Ete(),XVe=bN(),ZVe=Object.prototype,$Ve=ZVe.propertyIsEnumerable,Ite=Object.getOwnPropertySymbols,eKe=Ite?function(t){return t==null?[]:(t=Object(t),zVe(Ite(t),function(e){return $Ve.call(t,e)}))}:XVe;wte.exports=eKe});var vte=_((jFt,Bte)=>{function tKe(t,e){for(var r=-1,o=Array(t);++r{function rKe(t){return t!=null&&typeof t=="object"}Dte.exports=rKe});var Pte=_((WFt,Ste)=>{var nKe=mg(),iKe=Zu(),sKe="[object Arguments]";function oKe(t){return iKe(t)&&nKe(t)==sKe}Ste.exports=oKe});var e1=_((YFt,kte)=>{var xte=Pte(),aKe=Zu(),bte=Object.prototype,lKe=bte.hasOwnProperty,cKe=bte.propertyIsEnumerable,uKe=xte(function(){return arguments}())?xte:function(t){return aKe(t)&&lKe.call(t,"callee")&&!cKe.call(t,"callee")};kte.exports=uKe});var Fte=_((VFt,Qte)=>{function AKe(){return!1}Qte.exports=AKe});var r1=_((t1,Gm)=>{var fKe=ql(),pKe=Fte(),Lte=typeof t1=="object"&&t1&&!t1.nodeType&&t1,Rte=Lte&&typeof Gm=="object"&&Gm&&!Gm.nodeType&&Gm,hKe=Rte&&Rte.exports===Lte,Tte=hKe?fKe.Buffer:void 0,gKe=Tte?Tte.isBuffer:void 0,dKe=gKe||pKe;Gm.exports=dKe});var n1=_((KFt,Nte)=>{var mKe=9007199254740991,yKe=/^(?:0|[1-9]\d*)$/;function EKe(t,e){var r=typeof t;return e=e??mKe,!!e&&(r=="number"||r!="symbol"&&yKe.test(t))&&t>-1&&t%1==0&&t{var CKe=9007199254740991;function IKe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=CKe}Ote.exports=IKe});var Ute=_((zFt,Mte)=>{var wKe=mg(),BKe=wP(),vKe=Zu(),DKe="[object Arguments]",SKe="[object Array]",PKe="[object Boolean]",xKe="[object Date]",bKe="[object Error]",kKe="[object Function]",QKe="[object Map]",FKe="[object Number]",RKe="[object Object]",TKe="[object RegExp]",LKe="[object Set]",NKe="[object String]",OKe="[object WeakMap]",MKe="[object ArrayBuffer]",UKe="[object DataView]",_Ke="[object Float32Array]",HKe="[object Float64Array]",qKe="[object Int8Array]",jKe="[object Int16Array]",GKe="[object Int32Array]",WKe="[object Uint8Array]",YKe="[object Uint8ClampedArray]",VKe="[object Uint16Array]",KKe="[object Uint32Array]",di={};di[_Ke]=di[HKe]=di[qKe]=di[jKe]=di[GKe]=di[WKe]=di[YKe]=di[VKe]=di[KKe]=!0;di[DKe]=di[SKe]=di[MKe]=di[PKe]=di[UKe]=di[xKe]=di[bKe]=di[kKe]=di[QKe]=di[FKe]=di[RKe]=di[TKe]=di[LKe]=di[NKe]=di[OKe]=!1;function JKe(t){return vKe(t)&&BKe(t.length)&&!!di[wKe(t)]}Mte.exports=JKe});var BP=_((XFt,_te)=>{function zKe(t){return function(e){return t(e)}}_te.exports=zKe});var vP=_((i1,Wm)=>{var XKe=wN(),Hte=typeof i1=="object"&&i1&&!i1.nodeType&&i1,s1=Hte&&typeof Wm=="object"&&Wm&&!Wm.nodeType&&Wm,ZKe=s1&&s1.exports===Hte,kN=ZKe&&XKe.process,$Ke=function(){try{var t=s1&&s1.require&&s1.require("util").types;return t||kN&&kN.binding&&kN.binding("util")}catch{}}();Wm.exports=$Ke});var DP=_((ZFt,Gte)=>{var eJe=Ute(),tJe=BP(),qte=vP(),jte=qte&&qte.isTypedArray,rJe=jte?tJe(jte):eJe;Gte.exports=rJe});var QN=_(($Ft,Wte)=>{var nJe=vte(),iJe=e1(),sJe=jl(),oJe=r1(),aJe=n1(),lJe=DP(),cJe=Object.prototype,uJe=cJe.hasOwnProperty;function AJe(t,e){var r=sJe(t),o=!r&&iJe(t),a=!r&&!o&&oJe(t),n=!r&&!o&&!a&&lJe(t),u=r||o||a||n,A=u?nJe(t.length,String):[],p=A.length;for(var h in t)(e||uJe.call(t,h))&&!(u&&(h=="length"||a&&(h=="offset"||h=="parent")||n&&(h=="buffer"||h=="byteLength"||h=="byteOffset")||aJe(h,p)))&&A.push(h);return A}Wte.exports=AJe});var SP=_((eRt,Yte)=>{var fJe=Object.prototype;function pJe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||fJe;return t===r}Yte.exports=pJe});var FN=_((tRt,Vte)=>{function hJe(t,e){return function(r){return t(e(r))}}Vte.exports=hJe});var Jte=_((rRt,Kte)=>{var gJe=FN(),dJe=gJe(Object.keys,Object);Kte.exports=dJe});var Xte=_((nRt,zte)=>{var mJe=SP(),yJe=Jte(),EJe=Object.prototype,CJe=EJe.hasOwnProperty;function IJe(t){if(!mJe(t))return yJe(t);var e=[];for(var r in Object(t))CJe.call(t,r)&&r!="constructor"&&e.push(r);return e}zte.exports=IJe});var o1=_((iRt,Zte)=>{var wJe=gP(),BJe=wP();function vJe(t){return t!=null&&BJe(t.length)&&!wJe(t)}Zte.exports=vJe});var PP=_((sRt,$te)=>{var DJe=QN(),SJe=Xte(),PJe=o1();function xJe(t){return PJe(t)?DJe(t):SJe(t)}$te.exports=xJe});var RN=_((oRt,ere)=>{var bJe=xN(),kJe=IP(),QJe=PP();function FJe(t){return bJe(t,QJe,kJe)}ere.exports=FJe});var nre=_((aRt,rre)=>{var tre=RN(),RJe=1,TJe=Object.prototype,LJe=TJe.hasOwnProperty;function NJe(t,e,r,o,a,n){var u=r&RJe,A=tre(t),p=A.length,h=tre(e),E=h.length;if(p!=E&&!u)return!1;for(var w=p;w--;){var D=A[w];if(!(u?D in e:LJe.call(e,D)))return!1}var b=n.get(t),C=n.get(e);if(b&&C)return b==e&&C==t;var T=!0;n.set(t,e),n.set(e,t);for(var N=u;++w{var OJe=$p(),MJe=ql(),UJe=OJe(MJe,"DataView");ire.exports=UJe});var are=_((cRt,ore)=>{var _Je=$p(),HJe=ql(),qJe=_Je(HJe,"Promise");ore.exports=qJe});var cre=_((uRt,lre)=>{var jJe=$p(),GJe=ql(),WJe=jJe(GJe,"Set");lre.exports=WJe});var Are=_((ARt,ure)=>{var YJe=$p(),VJe=ql(),KJe=YJe(VJe,"WeakMap");ure.exports=KJe});var a1=_((fRt,yre)=>{var TN=sre(),LN=dP(),NN=are(),ON=cre(),MN=Are(),mre=mg(),Ym=vN(),fre="[object Map]",JJe="[object Object]",pre="[object Promise]",hre="[object Set]",gre="[object WeakMap]",dre="[object DataView]",zJe=Ym(TN),XJe=Ym(LN),ZJe=Ym(NN),$Je=Ym(ON),eze=Ym(MN),yg=mre;(TN&&yg(new TN(new ArrayBuffer(1)))!=dre||LN&&yg(new LN)!=fre||NN&&yg(NN.resolve())!=pre||ON&&yg(new ON)!=hre||MN&&yg(new MN)!=gre)&&(yg=function(t){var e=mre(t),r=e==JJe?t.constructor:void 0,o=r?Ym(r):"";if(o)switch(o){case zJe:return dre;case XJe:return fre;case ZJe:return pre;case $Je:return hre;case eze:return gre}return e});yre.exports=yg});var Sre=_((pRt,Dre)=>{var UN=yP(),tze=DN(),rze=hte(),nze=nre(),Ere=a1(),Cre=jl(),Ire=r1(),ize=DP(),sze=1,wre="[object Arguments]",Bre="[object Array]",xP="[object Object]",oze=Object.prototype,vre=oze.hasOwnProperty;function aze(t,e,r,o,a,n){var u=Cre(t),A=Cre(e),p=u?Bre:Ere(t),h=A?Bre:Ere(e);p=p==wre?xP:p,h=h==wre?xP:h;var E=p==xP,w=h==xP,D=p==h;if(D&&Ire(t)){if(!Ire(e))return!1;u=!0,E=!1}if(D&&!E)return n||(n=new UN),u||ize(t)?tze(t,e,r,o,a,n):rze(t,e,p,r,o,a,n);if(!(r&sze)){var b=E&&vre.call(t,"__wrapped__"),C=w&&vre.call(e,"__wrapped__");if(b||C){var T=b?t.value():t,N=C?e.value():e;return n||(n=new UN),a(T,N,r,o,n)}}return D?(n||(n=new UN),nze(t,e,r,o,a,n)):!1}Dre.exports=aze});var kre=_((hRt,bre)=>{var lze=Sre(),Pre=Zu();function xre(t,e,r,o,a){return t===e?!0:t==null||e==null||!Pre(t)&&!Pre(e)?t!==t&&e!==e:lze(t,e,r,o,xre,a)}bre.exports=xre});var Fre=_((gRt,Qre)=>{var cze=kre();function uze(t,e){return cze(t,e)}Qre.exports=uze});var _N=_((dRt,Rre)=>{var Aze=$p(),fze=function(){try{var t=Aze(Object,"defineProperty");return t({},"",{}),t}catch{}}();Rre.exports=fze});var bP=_((mRt,Lre)=>{var Tre=_N();function pze(t,e,r){e=="__proto__"&&Tre?Tre(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}Lre.exports=pze});var HN=_((yRt,Nre)=>{var hze=bP(),gze=Um();function dze(t,e,r){(r!==void 0&&!gze(t[e],r)||r===void 0&&!(e in t))&&hze(t,e,r)}Nre.exports=dze});var Mre=_((ERt,Ore)=>{function mze(t){return function(e,r,o){for(var a=-1,n=Object(e),u=o(e),A=u.length;A--;){var p=u[t?A:++a];if(r(n[p],p,n)===!1)break}return e}}Ore.exports=mze});var _re=_((CRt,Ure)=>{var yze=Mre(),Eze=yze();Ure.exports=Eze});var qN=_((l1,Vm)=>{var Cze=ql(),Gre=typeof l1=="object"&&l1&&!l1.nodeType&&l1,Hre=Gre&&typeof Vm=="object"&&Vm&&!Vm.nodeType&&Vm,Ize=Hre&&Hre.exports===Gre,qre=Ize?Cze.Buffer:void 0,jre=qre?qre.allocUnsafe:void 0;function wze(t,e){if(e)return t.slice();var r=t.length,o=jre?jre(r):new t.constructor(r);return t.copy(o),o}Vm.exports=wze});var kP=_((IRt,Yre)=>{var Wre=SN();function Bze(t){var e=new t.constructor(t.byteLength);return new Wre(e).set(new Wre(t)),e}Yre.exports=Bze});var jN=_((wRt,Vre)=>{var vze=kP();function Dze(t,e){var r=e?vze(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}Vre.exports=Dze});var QP=_((BRt,Kre)=>{function Sze(t,e){var r=-1,o=t.length;for(e||(e=Array(o));++r{var Pze=cl(),Jre=Object.create,xze=function(){function t(){}return function(e){if(!Pze(e))return{};if(Jre)return Jre(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();zre.exports=xze});var FP=_((DRt,Zre)=>{var bze=FN(),kze=bze(Object.getPrototypeOf,Object);Zre.exports=kze});var GN=_((SRt,$re)=>{var Qze=Xre(),Fze=FP(),Rze=SP();function Tze(t){return typeof t.constructor=="function"&&!Rze(t)?Qze(Fze(t)):{}}$re.exports=Tze});var tne=_((PRt,ene)=>{var Lze=o1(),Nze=Zu();function Oze(t){return Nze(t)&&Lze(t)}ene.exports=Oze});var WN=_((xRt,nne)=>{var Mze=mg(),Uze=FP(),_ze=Zu(),Hze="[object Object]",qze=Function.prototype,jze=Object.prototype,rne=qze.toString,Gze=jze.hasOwnProperty,Wze=rne.call(Object);function Yze(t){if(!_ze(t)||Mze(t)!=Hze)return!1;var e=Uze(t);if(e===null)return!0;var r=Gze.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&rne.call(r)==Wze}nne.exports=Yze});var YN=_((bRt,ine)=>{function Vze(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}ine.exports=Vze});var RP=_((kRt,sne)=>{var Kze=bP(),Jze=Um(),zze=Object.prototype,Xze=zze.hasOwnProperty;function Zze(t,e,r){var o=t[e];(!(Xze.call(t,e)&&Jze(o,r))||r===void 0&&!(e in t))&&Kze(t,e,r)}sne.exports=Zze});var Eg=_((QRt,one)=>{var $ze=RP(),eXe=bP();function tXe(t,e,r,o){var a=!r;r||(r={});for(var n=-1,u=e.length;++n{function rXe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}ane.exports=rXe});var une=_((RRt,cne)=>{var nXe=cl(),iXe=SP(),sXe=lne(),oXe=Object.prototype,aXe=oXe.hasOwnProperty;function lXe(t){if(!nXe(t))return sXe(t);var e=iXe(t),r=[];for(var o in t)o=="constructor"&&(e||!aXe.call(t,o))||r.push(o);return r}cne.exports=lXe});var Km=_((TRt,Ane)=>{var cXe=QN(),uXe=une(),AXe=o1();function fXe(t){return AXe(t)?cXe(t,!0):uXe(t)}Ane.exports=fXe});var pne=_((LRt,fne)=>{var pXe=Eg(),hXe=Km();function gXe(t){return pXe(t,hXe(t))}fne.exports=gXe});var Ene=_((NRt,yne)=>{var hne=HN(),dXe=qN(),mXe=jN(),yXe=QP(),EXe=GN(),gne=e1(),dne=jl(),CXe=tne(),IXe=r1(),wXe=gP(),BXe=cl(),vXe=WN(),DXe=DP(),mne=YN(),SXe=pne();function PXe(t,e,r,o,a,n,u){var A=mne(t,r),p=mne(e,r),h=u.get(p);if(h){hne(t,r,h);return}var E=n?n(A,p,r+"",t,e,u):void 0,w=E===void 0;if(w){var D=dne(p),b=!D&&IXe(p),C=!D&&!b&&DXe(p);E=p,D||b||C?dne(A)?E=A:CXe(A)?E=yXe(A):b?(w=!1,E=dXe(p,!0)):C?(w=!1,E=mXe(p,!0)):E=[]:vXe(p)||gne(p)?(E=A,gne(A)?E=SXe(A):(!BXe(A)||wXe(A))&&(E=EXe(p))):w=!1}w&&(u.set(p,E),a(E,p,o,n,u),u.delete(p)),hne(t,r,E)}yne.exports=PXe});var wne=_((ORt,Ine)=>{var xXe=yP(),bXe=HN(),kXe=_re(),QXe=Ene(),FXe=cl(),RXe=Km(),TXe=YN();function Cne(t,e,r,o,a){t!==e&&kXe(e,function(n,u){if(a||(a=new xXe),FXe(n))QXe(t,e,u,r,Cne,o,a);else{var A=o?o(TXe(t,u),n,u+"",t,e,a):void 0;A===void 0&&(A=n),bXe(t,u,A)}},RXe)}Ine.exports=Cne});var VN=_((MRt,Bne)=>{function LXe(t){return t}Bne.exports=LXe});var Dne=_((URt,vne)=>{function NXe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}vne.exports=NXe});var KN=_((_Rt,Pne)=>{var OXe=Dne(),Sne=Math.max;function MXe(t,e,r){return e=Sne(e===void 0?t.length-1:e,0),function(){for(var o=arguments,a=-1,n=Sne(o.length-e,0),u=Array(n);++a{function UXe(t){return function(){return t}}xne.exports=UXe});var Fne=_((qRt,Qne)=>{var _Xe=bne(),kne=_N(),HXe=VN(),qXe=kne?function(t,e){return kne(t,"toString",{configurable:!0,enumerable:!1,value:_Xe(e),writable:!0})}:HXe;Qne.exports=qXe});var Tne=_((jRt,Rne)=>{var jXe=800,GXe=16,WXe=Date.now;function YXe(t){var e=0,r=0;return function(){var o=WXe(),a=GXe-(o-r);if(r=o,a>0){if(++e>=jXe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}Rne.exports=YXe});var JN=_((GRt,Lne)=>{var VXe=Fne(),KXe=Tne(),JXe=KXe(VXe);Lne.exports=JXe});var One=_((WRt,Nne)=>{var zXe=VN(),XXe=KN(),ZXe=JN();function $Xe(t,e){return ZXe(XXe(t,e,zXe),t+"")}Nne.exports=$Xe});var Une=_((YRt,Mne)=>{var eZe=Um(),tZe=o1(),rZe=n1(),nZe=cl();function iZe(t,e,r){if(!nZe(r))return!1;var o=typeof e;return(o=="number"?tZe(r)&&rZe(e,r.length):o=="string"&&e in r)?eZe(r[e],t):!1}Mne.exports=iZe});var Hne=_((VRt,_ne)=>{var sZe=One(),oZe=Une();function aZe(t){return sZe(function(e,r){var o=-1,a=r.length,n=a>1?r[a-1]:void 0,u=a>2?r[2]:void 0;for(n=t.length>3&&typeof n=="function"?(a--,n):void 0,u&&oZe(r[0],r[1],u)&&(n=a<3?void 0:n,a=1),e=Object(e);++o{var lZe=wne(),cZe=Hne(),uZe=cZe(function(t,e,r,o){lZe(t,e,r,o)});qne.exports=uZe});var qe={};Vt(qe,{AsyncActions:()=>ZN,BufferStream:()=>XN,CachingStrategy:()=>tie,DefaultStream:()=>$N,allSettledSafe:()=>Wc,assertNever:()=>tO,bufferStream:()=>Xm,buildIgnorePattern:()=>mZe,convertMapsToIndexableObjects:()=>LP,dynamicRequire:()=>vf,escapeRegExp:()=>fZe,getArrayWithDefault:()=>u1,getFactoryWithDefault:()=>Al,getMapWithDefault:()=>A1,getSetWithDefault:()=>Jm,groupBy:()=>CZe,isIndexableObject:()=>zN,isPathLike:()=>yZe,isTaggedYarnVersion:()=>AZe,makeDeferred:()=>Zne,mapAndFilter:()=>ul,mapAndFind:()=>eh,mergeIntoTarget:()=>nie,overrideType:()=>pZe,parseBoolean:()=>f1,parseInt:()=>Zm,parseOptionalBoolean:()=>rie,plural:()=>TP,prettifyAsyncErrors:()=>zm,prettifySyncErrors:()=>rO,releaseAfterUseAsync:()=>gZe,replaceEnvVariables:()=>NP,sortMap:()=>Ss,toMerged:()=>EZe,tryParseOptionalBoolean:()=>nO,validateEnum:()=>hZe});function AZe(t){return!!(Jne.default.valid(t)&&t.match(/^[^-]+(-rc\.[0-9]+)?$/))}function TP(t,{one:e,more:r,zero:o=r}){return t===0?o:t===1?e:r}function fZe(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function pZe(t){}function tO(t){throw new Error(`Assertion failed: Unexpected object '${t}'`)}function hZe(t,e){let r=Object.values(t);if(!r.includes(e))throw new it(`Invalid value for enumeration: ${JSON.stringify(e)} (expected one of ${r.map(o=>JSON.stringify(o)).join(", ")})`);return e}function ul(t,e){let r=[];for(let o of t){let a=e(o);a!==zne&&r.push(a)}return r}function eh(t,e){for(let r of t){let o=e(r);if(o!==Xne)return o}}function zN(t){return typeof t=="object"&&t!==null}async function Wc(t){let e=await Promise.allSettled(t),r=[];for(let o of e){if(o.status==="rejected")throw o.reason;r.push(o.value)}return r}function LP(t){if(t instanceof Map&&(t=Object.fromEntries(t)),zN(t))for(let e of Object.keys(t)){let r=t[e];zN(r)&&(t[e]=LP(r))}return t}function Al(t,e,r){let o=t.get(e);return typeof o>"u"&&t.set(e,o=r()),o}function u1(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=[]),r}function Jm(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Set),r}function A1(t,e){let r=t.get(e);return typeof r>"u"&&t.set(e,r=new Map),r}async function gZe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function zm(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function rO(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Xm(t){return await new Promise((e,r)=>{let o=[];t.on("error",a=>{r(a)}),t.on("data",a=>{o.push(a)}),t.on("end",()=>{e(Buffer.concat(o))})})}function Zne(){let t,e;return{promise:new Promise((o,a)=>{t=o,e=a}),resolve:t,reject:e}}function $ne(t){return c1(Ae.fromPortablePath(t))}function eie(path){let physicalPath=Ae.fromPortablePath(path),currentCacheEntry=c1.cache[physicalPath];delete c1.cache[physicalPath];let result;try{result=$ne(physicalPath);let freshCacheEntry=c1.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{c1.cache[physicalPath]=currentCacheEntry}return result}function dZe(t){let e=Gne.get(t),r=ae.statSync(t);if(e?.mtime===r.mtimeMs)return e.instance;let o=eie(t);return Gne.set(t,{mtime:r.mtimeMs,instance:o}),o}function vf(t,{cachingStrategy:e=2}={}){switch(e){case 0:return eie(t);case 1:return dZe(t);case 2:return $ne(t);default:throw new Error("Unsupported caching strategy")}}function Ss(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function mZe(t){return t.length===0?null:t.map(e=>`(${Vne.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function NP(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...o)=>{let{variableName:a,colon:n,fallback:u}=o[o.length-1],A=Object.hasOwn(e,a),p=e[a];if(p||A&&!n)return p;if(u!=null)return u;throw new it(`Environment variable not found (${a})`)})}function f1(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function rie(t){return typeof t>"u"?t:f1(t)}function nO(t){try{return rie(t)}catch{return null}}function yZe(t){return!!(Ae.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}function nie(t,...e){let r=u=>({value:u}),o=r(t),a=e.map(u=>r(u)),{value:n}=(0,Yne.default)(o,...a,(u,A)=>{if(Array.isArray(u)&&Array.isArray(A)){for(let p of A)u.find(h=>(0,Wne.default)(h,p))||u.push(p);return u}});return n}function EZe(...t){return nie({},...t)}function CZe(t,e){let r=Object.create(null);for(let o of t){let a=o[e];r[a]??=[],r[a].push(o)}return r}function Zm(t){return typeof t=="string"?Number.parseInt(t,10):t}var Wne,Yne,Vne,Kne,Jne,eO,zne,Xne,XN,ZN,$N,c1,Gne,tie,Gl=It(()=>{St();Gt();Wne=et(Fre()),Yne=et(jne()),Vne=et(Xo()),Kne=et(lg()),Jne=et(ni()),eO=ve("stream");zne=Symbol();ul.skip=zne;Xne=Symbol();eh.skip=Xne;XN=class extends eO.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(r),a(null,null)}_flush(r){r(null,Buffer.concat(this.chunks))}};ZN=class{constructor(e){this.deferred=new Map;this.promises=new Map;this.limit=(0,Kne.default)(e)}set(e,r){let o=this.deferred.get(e);typeof o>"u"&&this.deferred.set(e,o=Zne());let a=this.limit(()=>r());return this.promises.set(e,a),a.then(()=>{this.promises.get(e)===a&&o.resolve()},n=>{this.promises.get(e)===a&&o.reject(n)}),o.promise}reduce(e,r){let o=this.promises.get(e)??Promise.resolve();this.set(e,()=>r(o))}async wait(){await Promise.all(this.promises.values())}},$N=class extends eO.Transform{constructor(r=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=r}_transform(r,o,a){if(o!=="buffer"||!Buffer.isBuffer(r))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,a(null,r)}_flush(r){this.active&&this.ifEmpty.length>0?r(null,this.ifEmpty):r(null)}},c1=eval("require");Gne=new Map;tie=(o=>(o[o.NoCache=0]="NoCache",o[o.FsTime=1]="FsTime",o[o.Node=2]="Node",o))(tie||{})});var $m,iO,sO,iie=It(()=>{$m=(r=>(r.HARD="HARD",r.SOFT="SOFT",r))($m||{}),iO=(o=>(o.Dependency="Dependency",o.PeerDependency="PeerDependency",o.PeerDependencyMeta="PeerDependencyMeta",o))(iO||{}),sO=(o=>(o.Inactive="inactive",o.Redundant="redundant",o.Active="active",o))(sO||{})});var pe={};Vt(pe,{LogLevel:()=>HP,Style:()=>MP,Type:()=>Ct,addLogFilterSupport:()=>g1,applyColor:()=>Gs,applyHyperlink:()=>ty,applyStyle:()=>Cg,json:()=>Ig,jsonOrPretty:()=>BZe,mark:()=>uO,pretty:()=>Ut,prettyField:()=>$u,prettyList:()=>cO,prettyTruncatedLocatorList:()=>_P,stripAnsi:()=>ey.default,supportsColor:()=>UP,supportsHyperlinks:()=>lO,tuple:()=>Yc});function sie(t){let e=["KiB","MiB","GiB","TiB"],r=e.length;for(;r>1&&t<1024**r;)r-=1;let o=1024**r;return`${Math.floor(t*100/o)/100} ${e[r-1]}`}function Yc(t,e){return[e,t]}function Cg(t,e,r){return t.get("enableColors")&&r&2&&(e=h1.default.bold(e)),e}function Gs(t,e,r){if(!t.get("enableColors"))return e;let o=IZe.get(r);if(o===null)return e;let a=typeof o>"u"?r:aO.level>=3?o[0]:o[1],n=typeof a=="number"?oO.ansi256(a):a.startsWith("#")?oO.hex(a):oO[a];if(typeof n!="function")throw new Error(`Invalid format type ${a}`);return n(e)}function ty(t,e,r){return t.get("enableHyperlinks")?wZe?`\x1B]8;;${r}\x1B\\${e}\x1B]8;;\x1B\\`:`\x1B]8;;${r}\x07${e}\x1B]8;;\x07`:e}function Ut(t,e,r){if(e===null)return Gs(t,"null",Ct.NULL);if(Object.hasOwn(OP,r))return OP[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return Gs(t,e,r)}function cO(t,e,r,{separator:o=", "}={}){return[...e].map(a=>Ut(t,a,r)).join(o)}function Ig(t,e){if(t===null)return null;if(Object.hasOwn(OP,e))return OP[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function BZe(t,e,[r,o]){return t?Ig(r,o):Ut(e,r,o)}function uO(t){return{Check:Gs(t,"\u2713","green"),Cross:Gs(t,"\u2718","red"),Question:Gs(t,"?","cyan")}}function $u(t,{label:e,value:[r,o]}){return`${Ut(t,e,Ct.CODE)}: ${Ut(t,r,o)}`}function _P(t,e,r){let o=[],a=[...e],n=r;for(;a.length>0;){let h=a[0],E=`${jr(t,h)}, `,w=AO(h).length+2;if(o.length>0&&nh).join("").slice(0,-2);let u="X".repeat(a.length.toString().length),A=`and ${u} more.`,p=a.length;for(;o.length>1&&nh).join(""),A.replace(u,Ut(t,p,Ct.NUMBER))].join("")}function g1(t,{configuration:e}){let r=e.get("logFilters"),o=new Map,a=new Map,n=[];for(let w of r){let D=w.get("level");if(typeof D>"u")continue;let b=w.get("code");typeof b<"u"&&o.set(b,D);let C=w.get("text");typeof C<"u"&&a.set(C,D);let T=w.get("pattern");typeof T<"u"&&n.push([oie.default.matcher(T,{contains:!0}),D])}n.reverse();let u=(w,D,b)=>{if(w===null||w===0)return b;let C=a.size>0||n.length>0?(0,ey.default)(D):D;if(a.size>0){let T=a.get(C);if(typeof T<"u")return T??b}if(n.length>0){for(let[T,N]of n)if(T(C))return N??b}if(o.size>0){let T=o.get(Ju(w));if(typeof T<"u")return T??b}return b},A=t.reportInfo,p=t.reportWarning,h=t.reportError,E=function(w,D,b,C){switch(u(D,b,C)){case"info":A.call(w,D,b);break;case"warning":p.call(w,D??0,b);break;case"error":h.call(w,D??0,b);break}};t.reportInfo=function(...w){return E(this,...w,"info")},t.reportWarning=function(...w){return E(this,...w,"warning")},t.reportError=function(...w){return E(this,...w,"error")}}var h1,p1,oie,ey,aie,Ct,MP,aO,UP,lO,oO,IZe,Co,OP,wZe,HP,Wl=It(()=>{St();h1=et(sN()),p1=et(sg());Gt();oie=et(Xo()),ey=et(hP()),aie=ve("util");GS();Io();Ct={NO_HINT:"NO_HINT",ID:"ID",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",INSPECT:"INSPECT",DURATION:"DURATION",SIZE:"SIZE",SIZE_DIFF:"SIZE_DIFF",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING",MARKDOWN:"MARKDOWN",MARKDOWN_INLINE:"MARKDOWN_INLINE"},MP=(e=>(e[e.BOLD=2]="BOLD",e))(MP||{}),aO=p1.default.GITHUB_ACTIONS?{level:2}:h1.default.supportsColor?{level:h1.default.supportsColor.level}:{level:0},UP=aO.level!==0,lO=UP&&!p1.default.GITHUB_ACTIONS&&!p1.default.CIRCLE&&!p1.default.GITLAB,oO=new h1.default.Instance(aO),IZe=new Map([[Ct.NO_HINT,null],[Ct.NULL,["#a853b5",129]],[Ct.SCOPE,["#d75f00",166]],[Ct.NAME,["#d7875f",173]],[Ct.RANGE,["#00afaf",37]],[Ct.REFERENCE,["#87afff",111]],[Ct.NUMBER,["#ffd700",220]],[Ct.PATH,["#d75fd7",170]],[Ct.URL,["#d75fd7",170]],[Ct.ADDED,["#5faf00",70]],[Ct.REMOVED,["#ff3131",160]],[Ct.CODE,["#87afff",111]],[Ct.SIZE,["#ffd700",220]]]),Co=t=>t;OP={[Ct.ID]:Co({pretty:(t,e)=>typeof e=="number"?Gs(t,`${e}`,Ct.NUMBER):Gs(t,e,Ct.CODE),json:t=>t}),[Ct.INSPECT]:Co({pretty:(t,e)=>(0,aie.inspect)(e,{depth:1/0,colors:t.get("enableColors"),compact:!0,breakLength:1/0}),json:t=>t}),[Ct.NUMBER]:Co({pretty:(t,e)=>Gs(t,`${e}`,Ct.NUMBER),json:t=>t}),[Ct.IDENT]:Co({pretty:(t,e)=>Ui(t,e),json:t=>rn(t)}),[Ct.LOCATOR]:Co({pretty:(t,e)=>jr(t,e),json:t=>Qa(t)}),[Ct.DESCRIPTOR]:Co({pretty:(t,e)=>Jn(t,e),json:t=>ka(t)}),[Ct.RESOLUTION]:Co({pretty:(t,{descriptor:e,locator:r})=>d1(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:ka(t),locator:e!==null?Qa(e):null})}),[Ct.DEPENDENT]:Co({pretty:(t,{locator:e,descriptor:r})=>fO(t,e,r),json:({locator:t,descriptor:e})=>({locator:Qa(t),descriptor:ka(e)})}),[Ct.PACKAGE_EXTENSION]:Co({pretty:(t,e)=>{switch(e.type){case"Dependency":return`${Ui(t,e.parentDescriptor)} \u27A4 ${Gs(t,"dependencies",Ct.CODE)} \u27A4 ${Ui(t,e.descriptor)}`;case"PeerDependency":return`${Ui(t,e.parentDescriptor)} \u27A4 ${Gs(t,"peerDependencies",Ct.CODE)} \u27A4 ${Ui(t,e.descriptor)}`;case"PeerDependencyMeta":return`${Ui(t,e.parentDescriptor)} \u27A4 ${Gs(t,"peerDependenciesMeta",Ct.CODE)} \u27A4 ${Ui(t,Zo(e.selector))} \u27A4 ${Gs(t,e.key,Ct.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case"Dependency":return`${rn(t.parentDescriptor)} > ${rn(t.descriptor)}`;case"PeerDependency":return`${rn(t.parentDescriptor)} >> ${rn(t.descriptor)}`;case"PeerDependencyMeta":return`${rn(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Ct.SETTING]:Co({pretty:(t,e)=>(t.get(e),ty(t,Gs(t,e,Ct.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Ct.DURATION]:Co({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),o=Math.ceil((e-r*60*1e3)/1e3);return o===0?`${r}m`:`${r}m ${o}s`}else{let r=Math.floor(e/1e3),o=e-r*1e3;return o===0?`${r}s`:`${r}s ${o}ms`}},json:t=>t}),[Ct.SIZE]:Co({pretty:(t,e)=>Gs(t,sie(e),Ct.NUMBER),json:t=>t}),[Ct.SIZE_DIFF]:Co({pretty:(t,e)=>{let r=e>=0?"+":"-",o=r==="+"?Ct.REMOVED:Ct.ADDED;return Gs(t,`${r} ${sie(Math.max(Math.abs(e),1))}`,o)},json:t=>t}),[Ct.PATH]:Co({pretty:(t,e)=>Gs(t,Ae.fromPortablePath(e),Ct.PATH),json:t=>Ae.fromPortablePath(t)}),[Ct.MARKDOWN]:Co({pretty:(t,{text:e,format:r,paragraphs:o})=>yo(e,{format:r,paragraphs:o}),json:({text:t})=>t}),[Ct.MARKDOWN_INLINE]:Co({pretty:(t,e)=>(e=e.replace(/(`+)((?:.|[\n])*?)\1/g,(r,o,a)=>Ut(t,o+a+o,Ct.CODE)),e=e.replace(/(\*\*)((?:.|[\n])*?)\1/g,(r,o,a)=>Cg(t,a,2)),e),json:t=>t})};wZe=!!process.env.KONSOLE_VERSION;HP=(a=>(a.Error="error",a.Warning="warning",a.Info="info",a.Discard="discard",a))(HP||{})});var lie=_(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.splitWhen=ry.flatten=void 0;function vZe(t){return t.reduce((e,r)=>[].concat(e,r),[])}ry.flatten=vZe;function DZe(t,e){let r=[[]],o=0;for(let a of t)e(a)?(o++,r[o]=[]):r[o].push(a);return r}ry.splitWhen=DZe});var cie=_(qP=>{"use strict";Object.defineProperty(qP,"__esModule",{value:!0});qP.isEnoentCodeError=void 0;function SZe(t){return t.code==="ENOENT"}qP.isEnoentCodeError=SZe});var uie=_(jP=>{"use strict";Object.defineProperty(jP,"__esModule",{value:!0});jP.createDirentFromStats=void 0;var pO=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function PZe(t,e){return new pO(t,e)}jP.createDirentFromStats=PZe});var hie=_(Ki=>{"use strict";Object.defineProperty(Ki,"__esModule",{value:!0});Ki.convertPosixPathToPattern=Ki.convertWindowsPathToPattern=Ki.convertPathToPattern=Ki.escapePosixPath=Ki.escapeWindowsPath=Ki.escape=Ki.removeLeadingDotSegment=Ki.makeAbsolute=Ki.unixify=void 0;var xZe=ve("os"),bZe=ve("path"),Aie=xZe.platform()==="win32",kZe=2,QZe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\()|\\(?![!()*+?@[\]{|}]))/g,FZe=/(\\?)([()[\]{}]|^!|[!+@](?=\())/g,RZe=/^\\\\([.?])/,TZe=/\\(?![!()+@[\]{}])/g;function LZe(t){return t.replace(/\\/g,"/")}Ki.unixify=LZe;function NZe(t,e){return bZe.resolve(t,e)}Ki.makeAbsolute=NZe;function OZe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(kZe)}return t}Ki.removeLeadingDotSegment=OZe;Ki.escape=Aie?hO:gO;function hO(t){return t.replace(FZe,"\\$2")}Ki.escapeWindowsPath=hO;function gO(t){return t.replace(QZe,"\\$2")}Ki.escapePosixPath=gO;Ki.convertPathToPattern=Aie?fie:pie;function fie(t){return hO(t).replace(RZe,"//$1").replace(TZe,"/")}Ki.convertWindowsPathToPattern=fie;function pie(t){return gO(t)}Ki.convertPosixPathToPattern=pie});var die=_((cTt,gie)=>{gie.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var Eie=_((uTt,yie)=>{var MZe=die(),mie={"{":"}","(":")","[":"]"},UZe=function(t){if(t[0]==="!")return!0;for(var e=0,r=-2,o=-2,a=-2,n=-2,u=-2;ee&&(u===-1||u>o||(u=t.indexOf("\\",e),u===-1||u>o)))||a!==-1&&t[e]==="{"&&t[e+1]!=="}"&&(a=t.indexOf("}",e),a>e&&(u=t.indexOf("\\",e),u===-1||u>a))||n!==-1&&t[e]==="("&&t[e+1]==="?"&&/[:!=]/.test(t[e+2])&&t[e+3]!==")"&&(n=t.indexOf(")",e),n>e&&(u=t.indexOf("\\",e),u===-1||u>n))||r!==-1&&t[e]==="("&&t[e+1]!=="|"&&(rr&&(u=t.indexOf("\\",r),u===-1||u>n))))return!0;if(t[e]==="\\"){var A=t[e+1];e+=2;var p=mie[A];if(p){var h=t.indexOf(p,e);h!==-1&&(e=h+1)}if(t[e]==="!")return!0}else e++}return!1},_Ze=function(t){if(t[0]==="!")return!0;for(var e=0;e{"use strict";var HZe=Eie(),qZe=ve("path").posix.dirname,jZe=ve("os").platform()==="win32",dO="/",GZe=/\\/g,WZe=/[\{\[].*[\}\]]$/,YZe=/(^|[^\\])([\{\[]|\([^\)]+$)/,VZe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;Cie.exports=function(e,r){var o=Object.assign({flipBackslashes:!0},r);o.flipBackslashes&&jZe&&e.indexOf(dO)<0&&(e=e.replace(GZe,dO)),WZe.test(e)&&(e+=dO),e+="a";do e=qZe(e);while(HZe(e)||YZe.test(e));return e.replace(VZe,"$1")}});var bie=_(Mr=>{"use strict";Object.defineProperty(Mr,"__esModule",{value:!0});Mr.removeDuplicateSlashes=Mr.matchAny=Mr.convertPatternsToRe=Mr.makeRe=Mr.getPatternParts=Mr.expandBraceExpansion=Mr.expandPatternsWithBraceExpansion=Mr.isAffectDepthOfReadingPattern=Mr.endsWithSlashGlobStar=Mr.hasGlobStar=Mr.getBaseDirectory=Mr.isPatternRelatedToParentDirectory=Mr.getPatternsOutsideCurrentDirectory=Mr.getPatternsInsideCurrentDirectory=Mr.getPositivePatterns=Mr.getNegativePatterns=Mr.isPositivePattern=Mr.isNegativePattern=Mr.convertToNegativePattern=Mr.convertToPositivePattern=Mr.isDynamicPattern=Mr.isStaticPattern=void 0;var KZe=ve("path"),JZe=Iie(),mO=Xo(),wie="**",zZe="\\",XZe=/[*?]|^!/,ZZe=/\[[^[]*]/,$Ze=/(?:^|[^!*+?@])\([^(]*\|[^|]*\)/,e$e=/[!*+?@]\([^(]*\)/,t$e=/,|\.\./,r$e=/(?!^)\/{2,}/g;function Bie(t,e={}){return!vie(t,e)}Mr.isStaticPattern=Bie;function vie(t,e={}){return t===""?!1:!!(e.caseSensitiveMatch===!1||t.includes(zZe)||XZe.test(t)||ZZe.test(t)||$Ze.test(t)||e.extglob!==!1&&e$e.test(t)||e.braceExpansion!==!1&&n$e(t))}Mr.isDynamicPattern=vie;function n$e(t){let e=t.indexOf("{");if(e===-1)return!1;let r=t.indexOf("}",e+1);if(r===-1)return!1;let o=t.slice(e,r);return t$e.test(o)}function i$e(t){return GP(t)?t.slice(1):t}Mr.convertToPositivePattern=i$e;function s$e(t){return"!"+t}Mr.convertToNegativePattern=s$e;function GP(t){return t.startsWith("!")&&t[1]!=="("}Mr.isNegativePattern=GP;function Die(t){return!GP(t)}Mr.isPositivePattern=Die;function o$e(t){return t.filter(GP)}Mr.getNegativePatterns=o$e;function a$e(t){return t.filter(Die)}Mr.getPositivePatterns=a$e;function l$e(t){return t.filter(e=>!yO(e))}Mr.getPatternsInsideCurrentDirectory=l$e;function c$e(t){return t.filter(yO)}Mr.getPatternsOutsideCurrentDirectory=c$e;function yO(t){return t.startsWith("..")||t.startsWith("./..")}Mr.isPatternRelatedToParentDirectory=yO;function u$e(t){return JZe(t,{flipBackslashes:!1})}Mr.getBaseDirectory=u$e;function A$e(t){return t.includes(wie)}Mr.hasGlobStar=A$e;function Sie(t){return t.endsWith("/"+wie)}Mr.endsWithSlashGlobStar=Sie;function f$e(t){let e=KZe.basename(t);return Sie(t)||Bie(e)}Mr.isAffectDepthOfReadingPattern=f$e;function p$e(t){return t.reduce((e,r)=>e.concat(Pie(r)),[])}Mr.expandPatternsWithBraceExpansion=p$e;function Pie(t){let e=mO.braces(t,{expand:!0,nodupes:!0,keepEscaping:!0});return e.sort((r,o)=>r.length-o.length),e.filter(r=>r!=="")}Mr.expandBraceExpansion=Pie;function h$e(t,e){let{parts:r}=mO.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.length===0&&(r=[t]),r[0].startsWith("/")&&(r[0]=r[0].slice(1),r.unshift("")),r}Mr.getPatternParts=h$e;function xie(t,e){return mO.makeRe(t,e)}Mr.makeRe=xie;function g$e(t,e){return t.map(r=>xie(r,e))}Mr.convertPatternsToRe=g$e;function d$e(t,e){return e.some(r=>r.test(t))}Mr.matchAny=d$e;function m$e(t){return t.replace(r$e,"/")}Mr.removeDuplicateSlashes=m$e});var Rie=_((pTt,Fie)=>{"use strict";var y$e=ve("stream"),kie=y$e.PassThrough,E$e=Array.prototype.slice;Fie.exports=C$e;function C$e(){let t=[],e=E$e.call(arguments),r=!1,o=e[e.length-1];o&&!Array.isArray(o)&&o.pipe==null?e.pop():o={};let a=o.end!==!1,n=o.pipeError===!0;o.objectMode==null&&(o.objectMode=!0),o.highWaterMark==null&&(o.highWaterMark=64*1024);let u=kie(o);function A(){for(let E=0,w=arguments.length;E0||(r=!1,p())}function b(C){function T(){C.removeListener("merge2UnpipeEnd",T),C.removeListener("end",T),n&&C.removeListener("error",N),D()}function N(U){u.emit("error",U)}if(C._readableState.endEmitted)return D();C.on("merge2UnpipeEnd",T),C.on("end",T),n&&C.on("error",N),C.pipe(u,{end:!1}),C.resume()}for(let C=0;C{"use strict";Object.defineProperty(WP,"__esModule",{value:!0});WP.merge=void 0;var I$e=Rie();function w$e(t){let e=I$e(t);return t.forEach(r=>{r.once("error",o=>e.emit("error",o))}),e.once("close",()=>Tie(t)),e.once("end",()=>Tie(t)),e}WP.merge=w$e;function Tie(t){t.forEach(e=>e.emit("close"))}});var Nie=_(ny=>{"use strict";Object.defineProperty(ny,"__esModule",{value:!0});ny.isEmpty=ny.isString=void 0;function B$e(t){return typeof t=="string"}ny.isString=B$e;function v$e(t){return t===""}ny.isEmpty=v$e});var Df=_(wo=>{"use strict";Object.defineProperty(wo,"__esModule",{value:!0});wo.string=wo.stream=wo.pattern=wo.path=wo.fs=wo.errno=wo.array=void 0;var D$e=lie();wo.array=D$e;var S$e=cie();wo.errno=S$e;var P$e=uie();wo.fs=P$e;var x$e=hie();wo.path=x$e;var b$e=bie();wo.pattern=b$e;var k$e=Lie();wo.stream=k$e;var Q$e=Nie();wo.string=Q$e});var _ie=_(Bo=>{"use strict";Object.defineProperty(Bo,"__esModule",{value:!0});Bo.convertPatternGroupToTask=Bo.convertPatternGroupsToTasks=Bo.groupPatternsByBaseDirectory=Bo.getNegativePatternsAsPositive=Bo.getPositivePatterns=Bo.convertPatternsToTasks=Bo.generate=void 0;var Vc=Df();function F$e(t,e){let r=Oie(t,e),o=Oie(e.ignore,e),a=Mie(r),n=Uie(r,o),u=a.filter(E=>Vc.pattern.isStaticPattern(E,e)),A=a.filter(E=>Vc.pattern.isDynamicPattern(E,e)),p=EO(u,n,!1),h=EO(A,n,!0);return p.concat(h)}Bo.generate=F$e;function Oie(t,e){let r=t;return e.braceExpansion&&(r=Vc.pattern.expandPatternsWithBraceExpansion(r)),e.baseNameMatch&&(r=r.map(o=>o.includes("/")?o:`**/${o}`)),r.map(o=>Vc.pattern.removeDuplicateSlashes(o))}function EO(t,e,r){let o=[],a=Vc.pattern.getPatternsOutsideCurrentDirectory(t),n=Vc.pattern.getPatternsInsideCurrentDirectory(t),u=CO(a),A=CO(n);return o.push(...IO(u,e,r)),"."in A?o.push(wO(".",n,e,r)):o.push(...IO(A,e,r)),o}Bo.convertPatternsToTasks=EO;function Mie(t){return Vc.pattern.getPositivePatterns(t)}Bo.getPositivePatterns=Mie;function Uie(t,e){return Vc.pattern.getNegativePatterns(t).concat(e).map(Vc.pattern.convertToPositivePattern)}Bo.getNegativePatternsAsPositive=Uie;function CO(t){let e={};return t.reduce((r,o)=>{let a=Vc.pattern.getBaseDirectory(o);return a in r?r[a].push(o):r[a]=[o],r},e)}Bo.groupPatternsByBaseDirectory=CO;function IO(t,e,r){return Object.keys(t).map(o=>wO(o,t[o],e,r))}Bo.convertPatternGroupsToTasks=IO;function wO(t,e,r,o){return{dynamic:o,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Vc.pattern.convertToNegativePattern))}}Bo.convertPatternGroupToTask=wO});var qie=_(YP=>{"use strict";Object.defineProperty(YP,"__esModule",{value:!0});YP.read=void 0;function R$e(t,e,r){e.fs.lstat(t,(o,a)=>{if(o!==null){Hie(r,o);return}if(!a.isSymbolicLink()||!e.followSymbolicLink){BO(r,a);return}e.fs.stat(t,(n,u)=>{if(n!==null){if(e.throwErrorOnBrokenSymbolicLink){Hie(r,n);return}BO(r,a);return}e.markSymbolicLink&&(u.isSymbolicLink=()=>!0),BO(r,u)})})}YP.read=R$e;function Hie(t,e){t(e)}function BO(t,e){t(null,e)}});var jie=_(VP=>{"use strict";Object.defineProperty(VP,"__esModule",{value:!0});VP.read=void 0;function T$e(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let o=e.fs.statSync(t);return e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),o}catch(o){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw o}}VP.read=T$e});var Gie=_(th=>{"use strict";Object.defineProperty(th,"__esModule",{value:!0});th.createFileSystemAdapter=th.FILE_SYSTEM_ADAPTER=void 0;var KP=ve("fs");th.FILE_SYSTEM_ADAPTER={lstat:KP.lstat,stat:KP.stat,lstatSync:KP.lstatSync,statSync:KP.statSync};function L$e(t){return t===void 0?th.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},th.FILE_SYSTEM_ADAPTER),t)}th.createFileSystemAdapter=L$e});var Wie=_(DO=>{"use strict";Object.defineProperty(DO,"__esModule",{value:!0});var N$e=Gie(),vO=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=N$e.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e??r}};DO.default=vO});var wg=_(rh=>{"use strict";Object.defineProperty(rh,"__esModule",{value:!0});rh.statSync=rh.stat=rh.Settings=void 0;var Yie=qie(),O$e=jie(),SO=Wie();rh.Settings=SO.default;function M$e(t,e,r){if(typeof e=="function"){Yie.read(t,PO(),e);return}Yie.read(t,PO(e),r)}rh.stat=M$e;function U$e(t,e){let r=PO(e);return O$e.read(t,r)}rh.statSync=U$e;function PO(t={}){return t instanceof SO.default?t:new SO.default(t)}});var Jie=_((BTt,Kie)=>{var Vie;Kie.exports=typeof queueMicrotask=="function"?queueMicrotask.bind(typeof window<"u"?window:global):t=>(Vie||(Vie=Promise.resolve())).then(t).catch(e=>setTimeout(()=>{throw e},0))});var Xie=_((vTt,zie)=>{zie.exports=H$e;var _$e=Jie();function H$e(t,e){let r,o,a,n=!0;Array.isArray(t)?(r=[],o=t.length):(a=Object.keys(t),r={},o=a.length);function u(p){function h(){e&&e(p,r),e=null}n?_$e(h):h()}function A(p,h,E){r[p]=E,(--o===0||h)&&u(h)}o?a?a.forEach(function(p){t[p](function(h,E){A(p,h,E)})}):t.forEach(function(p,h){p(function(E,w){A(h,E,w)})}):u(null),n=!1}});var xO=_(zP=>{"use strict";Object.defineProperty(zP,"__esModule",{value:!0});zP.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var JP=process.versions.node.split(".");if(JP[0]===void 0||JP[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var Zie=Number.parseInt(JP[0],10),q$e=Number.parseInt(JP[1],10),$ie=10,j$e=10,G$e=Zie>$ie,W$e=Zie===$ie&&q$e>=j$e;zP.IS_SUPPORT_READDIR_WITH_FILE_TYPES=G$e||W$e});var ese=_(XP=>{"use strict";Object.defineProperty(XP,"__esModule",{value:!0});XP.createDirentFromStats=void 0;var bO=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Y$e(t,e){return new bO(t,e)}XP.createDirentFromStats=Y$e});var kO=_(ZP=>{"use strict";Object.defineProperty(ZP,"__esModule",{value:!0});ZP.fs=void 0;var V$e=ese();ZP.fs=V$e});var QO=_($P=>{"use strict";Object.defineProperty($P,"__esModule",{value:!0});$P.joinPathSegments=void 0;function K$e(t,e,r){return t.endsWith(r)?t+e:t+r+e}$P.joinPathSegments=K$e});var ose=_(nh=>{"use strict";Object.defineProperty(nh,"__esModule",{value:!0});nh.readdir=nh.readdirWithFileTypes=nh.read=void 0;var J$e=wg(),tse=Xie(),z$e=xO(),rse=kO(),nse=QO();function X$e(t,e,r){if(!e.stats&&z$e.IS_SUPPORT_READDIR_WITH_FILE_TYPES){ise(t,e,r);return}sse(t,e,r)}nh.read=X$e;function ise(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(o,a)=>{if(o!==null){ex(r,o);return}let n=a.map(A=>({dirent:A,name:A.name,path:nse.joinPathSegments(t,A.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){FO(r,n);return}let u=n.map(A=>Z$e(A,e));tse(u,(A,p)=>{if(A!==null){ex(r,A);return}FO(r,p)})})}nh.readdirWithFileTypes=ise;function Z$e(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(o,a)=>{if(o!==null){if(e.throwErrorOnBrokenSymbolicLink){r(o);return}r(null,t);return}t.dirent=rse.fs.createDirentFromStats(t.name,a),r(null,t)})}}function sse(t,e,r){e.fs.readdir(t,(o,a)=>{if(o!==null){ex(r,o);return}let n=a.map(u=>{let A=nse.joinPathSegments(t,u,e.pathSegmentSeparator);return p=>{J$e.stat(A,e.fsStatSettings,(h,E)=>{if(h!==null){p(h);return}let w={name:u,path:A,dirent:rse.fs.createDirentFromStats(u,E)};e.stats&&(w.stats=E),p(null,w)})}});tse(n,(u,A)=>{if(u!==null){ex(r,u);return}FO(r,A)})})}nh.readdir=sse;function ex(t,e){t(e)}function FO(t,e){t(null,e)}});var Ase=_(ih=>{"use strict";Object.defineProperty(ih,"__esModule",{value:!0});ih.readdir=ih.readdirWithFileTypes=ih.read=void 0;var $$e=wg(),eet=xO(),ase=kO(),lse=QO();function tet(t,e){return!e.stats&&eet.IS_SUPPORT_READDIR_WITH_FILE_TYPES?cse(t,e):use(t,e)}ih.read=tet;function cse(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(o=>{let a={dirent:o,name:o.name,path:lse.joinPathSegments(t,o.name,e.pathSegmentSeparator)};if(a.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let n=e.fs.statSync(a.path);a.dirent=ase.fs.createDirentFromStats(a.name,n)}catch(n){if(e.throwErrorOnBrokenSymbolicLink)throw n}return a})}ih.readdirWithFileTypes=cse;function use(t,e){return e.fs.readdirSync(t).map(o=>{let a=lse.joinPathSegments(t,o,e.pathSegmentSeparator),n=$$e.statSync(a,e.fsStatSettings),u={name:o,path:a,dirent:ase.fs.createDirentFromStats(o,n)};return e.stats&&(u.stats=n),u})}ih.readdir=use});var fse=_(sh=>{"use strict";Object.defineProperty(sh,"__esModule",{value:!0});sh.createFileSystemAdapter=sh.FILE_SYSTEM_ADAPTER=void 0;var iy=ve("fs");sh.FILE_SYSTEM_ADAPTER={lstat:iy.lstat,stat:iy.stat,lstatSync:iy.lstatSync,statSync:iy.statSync,readdir:iy.readdir,readdirSync:iy.readdirSync};function ret(t){return t===void 0?sh.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},sh.FILE_SYSTEM_ADAPTER),t)}sh.createFileSystemAdapter=ret});var pse=_(TO=>{"use strict";Object.defineProperty(TO,"__esModule",{value:!0});var net=ve("path"),iet=wg(),set=fse(),RO=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=set.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,net.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new iet.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};TO.default=RO});var tx=_(oh=>{"use strict";Object.defineProperty(oh,"__esModule",{value:!0});oh.Settings=oh.scandirSync=oh.scandir=void 0;var hse=ose(),oet=Ase(),LO=pse();oh.Settings=LO.default;function aet(t,e,r){if(typeof e=="function"){hse.read(t,NO(),e);return}hse.read(t,NO(e),r)}oh.scandir=aet;function cet(t,e){let r=NO(e);return oet.read(t,r)}oh.scandirSync=cet;function NO(t={}){return t instanceof LO.default?t:new LO.default(t)}});var dse=_((TTt,gse)=>{"use strict";function uet(t){var e=new t,r=e;function o(){var n=e;return n.next?e=n.next:(e=new t,r=e),n.next=null,n}function a(n){r.next=n,r=n}return{get:o,release:a}}gse.exports=uet});var yse=_((LTt,OO)=>{"use strict";var Aet=dse();function mse(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),!(r>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");var o=Aet(fet),a=null,n=null,u=0,A=null,p={push:T,drain:Yl,saturated:Yl,pause:E,paused:!1,get concurrency(){return r},set concurrency(ce){if(!(ce>=1))throw new Error("fastqueue concurrency must be equal to or greater than 1");if(r=ce,!p.paused)for(;a&&u=r||p.paused?n?(n.next=Ie,n=Ie):(a=Ie,n=Ie,p.saturated()):(u++,e.call(t,Ie.value,Ie.worked))}function N(ce,ue){var Ie=o.get();Ie.context=t,Ie.release=U,Ie.value=ce,Ie.callback=ue||Yl,Ie.errorHandler=A,u>=r||p.paused?a?(Ie.next=a,a=Ie):(a=Ie,n=Ie,p.saturated()):(u++,e.call(t,Ie.value,Ie.worked))}function U(ce){ce&&o.release(ce);var ue=a;ue&&u<=r?p.paused?u--:(n===a&&(n=null),a=ue.next,ue.next=null,e.call(t,ue.value,ue.worked),n===null&&p.empty()):--u===0&&p.drain()}function J(){a=null,n=null,p.drain=Yl}function te(){a=null,n=null,p.drain(),p.drain=Yl}function le(ce){A=ce}}function Yl(){}function fet(){this.value=null,this.callback=Yl,this.next=null,this.release=Yl,this.context=null,this.errorHandler=null;var t=this;this.worked=function(r,o){var a=t.callback,n=t.errorHandler,u=t.value;t.value=null,t.callback=Yl,t.errorHandler&&n(r,u),a.call(t.context,r,o),t.release(t)}}function pet(t,e,r){typeof t=="function"&&(r=e,e=t,t=null);function o(E,w){e.call(this,E).then(function(D){w(null,D)},w)}var a=mse(t,o,r),n=a.push,u=a.unshift;return a.push=A,a.unshift=p,a.drained=h,a;function A(E){var w=new Promise(function(D,b){n(E,function(C,T){if(C){b(C);return}D(T)})});return w.catch(Yl),w}function p(E){var w=new Promise(function(D,b){u(E,function(C,T){if(C){b(C);return}D(T)})});return w.catch(Yl),w}function h(){if(a.idle())return new Promise(function(D){D()});var E=a.drain,w=new Promise(function(D){a.drain=function(){E(),D()}});return w}}OO.exports=mse;OO.exports.promise=pet});var rx=_(eA=>{"use strict";Object.defineProperty(eA,"__esModule",{value:!0});eA.joinPathSegments=eA.replacePathSegmentSeparator=eA.isAppliedFilter=eA.isFatalError=void 0;function het(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}eA.isFatalError=het;function get(t,e){return t===null||t(e)}eA.isAppliedFilter=get;function det(t,e){return t.split(/[/\\]/).join(e)}eA.replacePathSegmentSeparator=det;function met(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}eA.joinPathSegments=met});var _O=_(UO=>{"use strict";Object.defineProperty(UO,"__esModule",{value:!0});var yet=rx(),MO=class{constructor(e,r){this._root=e,this._settings=r,this._root=yet.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};UO.default=MO});var jO=_(qO=>{"use strict";Object.defineProperty(qO,"__esModule",{value:!0});var Eet=ve("events"),Cet=tx(),Iet=yse(),nx=rx(),wet=_O(),HO=class extends wet.default{constructor(e,r){super(e,r),this._settings=r,this._scandir=Cet.scandir,this._emitter=new Eet.EventEmitter,this._queue=Iet(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let o={directory:e,base:r};this._queue.push(o,a=>{a!==null&&this._handleError(a)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(o,a)=>{if(o!==null){r(o,void 0);return}for(let n of a)this._handleEntry(n,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!nx.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let o=e.path;r!==void 0&&(e.path=nx.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),nx.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&nx.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};qO.default=HO});var Ese=_(WO=>{"use strict";Object.defineProperty(WO,"__esModule",{value:!0});var Bet=jO(),GO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Bet.default(this._root,this._settings),this._storage=[]}read(e){this._reader.onError(r=>{vet(e,r)}),this._reader.onEntry(r=>{this._storage.push(r)}),this._reader.onEnd(()=>{Det(e,this._storage)}),this._reader.read()}};WO.default=GO;function vet(t,e){t(e)}function Det(t,e){t(null,e)}});var Cse=_(VO=>{"use strict";Object.defineProperty(VO,"__esModule",{value:!0});var Pet=ve("stream"),xet=jO(),YO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new xet.default(this._root,this._settings),this._stream=new Pet.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};VO.default=YO});var Ise=_(JO=>{"use strict";Object.defineProperty(JO,"__esModule",{value:!0});var bet=tx(),ix=rx(),ket=_O(),KO=class extends ket.default{constructor(){super(...arguments),this._scandir=bet.scandirSync,this._storage=[],this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),this._storage}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let o=this._scandir(e,this._settings.fsScandirSettings);for(let a of o)this._handleEntry(a,r)}catch(o){this._handleError(o)}}_handleError(e){if(ix.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let o=e.path;r!==void 0&&(e.path=ix.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),ix.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&ix.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(o,r===void 0?void 0:e.path)}_pushToStorage(e){this._storage.push(e)}};JO.default=KO});var wse=_(XO=>{"use strict";Object.defineProperty(XO,"__esModule",{value:!0});var Qet=Ise(),zO=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Qet.default(this._root,this._settings)}read(){return this._reader.read()}};XO.default=zO});var Bse=_($O=>{"use strict";Object.defineProperty($O,"__esModule",{value:!0});var Fet=ve("path"),Ret=tx(),ZO=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Fet.sep),this.fsScandirSettings=new Ret.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e??r}};$O.default=ZO});var ox=_(tA=>{"use strict";Object.defineProperty(tA,"__esModule",{value:!0});tA.Settings=tA.walkStream=tA.walkSync=tA.walk=void 0;var vse=Ese(),Tet=Cse(),Let=wse(),eM=Bse();tA.Settings=eM.default;function Net(t,e,r){if(typeof e=="function"){new vse.default(t,sx()).read(e);return}new vse.default(t,sx(e)).read(r)}tA.walk=Net;function Oet(t,e){let r=sx(e);return new Let.default(t,r).read()}tA.walkSync=Oet;function Met(t,e){let r=sx(e);return new Tet.default(t,r).read()}tA.walkStream=Met;function sx(t={}){return t instanceof eM.default?t:new eM.default(t)}});var ax=_(rM=>{"use strict";Object.defineProperty(rM,"__esModule",{value:!0});var Uet=ve("path"),_et=wg(),Dse=Df(),tM=class{constructor(e){this._settings=e,this._fsStatSettings=new _et.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return Uet.resolve(this._settings.cwd,e)}_makeEntry(e,r){let o={name:r,path:r,dirent:Dse.fs.createDirentFromStats(r,e)};return this._settings.stats&&(o.stats=e),o}_isFatalError(e){return!Dse.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};rM.default=tM});var sM=_(iM=>{"use strict";Object.defineProperty(iM,"__esModule",{value:!0});var Het=ve("stream"),qet=wg(),jet=ox(),Get=ax(),nM=class extends Get.default{constructor(){super(...arguments),this._walkStream=jet.walkStream,this._stat=qet.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let o=e.map(this._getFullEntryPath,this),a=new Het.PassThrough({objectMode:!0});a._write=(n,u,A)=>this._getEntry(o[n],e[n],r).then(p=>{p!==null&&r.entryFilter(p)&&a.push(p),n===o.length-1&&a.end(),A()}).catch(A);for(let n=0;nthis._makeEntry(a,r)).catch(a=>{if(o.errorFilter(a))return null;throw a})}_getStat(e){return new Promise((r,o)=>{this._stat(e,this._fsStatSettings,(a,n)=>a===null?r(n):o(a))})}};iM.default=nM});var Sse=_(aM=>{"use strict";Object.defineProperty(aM,"__esModule",{value:!0});var Wet=ox(),Yet=ax(),Vet=sM(),oM=class extends Yet.default{constructor(){super(...arguments),this._walkAsync=Wet.walk,this._readerStream=new Vet.default(this._settings)}dynamic(e,r){return new Promise((o,a)=>{this._walkAsync(e,r,(n,u)=>{n===null?o(u):a(n)})})}async static(e,r){let o=[],a=this._readerStream.static(e,r);return new Promise((n,u)=>{a.once("error",u),a.on("data",A=>o.push(A)),a.once("end",()=>n(o))})}};aM.default=oM});var Pse=_(cM=>{"use strict";Object.defineProperty(cM,"__esModule",{value:!0});var m1=Df(),lM=class{constructor(e,r,o){this._patterns=e,this._settings=r,this._micromatchOptions=o,this._storage=[],this._fillStorage()}_fillStorage(){for(let e of this._patterns){let r=this._getPatternSegments(e),o=this._splitSegmentsIntoSections(r);this._storage.push({complete:o.length<=1,pattern:e,segments:r,sections:o})}}_getPatternSegments(e){return m1.pattern.getPatternParts(e,this._micromatchOptions).map(o=>m1.pattern.isDynamicPattern(o,this._settings)?{dynamic:!0,pattern:o,patternRe:m1.pattern.makeRe(o,this._micromatchOptions)}:{dynamic:!1,pattern:o})}_splitSegmentsIntoSections(e){return m1.array.splitWhen(e,r=>r.dynamic&&m1.pattern.hasGlobStar(r.pattern))}};cM.default=lM});var xse=_(AM=>{"use strict";Object.defineProperty(AM,"__esModule",{value:!0});var Ket=Pse(),uM=class extends Ket.default{match(e){let r=e.split("/"),o=r.length,a=this._storage.filter(n=>!n.complete||n.segments.length>o);for(let n of a){let u=n.sections[0];if(!n.complete&&o>u.length||r.every((p,h)=>{let E=n.segments[h];return!!(E.dynamic&&E.patternRe.test(p)||!E.dynamic&&E.pattern===p)}))return!0}return!1}};AM.default=uM});var bse=_(pM=>{"use strict";Object.defineProperty(pM,"__esModule",{value:!0});var lx=Df(),Jet=xse(),fM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,o){let a=this._getMatcher(r),n=this._getNegativePatternsRe(o);return u=>this._filter(e,u,a,n)}_getMatcher(e){return new Jet.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(lx.pattern.isAffectDepthOfReadingPattern);return lx.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,o,a){if(this._isSkippedByDeep(e,r.path)||this._isSkippedSymbolicLink(r))return!1;let n=lx.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(n,o)?!1:this._isSkippedByNegativePatterns(n,a)}_isSkippedByDeep(e,r){return this._settings.deep===1/0?!1:this._getEntryLevel(e,r)>=this._settings.deep}_getEntryLevel(e,r){let o=r.split("/").length;if(e==="")return o;let a=e.split("/").length;return o-a}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!lx.pattern.matchAny(e,r)}};pM.default=fM});var kse=_(gM=>{"use strict";Object.defineProperty(gM,"__esModule",{value:!0});var Bg=Df(),hM=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let o=Bg.pattern.convertPatternsToRe(e,this._micromatchOptions),a=Bg.pattern.convertPatternsToRe(r,Object.assign(Object.assign({},this._micromatchOptions),{dot:!0}));return n=>this._filter(n,o,a)}_filter(e,r,o){let a=Bg.path.removeLeadingDotSegment(e.path);if(this._settings.unique&&this._isDuplicateEntry(a)||this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(a,o))return!1;let n=e.dirent.isDirectory(),u=this._isMatchToPatterns(a,r,n)&&!this._isMatchToPatterns(a,o,n);return this._settings.unique&&u&&this._createIndexRecord(a),u}_isDuplicateEntry(e){return this.index.has(e)}_createIndexRecord(e){this.index.set(e,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let o=Bg.path.makeAbsolute(this._settings.cwd,e);return Bg.pattern.matchAny(o,r)}_isMatchToPatterns(e,r,o){let a=Bg.pattern.matchAny(e,r);return!a&&o?Bg.pattern.matchAny(e+"/",r):a}};gM.default=hM});var Qse=_(mM=>{"use strict";Object.defineProperty(mM,"__esModule",{value:!0});var zet=Df(),dM=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return zet.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};mM.default=dM});var Rse=_(EM=>{"use strict";Object.defineProperty(EM,"__esModule",{value:!0});var Fse=Df(),yM=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=Fse.path.makeAbsolute(this._settings.cwd,r),r=Fse.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};EM.default=yM});var cx=_(IM=>{"use strict";Object.defineProperty(IM,"__esModule",{value:!0});var Xet=ve("path"),Zet=bse(),$et=kse(),ett=Qse(),ttt=Rse(),CM=class{constructor(e){this._settings=e,this.errorFilter=new ett.default(this._settings),this.entryFilter=new $et.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new Zet.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new ttt.default(this._settings)}_getRootDirectory(e){return Xet.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};IM.default=CM});var Tse=_(BM=>{"use strict";Object.defineProperty(BM,"__esModule",{value:!0});var rtt=Sse(),ntt=cx(),wM=class extends ntt.default{constructor(){super(...arguments),this._reader=new rtt.default(this._settings)}async read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return(await this.api(r,e,o)).map(n=>o.transform(n))}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};BM.default=wM});var Lse=_(DM=>{"use strict";Object.defineProperty(DM,"__esModule",{value:!0});var itt=ve("stream"),stt=sM(),ott=cx(),vM=class extends ott.default{constructor(){super(...arguments),this._reader=new stt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e),a=this.api(r,e,o),n=new itt.Readable({objectMode:!0,read:()=>{}});return a.once("error",u=>n.emit("error",u)).on("data",u=>n.emit("data",o.transform(u))).once("end",()=>n.emit("end")),n.once("close",()=>a.destroy()),n}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};DM.default=vM});var Nse=_(PM=>{"use strict";Object.defineProperty(PM,"__esModule",{value:!0});var att=wg(),ltt=ox(),ctt=ax(),SM=class extends ctt.default{constructor(){super(...arguments),this._walkSync=ltt.walkSync,this._statSync=att.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let o=[];for(let a of e){let n=this._getFullEntryPath(a),u=this._getEntry(n,a,r);u===null||!r.entryFilter(u)||o.push(u)}return o}_getEntry(e,r,o){try{let a=this._getStat(e);return this._makeEntry(a,r)}catch(a){if(o.errorFilter(a))return null;throw a}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};PM.default=SM});var Ose=_(bM=>{"use strict";Object.defineProperty(bM,"__esModule",{value:!0});var utt=Nse(),Att=cx(),xM=class extends Att.default{constructor(){super(...arguments),this._reader=new utt.default(this._settings)}read(e){let r=this._getRootDirectory(e),o=this._getReaderOptions(e);return this.api(r,e,o).map(o.transform)}api(e,r,o){return r.dynamic?this._reader.dynamic(e,o):this._reader.static(r.patterns,o)}};bM.default=xM});var Mse=_(oy=>{"use strict";Object.defineProperty(oy,"__esModule",{value:!0});oy.DEFAULT_FILE_SYSTEM_ADAPTER=void 0;var sy=ve("fs"),ftt=ve("os"),ptt=Math.max(ftt.cpus().length,1);oy.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:sy.lstat,lstatSync:sy.lstatSync,stat:sy.stat,statSync:sy.statSync,readdir:sy.readdir,readdirSync:sy.readdirSync};var kM=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,ptt),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,1/0),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0),this.ignore=[].concat(this.ignore)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},oy.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};oy.default=kM});var ux=_((oLt,_se)=>{"use strict";var Use=_ie(),htt=Tse(),gtt=Lse(),dtt=Ose(),QM=Mse(),Vl=Df();async function FM(t,e){Kc(t);let r=RM(t,htt.default,e),o=await Promise.all(r);return Vl.array.flatten(o)}(function(t){t.glob=t,t.globSync=e,t.globStream=r,t.async=t;function e(h,E){Kc(h);let w=RM(h,dtt.default,E);return Vl.array.flatten(w)}t.sync=e;function r(h,E){Kc(h);let w=RM(h,gtt.default,E);return Vl.stream.merge(w)}t.stream=r;function o(h,E){Kc(h);let w=[].concat(h),D=new QM.default(E);return Use.generate(w,D)}t.generateTasks=o;function a(h,E){Kc(h);let w=new QM.default(E);return Vl.pattern.isDynamicPattern(h,w)}t.isDynamicPattern=a;function n(h){return Kc(h),Vl.path.escape(h)}t.escapePath=n;function u(h){return Kc(h),Vl.path.convertPathToPattern(h)}t.convertPathToPattern=u;let A;(function(h){function E(D){return Kc(D),Vl.path.escapePosixPath(D)}h.escapePath=E;function w(D){return Kc(D),Vl.path.convertPosixPathToPattern(D)}h.convertPathToPattern=w})(A=t.posix||(t.posix={}));let p;(function(h){function E(D){return Kc(D),Vl.path.escapeWindowsPath(D)}h.escapePath=E;function w(D){return Kc(D),Vl.path.convertWindowsPathToPattern(D)}h.convertPathToPattern=w})(p=t.win32||(t.win32={}))})(FM||(FM={}));function RM(t,e,r){let o=[].concat(t),a=new QM.default(r),n=Use.generate(o,a),u=new e(a);return n.map(u.read,u)}function Kc(t){if(![].concat(t).every(o=>Vl.string.isString(o)&&!Vl.string.isEmpty(o)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}_se.exports=FM});var bn={};Vt(bn,{checksumFile:()=>fx,checksumPattern:()=>px,makeHash:()=>Ji});function Ji(...t){let e=(0,Ax.createHash)("sha512"),r="";for(let o of t)typeof o=="string"?r+=o:o&&(r&&(e.update(r),r=""),e.update(o));return r&&e.update(r),e.digest("hex")}async function fx(t,{baseFs:e,algorithm:r}={baseFs:ae,algorithm:"sha512"}){let o=await e.openPromise(t,"r");try{let n=Buffer.allocUnsafeSlow(65536),u=(0,Ax.createHash)(r),A=0;for(;(A=await e.readPromise(o,n,0,65536))!==0;)u.update(A===65536?n:n.slice(0,A));return u.digest("hex")}finally{await e.closePromise(o)}}async function px(t,{cwd:e}){let o=(await(0,TM.default)(t,{cwd:Ae.fromPortablePath(e),onlyDirectories:!0})).map(A=>`${A}/**/*`),a=await(0,TM.default)([t,...o],{cwd:Ae.fromPortablePath(e),onlyFiles:!1});a.sort();let n=await Promise.all(a.map(async A=>{let p=[Buffer.from(A)],h=V.join(e,Ae.toPortablePath(A)),E=await ae.lstatPromise(h);return E.isSymbolicLink()?p.push(Buffer.from(await ae.readlinkPromise(h))):E.isFile()&&p.push(await ae.readFilePromise(h)),p.join("\0")})),u=(0,Ax.createHash)("sha512");for(let A of n)u.update(A);return u.digest("hex")}var Ax,TM,ah=It(()=>{St();Ax=ve("crypto"),TM=et(ux())});var G={};Vt(G,{allPeerRequests:()=>P1,areDescriptorsEqual:()=>Wse,areIdentsEqual:()=>w1,areLocatorsEqual:()=>B1,areVirtualPackagesEquivalent:()=>Dtt,bindDescriptor:()=>Btt,bindLocator:()=>vtt,convertDescriptorToLocator:()=>hx,convertLocatorToDescriptor:()=>NM,convertPackageToLocator:()=>Ctt,convertToIdent:()=>Ett,convertToManifestRange:()=>Ltt,copyPackage:()=>E1,devirtualizeDescriptor:()=>C1,devirtualizeLocator:()=>I1,ensureDevirtualizedDescriptor:()=>Itt,ensureDevirtualizedLocator:()=>wtt,getIdentVendorPath:()=>_M,isPackageCompatible:()=>Ex,isVirtualDescriptor:()=>Sf,isVirtualLocator:()=>Jc,makeDescriptor:()=>kn,makeIdent:()=>rA,makeLocator:()=>Ps,makeRange:()=>mx,parseDescriptor:()=>lh,parseFileStyleRange:()=>Rtt,parseIdent:()=>Zo,parseLocator:()=>Pf,parseRange:()=>vg,prettyDependent:()=>fO,prettyDescriptor:()=>Jn,prettyIdent:()=>Ui,prettyLocator:()=>jr,prettyLocatorNoColors:()=>AO,prettyRange:()=>cy,prettyReference:()=>D1,prettyResolution:()=>d1,prettyWorkspace:()=>S1,renamePackage:()=>OM,slugifyIdent:()=>LM,slugifyLocator:()=>ly,sortDescriptors:()=>uy,stringifyDescriptor:()=>ka,stringifyIdent:()=>rn,stringifyLocator:()=>Qa,tryParseDescriptor:()=>v1,tryParseIdent:()=>Yse,tryParseLocator:()=>dx,tryParseRange:()=>Ftt,virtualizeDescriptor:()=>MM,virtualizePackage:()=>UM});function rA(t,e){if(t?.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:Ji(t,e),scope:t,name:e}}function kn(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:Ji(t.identHash,e),range:e}}function Ps(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:Ji(t.identHash,e),reference:e}}function Ett(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function hx(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function NM(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function Ctt(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function OM(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function E1(t){return OM(t,t)}function MM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return kn(t,`virtual:${e}#${t.range}`)}function UM(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return OM(t,Ps(t,`virtual:${e}#${t.reference}`))}function Sf(t){return t.range.startsWith(y1)}function Jc(t){return t.reference.startsWith(y1)}function C1(t){if(!Sf(t))throw new Error("Not a virtual descriptor");return kn(t,t.range.replace(gx,""))}function I1(t){if(!Jc(t))throw new Error("Not a virtual descriptor");return Ps(t,t.reference.replace(gx,""))}function Itt(t){return Sf(t)?kn(t,t.range.replace(gx,"")):t}function wtt(t){return Jc(t)?Ps(t,t.reference.replace(gx,"")):t}function Btt(t,e){return t.range.includes("::")?t:kn(t,`${t.range}::${ay.default.stringify(e)}`)}function vtt(t,e){return t.reference.includes("::")?t:Ps(t,`${t.reference}::${ay.default.stringify(e)}`)}function w1(t,e){return t.identHash===e.identHash}function Wse(t,e){return t.descriptorHash===e.descriptorHash}function B1(t,e){return t.locatorHash===e.locatorHash}function Dtt(t,e){if(!Jc(t))throw new Error("Invalid package type");if(!Jc(e))throw new Error("Invalid package type");if(!w1(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let o=e.dependencies.get(r.identHash);if(!o||!Wse(r,o))return!1}return!0}function Zo(t){let e=Yse(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function Yse(t){let e=t.match(Stt);if(!e)return null;let[,r,o]=e;return rA(typeof r<"u"?r:null,o)}function lh(t,e=!1){let r=v1(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function v1(t,e=!1){let r=e?t.match(Ptt):t.match(xtt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid range (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return kn(rA(u,a),A)}function Pf(t,e=!1){let r=dx(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function dx(t,e=!1){let r=e?t.match(btt):t.match(ktt);if(!r)return null;let[,o,a,n]=r;if(n==="unknown")throw new Error(`Invalid reference (${t})`);let u=typeof o<"u"?o:null,A=typeof n<"u"?n:"unknown";return Ps(rA(u,a),A)}function vg(t,e){let r=t.match(Qtt);if(r===null)throw new Error(`Invalid range (${t})`);let o=typeof r[1]<"u"?r[1]:null;if(typeof e?.requireProtocol=="string"&&o!==e.requireProtocol)throw new Error(`Invalid protocol (${o})`);if(e?.requireProtocol&&o===null)throw new Error(`Missing protocol (${o})`);let a=typeof r[3]<"u"?decodeURIComponent(r[2]):null;if(e?.requireSource&&a===null)throw new Error(`Missing source (${t})`);let n=typeof r[3]<"u"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),u=e?.parseSelector?ay.default.parse(n):n,A=typeof r[4]<"u"?ay.default.parse(r[4]):null;return{protocol:o,source:a,selector:u,params:A}}function Ftt(t,e){try{return vg(t,e)}catch{return null}}function Rtt(t,{protocol:e}){let{selector:r,params:o}=vg(t,{requireProtocol:e,requireBindings:!0});if(typeof o.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Pf(o.locator,!0),path:r}}function Hse(t){return t=t.replaceAll("%","%25"),t=t.replaceAll(":","%3A"),t=t.replaceAll("#","%23"),t}function Ttt(t){return t===null?!1:Object.entries(t).length>0}function mx({protocol:t,source:e,selector:r,params:o}){let a="";return t!==null&&(a+=`${t}`),e!==null&&(a+=`${Hse(e)}#`),a+=Hse(r),Ttt(o)&&(a+=`::${ay.default.stringify(o)}`),a}function Ltt(t){let{params:e,protocol:r,source:o,selector:a}=vg(t);for(let n in e)n.startsWith("__")&&delete e[n];return mx({protocol:r,source:o,params:e,selector:a})}function rn(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function ka(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function Qa(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function LM(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function ly(t){let{protocol:e,selector:r}=vg(t.reference),o=e!==null?e.replace(Ntt,""):"exotic",a=qse.default.valid(r),n=a!==null?`${o}-${a}`:`${o}`,u=10;return t.scope?`${LM(t)}-${n}-${t.locatorHash.slice(0,u)}`:`${LM(t)}-${n}-${t.locatorHash.slice(0,u)}`}function Ui(t,e){return e.scope?`${Ut(t,`@${e.scope}/`,Ct.SCOPE)}${Ut(t,e.name,Ct.NAME)}`:`${Ut(t,e.name,Ct.NAME)}`}function yx(t){if(t.startsWith(y1)){let e=yx(t.substring(t.indexOf("#")+1)),r=t.substring(y1.length,y1.length+mtt);return`${e} [${r}]`}else return t.replace(Ott,"?[...]")}function cy(t,e){return`${Ut(t,yx(e),Ct.RANGE)}`}function Jn(t,e){return`${Ui(t,e)}${Ut(t,"@",Ct.RANGE)}${cy(t,e.range)}`}function D1(t,e){return`${Ut(t,yx(e),Ct.REFERENCE)}`}function jr(t,e){return`${Ui(t,e)}${Ut(t,"@",Ct.REFERENCE)}${D1(t,e.reference)}`}function AO(t){return`${rn(t)}@${yx(t.reference)}`}function uy(t){return Ss(t,[e=>rn(e),e=>e.range])}function S1(t,e){return Ui(t,e.anchoredLocator)}function d1(t,e,r){let o=Sf(e)?C1(e):e;return r===null?`${Jn(t,o)} \u2192 ${uO(t).Cross}`:o.identHash===r.identHash?`${Jn(t,o)} \u2192 ${D1(t,r.reference)}`:`${Jn(t,o)} \u2192 ${jr(t,r)}`}function fO(t,e,r){return r===null?`${jr(t,e)}`:`${jr(t,e)} (via ${cy(t,r.range)})`}function _M(t){return`node_modules/${rn(t)}`}function Ex(t,e){return t.conditions?ytt(t.conditions,r=>{let[,o,a]=r.match(Gse),n=e[o];return n?n.includes(a):!0}):!0}function P1(t){let e=new Set;if("children"in t)e.add(t);else for(let r of t.requests.values())e.add(r);for(let r of e)for(let o of r.children.values())e.add(o);return e}var ay,qse,jse,y1,mtt,Gse,ytt,gx,Stt,Ptt,xtt,btt,ktt,Qtt,Ntt,Ott,Io=It(()=>{ay=et(ve("querystring")),qse=et(ni()),jse=et(MX());Wl();ah();Gl();Io();y1="virtual:",mtt=5,Gse=/(os|cpu|libc)=([a-z0-9_-]+)/,ytt=(0,jse.makeParser)(Gse);gx=/^[^#]*#/;Stt=/^(?:@([^/]+?)\/)?([^@/]+)$/;Ptt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,xtt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;btt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))$/,ktt=/^(?:@([^/]+?)\/)?([^@/]+?)(?:@(.+))?$/;Qtt=/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/;Ntt=/:$/;Ott=/\?.*/});var Vse,Kse=It(()=>{Io();Vse={hooks:{reduceDependency:(t,e,r,o,{resolver:a,resolveOptions:n})=>{for(let{pattern:u,reference:A}of e.topLevelWorkspace.manifest.resolutions){if(u.from&&(u.from.fullName!==rn(r)||e.configuration.normalizeLocator(Ps(Zo(u.from.fullName),u.from.description??r.reference)).locatorHash!==r.locatorHash)||u.descriptor.fullName!==rn(t)||e.configuration.normalizeDependency(kn(Pf(u.descriptor.fullName),u.descriptor.description??t.range)).descriptorHash!==t.descriptorHash)continue;return a.bindDescriptor(e.configuration.normalizeDependency(kn(t,A)),e.topLevelWorkspace.anchoredLocator,n)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let o=S1(t.configuration,r);await t.configuration.triggerHook(a=>a.validateWorkspace,r,{reportWarning:(a,n)=>e.reportWarning(a,`${o}: ${n}`),reportError:(a,n)=>e.reportError(a,`${o}: ${n}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let o of r.errors)e.reportWarning(57,o.message)}}}});var ci,Dg=It(()=>{ci=class t{static{this.protocol="workspace:"}supportsDescriptor(e,r){return!!(e.range.startsWith(t.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(t.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[o.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.getWorkspaceByCwd(e.reference.slice(t.protocol.length));return{...e,version:o.manifest.version||"0.0.0",languageName:"unknown",linkType:"SOFT",conditions:null,dependencies:r.project.configuration.normalizeDependencyMap(new Map([...o.manifest.dependencies,...o.manifest.devDependencies])),peerDependencies:new Map([...o.manifest.peerDependencies]),dependenciesMeta:o.manifest.dependenciesMeta,peerDependenciesMeta:o.manifest.peerDependenciesMeta,bin:o.manifest.bin}}}});var Ur={};Vt(Ur,{SemVer:()=>$se.SemVer,clean:()=>Utt,getComparator:()=>Xse,mergeComparators:()=>HM,satisfiesWithPrereleases:()=>nA,simplifyRanges:()=>qM,stringifyComparator:()=>Zse,validRange:()=>Fa});function nA(t,e,r=!1){if(!t)return!1;let o=`${e}${r}`,a=Jse.get(o);if(typeof a>"u")try{a=new xf.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{Jse.set(o,a||null)}else if(a===null)return!1;let n;try{n=new xf.default.SemVer(t,a)}catch{return!1}return a.test(n)?!0:(n.prerelease&&(n.prerelease=[]),a.set.some(u=>{for(let A of u)A.semver.prerelease&&(A.semver.prerelease=[]);return u.every(A=>A.test(n))}))}function Fa(t){if(t.indexOf(":")!==-1)return null;let e=zse.get(t);if(typeof e<"u")return e;try{e=new xf.default.Range(t)}catch{e=null}return zse.set(t,e),e}function Utt(t){let e=Mtt.exec(t);return e?e[1]:null}function Xse(t){if(t.semver===xf.default.Comparator.ANY)return{gt:null,lt:null};switch(t.operator){case"":return{gt:[">=",t.semver],lt:["<=",t.semver]};case">":case">=":return{gt:[t.operator,t.semver],lt:null};case"<":case"<=":return{gt:null,lt:[t.operator,t.semver]};default:throw new Error(`Assertion failed: Unexpected comparator operator (${t.operator})`)}}function HM(t){if(t.length===0)return null;let e=null,r=null;for(let o of t){if(o.gt){let a=e!==null?xf.default.compare(o.gt[1],e[1]):null;(a===null||a>0||a===0&&o.gt[0]===">")&&(e=o.gt)}if(o.lt){let a=r!==null?xf.default.compare(o.lt[1],r[1]):null;(a===null||a<0||a===0&&o.lt[0]==="<")&&(r=o.lt)}}if(e&&r){let o=xf.default.compare(e[1],r[1]);if(o===0&&(e[0]===">"||r[0]==="<")||o>0)return null}return{gt:e,lt:r}}function Zse(t){if(t.gt&&t.lt){if(t.gt[0]===">="&&t.lt[0]==="<="&&t.gt[1].version===t.lt[1].version)return t.gt[1].version;if(t.gt[0]===">="&&t.lt[0]==="<"){if(t.lt[1].version===`${t.gt[1].major+1}.0.0-0`)return`^${t.gt[1].version}`;if(t.lt[1].version===`${t.gt[1].major}.${t.gt[1].minor+1}.0-0`)return`~${t.gt[1].version}`}}let e=[];return t.gt&&e.push(t.gt[0]+t.gt[1].version),t.lt&&e.push(t.lt[0]+t.lt[1].version),e.length?e.join(" "):"*"}function qM(t){let e=t.map(_tt).map(o=>Fa(o).set.map(a=>a.map(n=>Xse(n)))),r=e.shift().map(o=>HM(o)).filter(o=>o!==null);for(let o of e){let a=[];for(let n of r)for(let u of o){let A=HM([n,...u]);A!==null&&a.push(A)}r=a}return r.length===0?null:r.map(o=>Zse(o)).join(" || ")}function _tt(t){let e=t.split("||");if(e.length>1){let r=new Set;for(let o of e)e.some(a=>a!==o&&xf.default.subset(o,a))||r.add(o);if(r.size{xf=et(ni()),$se=et(ni()),Jse=new Map;zse=new Map;Mtt=/^(?:[\sv=]*?)((0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\s*)$/});function eoe(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function toe(t){return t.charCodeAt(0)===65279?t.slice(1):t}function $o(t){return t.replace(/\\/g,"/")}function Cx(t,{yamlCompatibilityMode:e}){return e?nO(t):typeof t>"u"||typeof t=="boolean"?t:null}function roe(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let o=r%2===0?"":"!",a=e.slice(r);return`${o}${t}=${a}`}function jM(t,e){return e.length===1?roe(t,e[0]):`(${e.map(r=>roe(t,r)).join(" | ")})`}var noe,_t,Ay=It(()=>{St();Ol();noe=et(ni());Dg();Gl();bf();Io();_t=class t{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.libc=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static{this.fileName="package.json"}static{this.allDependencies=["dependencies","devDependencies","peerDependencies"]}static{this.hardDependencies=["dependencies","devDependencies"]}static async tryFind(e,{baseFs:r=new _n}={}){let o=V.join(e,"package.json");try{return await t.fromFile(o,{baseFs:r})}catch(a){if(a.code==="ENOENT")return null;throw a}}static async find(e,{baseFs:r}={}){let o=await t.tryFind(e,{baseFs:r});if(o===null)throw new Error("Manifest not found");return o}static async fromFile(e,{baseFs:r=new _n}={}){let o=new t;return await o.loadFile(e,{baseFs:r}),o}static fromText(e){let r=new t;return r.loadFromText(e),r}loadFromText(e){let r;try{r=JSON.parse(toe(e)||"{}")}catch(o){throw o.message+=` (when parsing ${e})`,o}this.load(r),this.indent=eoe(e)}async loadFile(e,{baseFs:r=new _n}){let o=await r.readFilePromise(e,"utf8"),a;try{a=JSON.parse(toe(o)||"{}")}catch(n){throw n.message+=` (when parsing ${e})`,n}this.load(a),this.indent=eoe(o)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let o=[];if(this.name=null,typeof e.name=="string")try{this.name=Zo(e.name)}catch{o.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let n=[];this.os=n;for(let u of e.os)typeof u!="string"?o.push(new Error("Parsing failed for the 'os' field")):n.push(u)}else this.os=null;if(Array.isArray(e.cpu)){let n=[];this.cpu=n;for(let u of e.cpu)typeof u!="string"?o.push(new Error("Parsing failed for the 'cpu' field")):n.push(u)}else this.cpu=null;if(Array.isArray(e.libc)){let n=[];this.libc=n;for(let u of e.libc)typeof u!="string"?o.push(new Error("Parsing failed for the 'libc' field")):n.push(u)}else this.libc=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=$o(e.main):this.main=null,typeof e.module=="string"?this.module=$o(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=$o(e.browser);else{this.browser=new Map;for(let[n,u]of Object.entries(e.browser))this.browser.set($o(n),typeof u=="string"?$o(u):u)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")e.bin.trim()===""?o.push(new Error("Invalid bin field")):this.name!==null?this.bin.set(this.name.name,$o(e.bin)):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[n,u]of Object.entries(e.bin)){if(typeof u!="string"||u.trim()===""){o.push(new Error(`Invalid bin definition for '${n}'`));continue}let A=Zo(n);this.bin.set(A.name,$o(u))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[n,u]of Object.entries(e.scripts)){if(typeof u!="string"){o.push(new Error(`Invalid script definition for '${n}'`));continue}this.scripts.set(n,u)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[n,u]of Object.entries(e.dependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=kn(A,u);this.dependencies.set(p.identHash,p)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[n,u]of Object.entries(e.devDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=kn(A,u);this.devDependencies.set(p.identHash,p)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[n,u]of Object.entries(e.peerDependencies)){let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}(typeof u!="string"||!u.startsWith(ci.protocol)&&!Fa(u))&&(o.push(new Error(`Invalid dependency range for '${n}'`)),u="*");let p=kn(A,u);this.peerDependencies.set(p.identHash,p)}typeof e.workspaces=="object"&&e.workspaces!==null&&e.workspaces.nohoist&&o.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let a=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let n of a){if(typeof n!="string"){o.push(new Error(`Invalid workspace definition for '${n}'`));continue}this.workspaceDefinitions.push({pattern:n})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[n,u]of Object.entries(e.dependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}`));continue}let A=lh(n),p=this.ensureDependencyMeta(A),h=Cx(u.built,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid built meta field for '${n}'`));continue}let E=Cx(u.optional,{yamlCompatibilityMode:r});if(E===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}let w=Cx(u.unplugged,{yamlCompatibilityMode:r});if(w===null){o.push(new Error(`Invalid unplugged meta field for '${n}'`));continue}Object.assign(p,{built:h,optional:E,unplugged:w})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[n,u]of Object.entries(e.peerDependenciesMeta)){if(typeof u!="object"||u===null){o.push(new Error(`Invalid meta field for '${n}'`));continue}let A=lh(n),p=this.ensurePeerDependencyMeta(A),h=Cx(u.optional,{yamlCompatibilityMode:r});if(h===null){o.push(new Error(`Invalid optional meta field for '${n}'`));continue}Object.assign(p,{optional:h})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[n,u]of Object.entries(e.resolutions)){if(typeof u!="string"){o.push(new Error(`Invalid resolution entry for '${n}'`));continue}try{this.resolutions.push({pattern:pS(n),reference:u})}catch(A){o.push(A);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let n of e.files){if(typeof n!="string"){o.push(new Error(`Invalid files entry for '${n}'`));continue}this.files.add(n)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=$o(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=$o(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=$o(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[n,u]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set($o(n),typeof u=="string"?$o(u):u)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,$o(e.publishConfig.bin)]]):o.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[n,u]of Object.entries(e.publishConfig.bin)){if(typeof u!="string"){o.push(new Error(`Invalid bin definition for '${n}'`));continue}this.publishConfig.bin.set(n,$o(u))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let n of e.publishConfig.executableFiles){if(typeof n!="string"){o.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add($o(n))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let n of Object.keys(e.installConfig))n==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:o.push(new Error("Invalid hoisting limits definition")):n=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:o.push(new Error("Invalid selfReferences definition, must be a boolean value")):o.push(new Error(`Unrecognized installConfig key: ${n}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[n,u]of Object.entries(e.optionalDependencies)){if(typeof u!="string"){o.push(new Error(`Invalid dependency range for '${n}'`));continue}let A;try{A=Zo(n)}catch{o.push(new Error(`Parsing failed for the dependency name '${n}'`));continue}let p=kn(A,u);this.dependencies.set(p.identHash,p);let h=kn(A,"unknown"),E=this.ensureDependencyMeta(h);Object.assign(E,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=o}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(jM("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(jM("cpu",this.cpu)),this.libc&&this.libc.length>0&&e.push(jM("libc",this.libc)),e.length>0?e.join(" & "):null}ensureDependencyMeta(e){if(e.range!=="unknown"&&!noe.default.valid(e.range))throw new Error(`Invalid meta field range for '${ka(e)}'`);let r=rn(e),o=e.range!=="unknown"?e.range:null,a=this.dependenciesMeta.get(r);a||this.dependenciesMeta.set(r,a=new Map);let n=a.get(o);return n||a.set(o,n={}),n}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${ka(e)}'`);let r=rn(e),o=this.peerDependenciesMeta.get(r);return o||this.peerDependenciesMeta.set(r,o={}),o}setRawField(e,r,{after:o=[]}={}){let a=new Set(o.filter(n=>Object.hasOwn(this.raw,n)));if(a.size===0||Object.hasOwn(this.raw,e))this.raw[e]=r;else{let n=this.raw,u=this.raw={},A=!1;for(let p of Object.keys(n))u[p]=n[p],A||(a.delete(p),a.size===0&&(u[e]=r,A=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=rn(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let n=this.browser;typeof n=="string"?e.browser=n:n instanceof Map&&(e.browser=Object.assign({},...Array.from(n.keys()).sort().map(u=>({[u]:n.get(u)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(n=>({[n]:this.bin.get(n)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces={...this.raw.workspaces,packages:this.workspaceDefinitions.map(({pattern:n})=>n)}:e.workspaces=this.workspaceDefinitions.map(({pattern:n})=>n):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let o=[],a=[];for(let n of this.dependencies.values()){let u=this.dependenciesMeta.get(rn(n)),A=!1;if(r&&u){let p=u.get(null);p&&p.optional&&(A=!0)}A?a.push(n):o.push(n)}o.length>0?e.dependencies=Object.assign({},...uy(o).map(n=>({[rn(n)]:n.range}))):delete e.dependencies,a.length>0?e.optionalDependencies=Object.assign({},...uy(a).map(n=>({[rn(n)]:n.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...uy(this.devDependencies.values()).map(n=>({[rn(n)]:n.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...uy(this.peerDependencies.values()).map(n=>({[rn(n)]:n.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[n,u]of Ss(this.dependenciesMeta.entries(),([A,p])=>A))for(let[A,p]of Ss(u.entries(),([h,E])=>h!==null?`0${h}`:"1")){let h=A!==null?ka(kn(Zo(n),A)):n,E={...p};r&&A===null&&delete E.optional,Object.keys(E).length!==0&&(e.dependenciesMeta[h]=E)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...Ss(this.peerDependenciesMeta.entries(),([n,u])=>n).map(([n,u])=>({[n]:u}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:n,reference:u})=>({[hS(n)]:u}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){e.scripts??={};for(let n of Object.keys(e.scripts))this.scripts.has(n)||delete e.scripts[n];for(let[n,u]of this.scripts.entries())e.scripts[n]=u}else delete e.scripts;return e}}});var soe=_((ILt,ioe)=>{var Htt=ql(),qtt=function(){return Htt.Date.now()};ioe.exports=qtt});var aoe=_((wLt,ooe)=>{var jtt=/\s/;function Gtt(t){for(var e=t.length;e--&&jtt.test(t.charAt(e)););return e}ooe.exports=Gtt});var coe=_((BLt,loe)=>{var Wtt=aoe(),Ytt=/^\s+/;function Vtt(t){return t&&t.slice(0,Wtt(t)+1).replace(Ytt,"")}loe.exports=Vtt});var fy=_((vLt,uoe)=>{var Ktt=mg(),Jtt=Zu(),ztt="[object Symbol]";function Xtt(t){return typeof t=="symbol"||Jtt(t)&&Ktt(t)==ztt}uoe.exports=Xtt});var hoe=_((DLt,poe)=>{var Ztt=coe(),Aoe=cl(),$tt=fy(),foe=NaN,ert=/^[-+]0x[0-9a-f]+$/i,trt=/^0b[01]+$/i,rrt=/^0o[0-7]+$/i,nrt=parseInt;function irt(t){if(typeof t=="number")return t;if($tt(t))return foe;if(Aoe(t)){var e=typeof t.valueOf=="function"?t.valueOf():t;t=Aoe(e)?e+"":e}if(typeof t!="string")return t===0?t:+t;t=Ztt(t);var r=trt.test(t);return r||rrt.test(t)?nrt(t.slice(2),r?2:8):ert.test(t)?foe:+t}poe.exports=irt});var moe=_((SLt,doe)=>{var srt=cl(),GM=soe(),goe=hoe(),ort="Expected a function",art=Math.max,lrt=Math.min;function crt(t,e,r){var o,a,n,u,A,p,h=0,E=!1,w=!1,D=!0;if(typeof t!="function")throw new TypeError(ort);e=goe(e)||0,srt(r)&&(E=!!r.leading,w="maxWait"in r,n=w?art(goe(r.maxWait)||0,e):n,D="trailing"in r?!!r.trailing:D);function b(ue){var Ie=o,he=a;return o=a=void 0,h=ue,u=t.apply(he,Ie),u}function C(ue){return h=ue,A=setTimeout(U,e),E?b(ue):u}function T(ue){var Ie=ue-p,he=ue-h,De=e-Ie;return w?lrt(De,n-he):De}function N(ue){var Ie=ue-p,he=ue-h;return p===void 0||Ie>=e||Ie<0||w&&he>=n}function U(){var ue=GM();if(N(ue))return J(ue);A=setTimeout(U,T(ue))}function J(ue){return A=void 0,D&&o?b(ue):(o=a=void 0,u)}function te(){A!==void 0&&clearTimeout(A),h=0,o=p=a=A=void 0}function le(){return A===void 0?u:J(GM())}function ce(){var ue=GM(),Ie=N(ue);if(o=arguments,a=this,p=ue,Ie){if(A===void 0)return C(p);if(w)return clearTimeout(A),A=setTimeout(U,e),b(p)}return A===void 0&&(A=setTimeout(U,e)),u}return ce.cancel=te,ce.flush=le,ce}doe.exports=crt});var WM=_((PLt,yoe)=>{var urt=moe(),Art=cl(),frt="Expected a function";function prt(t,e,r){var o=!0,a=!0;if(typeof t!="function")throw new TypeError(frt);return Art(r)&&(o="leading"in r?!!r.leading:o,a="trailing"in r?!!r.trailing:a),urt(t,e,{leading:o,maxWait:e,trailing:a})}yoe.exports=prt});function grt(t){return typeof t.reportCode<"u"}var Eoe,Coe,Ioe,hrt,Jt,Ws,Kl=It(()=>{Eoe=et(WM()),Coe=ve("stream"),Ioe=ve("string_decoder"),hrt=15,Jt=class extends Error{constructor(r,o,a){super(o);this.reportExtra=a;this.reportCode=r}};Ws=class{constructor(){this.cacheHits=new Set;this.cacheMisses=new Set;this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}getRecommendedLength(){return 180}reportCacheHit(e){this.cacheHits.add(e.locatorHash)}reportCacheMiss(e,r){this.cacheMisses.add(e.locatorHash)}static progressViaCounter(e){let r=0,o,a=new Promise(p=>{o=p}),n=p=>{let h=o;a=new Promise(E=>{o=E}),r=p,h()},u=(p=0)=>{n(r+1)},A=async function*(){for(;r{r=u}),a=(0,Eoe.default)(u=>{let A=r;o=new Promise(p=>{r=p}),e=u,A()},1e3/hrt),n=async function*(){for(;;)await o,yield{title:e}}();return{[Symbol.asyncIterator](){return n},hasProgress:!1,hasTitle:!0,setTitle:a}}async startProgressPromise(e,r){let o=this.reportProgress(e);try{return await r(e)}finally{o.stop()}}startProgressSync(e,r){let o=this.reportProgress(e);try{return r(e)}finally{o.stop()}}reportInfoOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedInfos.has(a)||(this.reportedInfos.add(a),this.reportInfo(e,r),o?.reportExtra?.(this))}reportWarningOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedWarnings.has(a)||(this.reportedWarnings.add(a),this.reportWarning(e,r),o?.reportExtra?.(this))}reportErrorOnce(e,r,o){let a=o&&o.key?o.key:r;this.reportedErrors.has(a)||(this.reportedErrors.add(a),this.reportError(e,r),o?.reportExtra?.(this))}reportExceptionOnce(e){grt(e)?this.reportErrorOnce(e.reportCode,e.message,{key:e,reportExtra:e.reportExtra}):this.reportErrorOnce(1,e.stack||e.message,{key:e})}createStreamReporter(e=null){let r=new Coe.PassThrough,o=new Ioe.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` -`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",e!==null?this.reportInfo(null,`${e} ${p}`):this.reportInfo(null,p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&(e!==null?this.reportInfo(null,`${e} ${n}`):this.reportInfo(null,n))}),r}}});var py,YM=It(()=>{Kl();Io();py=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));return o||null}getFetcher(e,r){let o=this.fetchers.find(a=>a.supports(e,r));if(!o)throw new Jt(11,`${jr(r.project.configuration,e)} isn't supported by any available fetcher`);return o}}});var Sg,VM=It(()=>{Io();Sg=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.getResolverByDescriptor(e,o).bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,o){return await this.getResolverByDescriptor(e,o).getCandidates(e,r,o)}async getSatisfying(e,r,o,a){return this.getResolverByDescriptor(e,a).getSatisfying(e,r,o,a)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));return o||null}getResolverByDescriptor(e,r){let o=this.resolvers.find(a=>a.supportsDescriptor(e,r));if(!o)throw new Error(`${Jn(r.project.configuration,e)} isn't supported by any available resolver`);return o}tryResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));return o||null}getResolverByLocator(e,r){let o=this.resolvers.find(a=>a.supportsLocator(e,r));if(!o)throw new Error(`${jr(r.project.configuration,e)} isn't supported by any available resolver`);return o}}});var hy,KM=It(()=>{St();Io();hy=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Ps(e,a);return r.fetcher.getLocalPath(n,r)}async fetch(e,r){let o=e.reference.indexOf("#");if(o===-1)throw new Error("Invalid virtual package reference");let a=e.reference.slice(o+1),n=Ps(e,a),u=await r.fetcher.fetch(n,r);return await this.ensureVirtualLink(e,u,r)}getLocatorFilename(e){return ly(e)}async ensureVirtualLink(e,r,o){let a=r.packageFs.getRealPath(),n=o.project.configuration.get("virtualFolder"),u=this.getLocatorFilename(e),A=qs.makeVirtualPath(n,u,a),p=new ju(A,{baseFs:r.packageFs,pathUtils:V});return{...r,packageFs:p}}}});var Ix,woe=It(()=>{Ix=class t{static{this.protocol="virtual:"}static isVirtualDescriptor(e){return!!e.range.startsWith(t.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(t.protocol)}supportsDescriptor(e,r){return t.isVirtualDescriptor(e)}supportsLocator(e,r){return t.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,o){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,o,a){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}}});var gy,JM=It(()=>{St();Dg();gy=class{supports(e){return!!e.reference.startsWith(ci.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let o=this.getWorkspace(e,r).cwd;return{packageFs:new En(o),prefixPath:Bt.dot,localPath:o}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(ci.protocol.length))}}});function x1(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Boe(t){return typeof t>"u"?3:x1(t)?0:Array.isArray(t)?1:2}function ZM(t,e){return Object.hasOwn(t,e)}function mrt(t){return x1(t)&&ZM(t,"onConflict")&&typeof t.onConflict=="string"}function yrt(t){if(typeof t>"u")return{onConflict:"default",value:t};if(!mrt(t))return{onConflict:"default",value:t};if(ZM(t,"value"))return t;let{onConflict:e,...r}=t;return{onConflict:e,value:r}}function voe(t,e){let r=x1(t)&&ZM(t,e)?t[e]:void 0;return yrt(r)}function dy(t,e){return[t,e,Doe]}function $M(t){return Array.isArray(t)?t[2]===Doe:!1}function zM(t,e){if(x1(t)){let r={};for(let o of Object.keys(t))r[o]=zM(t[o],e);return dy(e,r)}return Array.isArray(t)?dy(e,t.map(r=>zM(r,e))):dy(e,t)}function XM(t,e,r,o,a){let n,u=[],A=a,p=0;for(let E=a-1;E>=o;--E){let[w,D]=t[E],{onConflict:b,value:C}=voe(D,r),T=Boe(C);if(T!==3){if(n??=T,T!==n||b==="hardReset"){p=A;break}if(T===2)return dy(w,C);if(u.unshift([w,C]),b==="reset"){p=E;break}b==="extend"&&E===o&&(o=0),A=E}}if(typeof n>"u")return null;let h=u.map(([E])=>E).join(", ");switch(n){case 1:return dy(h,new Array().concat(...u.map(([E,w])=>w.map(D=>zM(D,E)))));case 0:{let E=Object.assign({},...u.map(([,T])=>T)),w=Object.keys(E),D={},b=t.map(([T,N])=>[T,voe(N,r).value]),C=drt(b,([T,N])=>{let U=Boe(N);return U!==0&&U!==3});if(C!==-1){let T=b.slice(C+1);for(let N of w)D[N]=XM(T,e,N,0,T.length)}else for(let T of w)D[T]=XM(b,e,T,p,b.length);return dy(h,D)}default:throw new Error("Assertion failed: Non-extendable value type")}}function Soe(t){return XM(t.map(([e,r])=>[e,{".":r}]),[],".",0,t.length)}function b1(t){return $M(t)?t[1]:t}function wx(t){let e=$M(t)?t[1]:t;if(Array.isArray(e))return e.map(r=>wx(r));if(x1(e)){let r={};for(let[o,a]of Object.entries(e))r[o]=wx(a);return r}return e}function e4(t){return $M(t)?t[0]:null}var drt,Doe,Poe=It(()=>{drt=(t,e,r)=>{let o=[...t];return o.reverse(),o.findIndex(e,r)};Doe=Symbol()});var Bx={};Vt(Bx,{getDefaultGlobalFolder:()=>r4,getHomeFolder:()=>my,isFolderInside:()=>n4});function r4(){if(process.platform==="win32"){let t=Ae.toPortablePath(process.env.LOCALAPPDATA||Ae.join((0,t4.homedir)(),"AppData","Local"));return V.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=Ae.toPortablePath(process.env.XDG_DATA_HOME);return V.resolve(t,"yarn/berry")}return V.resolve(my(),".yarn/berry")}function my(){return Ae.toPortablePath((0,t4.homedir)()||"/usr/local/share")}function n4(t,e){let r=V.relative(e,t);return r&&!r.startsWith("..")&&!V.isAbsolute(r)}var t4,vx=It(()=>{St();t4=ve("os")});var Qoe=_(yy=>{"use strict";var _Lt=ve("net"),Crt=ve("tls"),i4=ve("http"),xoe=ve("https"),Irt=ve("events"),HLt=ve("assert"),wrt=ve("util");yy.httpOverHttp=Brt;yy.httpsOverHttp=vrt;yy.httpOverHttps=Drt;yy.httpsOverHttps=Srt;function Brt(t){var e=new kf(t);return e.request=i4.request,e}function vrt(t){var e=new kf(t);return e.request=i4.request,e.createSocket=boe,e.defaultPort=443,e}function Drt(t){var e=new kf(t);return e.request=xoe.request,e}function Srt(t){var e=new kf(t);return e.request=xoe.request,e.createSocket=boe,e.defaultPort=443,e}function kf(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||i4.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(o,a,n,u){for(var A=koe(a,n,u),p=0,h=e.requests.length;p=this.maxSockets){n.requests.push(u);return}n.createSocket(u,function(A){A.on("free",p),A.on("close",h),A.on("agentRemove",h),e.onSocket(A);function p(){n.emit("free",A,u)}function h(E){n.removeSocket(A),A.removeListener("free",p),A.removeListener("close",h),A.removeListener("agentRemove",h)}})};kf.prototype.createSocket=function(e,r){var o=this,a={};o.sockets.push(a);var n=s4({},o.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(n.localAddress=e.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers["Proxy-Authorization"]="Basic "+new Buffer(n.proxyAuth).toString("base64")),ch("making CONNECT request");var u=o.request(n);u.useChunkedEncodingByDefault=!1,u.once("response",A),u.once("upgrade",p),u.once("connect",h),u.once("error",E),u.end();function A(w){w.upgrade=!0}function p(w,D,b){process.nextTick(function(){h(w,D,b)})}function h(w,D,b){if(u.removeAllListeners(),D.removeAllListeners(),w.statusCode!==200){ch("tunneling socket could not be established, statusCode=%d",w.statusCode),D.destroy();var C=new Error("tunneling socket could not be established, statusCode="+w.statusCode);C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}if(b.length>0){ch("got illegal response body from proxy"),D.destroy();var C=new Error("got illegal response body from proxy");C.code="ECONNRESET",e.request.emit("error",C),o.removeSocket(a);return}return ch("tunneling connection has established"),o.sockets[o.sockets.indexOf(a)]=D,r(D)}function E(w){u.removeAllListeners(),ch(`tunneling socket could not be established, cause=%s -`,w.message,w.stack);var D=new Error("tunneling socket could not be established, cause="+w.message);D.code="ECONNRESET",e.request.emit("error",D),o.removeSocket(a)}};kf.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var o=this.requests.shift();o&&this.createSocket(o,function(a){o.request.onSocket(a)})}};function boe(t,e){var r=this;kf.prototype.createSocket.call(r,t,function(o){var a=t.request.getHeader("host"),n=s4({},r.options,{socket:o,servername:a?a.replace(/:.*$/,""):t.host}),u=Crt.connect(0,n);r.sockets[r.sockets.indexOf(o)]=u,e(u)})}function koe(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function s4(t){for(var e=1,r=arguments.length;e{Foe.exports=Qoe()});var Ff=_((Qf,Dx)=>{"use strict";Object.defineProperty(Qf,"__esModule",{value:!0});var Toe=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Prt(t){return Toe.includes(t)}var xrt=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Blob","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...Toe];function brt(t){return xrt.includes(t)}var krt=["null","undefined","string","number","bigint","boolean","symbol"];function Qrt(t){return krt.includes(t)}function Ey(t){return e=>typeof e===t}var{toString:Loe}=Object.prototype,k1=t=>{let e=Loe.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&Pe.domElement(t))return"HTMLElement";if(brt(e))return e},ii=t=>e=>k1(e)===t;function Pe(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(Pe.observable(t))return"Observable";if(Pe.array(t))return"Array";if(Pe.buffer(t))return"Buffer";let e=k1(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}Pe.undefined=Ey("undefined");Pe.string=Ey("string");var Frt=Ey("number");Pe.number=t=>Frt(t)&&!Pe.nan(t);Pe.bigint=Ey("bigint");Pe.function_=Ey("function");Pe.null_=t=>t===null;Pe.class_=t=>Pe.function_(t)&&t.toString().startsWith("class ");Pe.boolean=t=>t===!0||t===!1;Pe.symbol=Ey("symbol");Pe.numericString=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));Pe.array=(t,e)=>Array.isArray(t)?Pe.function_(e)?t.every(e):!0:!1;Pe.buffer=t=>{var e,r,o,a;return(a=(o=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||o===void 0?void 0:o.call(r,t))!==null&&a!==void 0?a:!1};Pe.blob=t=>ii("Blob")(t);Pe.nullOrUndefined=t=>Pe.null_(t)||Pe.undefined(t);Pe.object=t=>!Pe.null_(t)&&(typeof t=="object"||Pe.function_(t));Pe.iterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};Pe.asyncIterable=t=>{var e;return Pe.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};Pe.generator=t=>{var e,r;return Pe.iterable(t)&&Pe.function_((e=t)===null||e===void 0?void 0:e.next)&&Pe.function_((r=t)===null||r===void 0?void 0:r.throw)};Pe.asyncGenerator=t=>Pe.asyncIterable(t)&&Pe.function_(t.next)&&Pe.function_(t.throw);Pe.nativePromise=t=>ii("Promise")(t);var Rrt=t=>{var e,r;return Pe.function_((e=t)===null||e===void 0?void 0:e.then)&&Pe.function_((r=t)===null||r===void 0?void 0:r.catch)};Pe.promise=t=>Pe.nativePromise(t)||Rrt(t);Pe.generatorFunction=ii("GeneratorFunction");Pe.asyncGeneratorFunction=t=>k1(t)==="AsyncGeneratorFunction";Pe.asyncFunction=t=>k1(t)==="AsyncFunction";Pe.boundFunction=t=>Pe.function_(t)&&!t.hasOwnProperty("prototype");Pe.regExp=ii("RegExp");Pe.date=ii("Date");Pe.error=ii("Error");Pe.map=t=>ii("Map")(t);Pe.set=t=>ii("Set")(t);Pe.weakMap=t=>ii("WeakMap")(t);Pe.weakSet=t=>ii("WeakSet")(t);Pe.int8Array=ii("Int8Array");Pe.uint8Array=ii("Uint8Array");Pe.uint8ClampedArray=ii("Uint8ClampedArray");Pe.int16Array=ii("Int16Array");Pe.uint16Array=ii("Uint16Array");Pe.int32Array=ii("Int32Array");Pe.uint32Array=ii("Uint32Array");Pe.float32Array=ii("Float32Array");Pe.float64Array=ii("Float64Array");Pe.bigInt64Array=ii("BigInt64Array");Pe.bigUint64Array=ii("BigUint64Array");Pe.arrayBuffer=ii("ArrayBuffer");Pe.sharedArrayBuffer=ii("SharedArrayBuffer");Pe.dataView=ii("DataView");Pe.enumCase=(t,e)=>Object.values(e).includes(t);Pe.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;Pe.urlInstance=t=>ii("URL")(t);Pe.urlString=t=>{if(!Pe.string(t))return!1;try{return new URL(t),!0}catch{return!1}};Pe.truthy=t=>!!t;Pe.falsy=t=>!t;Pe.nan=t=>Number.isNaN(t);Pe.primitive=t=>Pe.null_(t)||Qrt(typeof t);Pe.integer=t=>Number.isInteger(t);Pe.safeInteger=t=>Number.isSafeInteger(t);Pe.plainObject=t=>{if(Loe.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};Pe.typedArray=t=>Prt(k1(t));var Trt=t=>Pe.safeInteger(t)&&t>=0;Pe.arrayLike=t=>!Pe.nullOrUndefined(t)&&!Pe.function_(t)&&Trt(t.length);Pe.inRange=(t,e)=>{if(Pe.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(Pe.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var Lrt=1,Nrt=["innerHTML","ownerDocument","style","attributes","nodeValue"];Pe.domElement=t=>Pe.object(t)&&t.nodeType===Lrt&&Pe.string(t.nodeName)&&!Pe.plainObject(t)&&Nrt.every(e=>e in t);Pe.observable=t=>{var e,r,o,a;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((a=(o=t)["@@observable"])===null||a===void 0?void 0:a.call(o)):!1};Pe.nodeStream=t=>Pe.object(t)&&Pe.function_(t.pipe)&&!Pe.observable(t);Pe.infinite=t=>t===1/0||t===-1/0;var Noe=t=>e=>Pe.integer(e)&&Math.abs(e%2)===t;Pe.evenInteger=Noe(0);Pe.oddInteger=Noe(1);Pe.emptyArray=t=>Pe.array(t)&&t.length===0;Pe.nonEmptyArray=t=>Pe.array(t)&&t.length>0;Pe.emptyString=t=>Pe.string(t)&&t.length===0;var Ort=t=>Pe.string(t)&&!/\S/.test(t);Pe.emptyStringOrWhitespace=t=>Pe.emptyString(t)||Ort(t);Pe.nonEmptyString=t=>Pe.string(t)&&t.length>0;Pe.nonEmptyStringAndNotWhitespace=t=>Pe.string(t)&&!Pe.emptyStringOrWhitespace(t);Pe.emptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length===0;Pe.nonEmptyObject=t=>Pe.object(t)&&!Pe.map(t)&&!Pe.set(t)&&Object.keys(t).length>0;Pe.emptySet=t=>Pe.set(t)&&t.size===0;Pe.nonEmptySet=t=>Pe.set(t)&&t.size>0;Pe.emptyMap=t=>Pe.map(t)&&t.size===0;Pe.nonEmptyMap=t=>Pe.map(t)&&t.size>0;Pe.propertyKey=t=>Pe.any([Pe.string,Pe.number,Pe.symbol],t);Pe.formData=t=>ii("FormData")(t);Pe.urlSearchParams=t=>ii("URLSearchParams")(t);var Ooe=(t,e,r)=>{if(!Pe.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};Pe.any=(t,...e)=>(Pe.array(t)?t:[t]).some(o=>Ooe(Array.prototype.some,o,e));Pe.all=(t,...e)=>Ooe(Array.prototype.every,t,e);var Mt=(t,e,r,o={})=>{if(!t){let{multipleValues:a}=o,n=a?`received values of types ${[...new Set(r.map(u=>`\`${Pe(u)}\``))].join(", ")}`:`received value of type \`${Pe(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${n}.`)}};Qf.assert={undefined:t=>Mt(Pe.undefined(t),"undefined",t),string:t=>Mt(Pe.string(t),"string",t),number:t=>Mt(Pe.number(t),"number",t),bigint:t=>Mt(Pe.bigint(t),"bigint",t),function_:t=>Mt(Pe.function_(t),"Function",t),null_:t=>Mt(Pe.null_(t),"null",t),class_:t=>Mt(Pe.class_(t),"Class",t),boolean:t=>Mt(Pe.boolean(t),"boolean",t),symbol:t=>Mt(Pe.symbol(t),"symbol",t),numericString:t=>Mt(Pe.numericString(t),"string with a number",t),array:(t,e)=>{Mt(Pe.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Mt(Pe.buffer(t),"Buffer",t),blob:t=>Mt(Pe.blob(t),"Blob",t),nullOrUndefined:t=>Mt(Pe.nullOrUndefined(t),"null or undefined",t),object:t=>Mt(Pe.object(t),"Object",t),iterable:t=>Mt(Pe.iterable(t),"Iterable",t),asyncIterable:t=>Mt(Pe.asyncIterable(t),"AsyncIterable",t),generator:t=>Mt(Pe.generator(t),"Generator",t),asyncGenerator:t=>Mt(Pe.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Mt(Pe.nativePromise(t),"native Promise",t),promise:t=>Mt(Pe.promise(t),"Promise",t),generatorFunction:t=>Mt(Pe.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Mt(Pe.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Mt(Pe.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Mt(Pe.boundFunction(t),"Function",t),regExp:t=>Mt(Pe.regExp(t),"RegExp",t),date:t=>Mt(Pe.date(t),"Date",t),error:t=>Mt(Pe.error(t),"Error",t),map:t=>Mt(Pe.map(t),"Map",t),set:t=>Mt(Pe.set(t),"Set",t),weakMap:t=>Mt(Pe.weakMap(t),"WeakMap",t),weakSet:t=>Mt(Pe.weakSet(t),"WeakSet",t),int8Array:t=>Mt(Pe.int8Array(t),"Int8Array",t),uint8Array:t=>Mt(Pe.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Mt(Pe.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Mt(Pe.int16Array(t),"Int16Array",t),uint16Array:t=>Mt(Pe.uint16Array(t),"Uint16Array",t),int32Array:t=>Mt(Pe.int32Array(t),"Int32Array",t),uint32Array:t=>Mt(Pe.uint32Array(t),"Uint32Array",t),float32Array:t=>Mt(Pe.float32Array(t),"Float32Array",t),float64Array:t=>Mt(Pe.float64Array(t),"Float64Array",t),bigInt64Array:t=>Mt(Pe.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Mt(Pe.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Mt(Pe.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Mt(Pe.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Mt(Pe.dataView(t),"DataView",t),enumCase:(t,e)=>Mt(Pe.enumCase(t,e),"EnumCase",t),urlInstance:t=>Mt(Pe.urlInstance(t),"URL",t),urlString:t=>Mt(Pe.urlString(t),"string with a URL",t),truthy:t=>Mt(Pe.truthy(t),"truthy",t),falsy:t=>Mt(Pe.falsy(t),"falsy",t),nan:t=>Mt(Pe.nan(t),"NaN",t),primitive:t=>Mt(Pe.primitive(t),"primitive",t),integer:t=>Mt(Pe.integer(t),"integer",t),safeInteger:t=>Mt(Pe.safeInteger(t),"integer",t),plainObject:t=>Mt(Pe.plainObject(t),"plain object",t),typedArray:t=>Mt(Pe.typedArray(t),"TypedArray",t),arrayLike:t=>Mt(Pe.arrayLike(t),"array-like",t),domElement:t=>Mt(Pe.domElement(t),"HTMLElement",t),observable:t=>Mt(Pe.observable(t),"Observable",t),nodeStream:t=>Mt(Pe.nodeStream(t),"Node.js Stream",t),infinite:t=>Mt(Pe.infinite(t),"infinite number",t),emptyArray:t=>Mt(Pe.emptyArray(t),"empty array",t),nonEmptyArray:t=>Mt(Pe.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Mt(Pe.emptyString(t),"empty string",t),emptyStringOrWhitespace:t=>Mt(Pe.emptyStringOrWhitespace(t),"empty string or whitespace",t),nonEmptyString:t=>Mt(Pe.nonEmptyString(t),"non-empty string",t),nonEmptyStringAndNotWhitespace:t=>Mt(Pe.nonEmptyStringAndNotWhitespace(t),"non-empty string and not whitespace",t),emptyObject:t=>Mt(Pe.emptyObject(t),"empty object",t),nonEmptyObject:t=>Mt(Pe.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Mt(Pe.emptySet(t),"empty set",t),nonEmptySet:t=>Mt(Pe.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Mt(Pe.emptyMap(t),"empty map",t),nonEmptyMap:t=>Mt(Pe.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Mt(Pe.propertyKey(t),"PropertyKey",t),formData:t=>Mt(Pe.formData(t),"FormData",t),urlSearchParams:t=>Mt(Pe.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Mt(Pe.evenInteger(t),"even integer",t),oddInteger:t=>Mt(Pe.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Mt(Pe.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Mt(Pe.inRange(t,e),"in range",t),any:(t,...e)=>Mt(Pe.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Mt(Pe.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(Pe,{class:{value:Pe.class_},function:{value:Pe.function_},null:{value:Pe.null_}});Object.defineProperties(Qf.assert,{class:{value:Qf.assert.class_},function:{value:Qf.assert.function_},null:{value:Qf.assert.null_}});Qf.default=Pe;Dx.exports=Pe;Dx.exports.default=Pe;Dx.exports.assert=Qf.assert});var Moe=_((GLt,o4)=>{"use strict";var Sx=class extends Error{constructor(e){super(e||"Promise was canceled"),this.name="CancelError"}get isCanceled(){return!0}},Px=class t{static fn(e){return(...r)=>new t((o,a,n)=>{r.push(n),e(...r).then(o,a)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,o)=>{this._reject=o;let a=A=>{this._isPending=!1,r(A)},n=A=>{this._isPending=!1,o(A)},u=A=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(A)};return Object.defineProperties(u,{shouldReject:{get:()=>this._rejectOnCancel,set:A=>{this._rejectOnCancel=A}}}),e(a,n,u)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Sx(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Px.prototype,Promise.prototype);o4.exports=Px;o4.exports.CancelError=Sx});var Uoe=_((l4,c4)=>{"use strict";Object.defineProperty(l4,"__esModule",{value:!0});function Mrt(t){return t.encrypted}var a4=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let o=typeof r.connect=="function",a=typeof r.secureConnect=="function",n=typeof r.close=="function",u=()=>{o&&r.connect(),Mrt(t)&&a&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),n&&t.once("close",r.close)};t.writable&&!t.connecting?u():t.connecting?t.once("connect",u):t.destroyed&&n&&r.close(t._hadError)};l4.default=a4;c4.exports=a4;c4.exports.default=a4});var _oe=_((A4,f4)=>{"use strict";Object.defineProperty(A4,"__esModule",{value:!0});var Urt=Uoe(),_rt=Number(process.versions.node.split(".")[0]),u4=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=u=>{let A=u.emit.bind(u);u.emit=(p,...h)=>(p==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,u.emit=A),A(p,...h))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||_rt>=13)&&(e.phases.total=Date.now()-e.start)});let o=u=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let A=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};u.prependOnceListener("lookup",A),Urt.default(u,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(u.removeListener("lookup",A),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?o(t.socket):t.prependOnceListener("socket",o);let a=()=>{var u;e.upload=Date.now(),e.phases.request=e.upload-(u=e.secureConnect,u??e.connect)};return(typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))?a():t.prependOnceListener("finish",a),t.prependOnceListener("response",u=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,u.timings=e,r(u),u.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};A4.default=u4;f4.exports=u4;f4.exports.default=u4});var Voe=_((WLt,g4)=>{"use strict";var{V4MAPPED:Hrt,ADDRCONFIG:qrt,ALL:Yoe,promises:{Resolver:Hoe},lookup:jrt}=ve("dns"),{promisify:p4}=ve("util"),Grt=ve("os"),Cy=Symbol("cacheableLookupCreateConnection"),h4=Symbol("cacheableLookupInstance"),qoe=Symbol("expires"),Wrt=typeof Yoe=="number",joe=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},Yrt=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},Goe=()=>{let t=!1,e=!1;for(let r of Object.values(Grt.networkInterfaces()))for(let o of r)if(!o.internal&&(o.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Vrt=t=>Symbol.iterator in t,Woe={ttl:!0},Krt={all:!0},xx=class{constructor({cache:e=new Map,maxTtl:r=1/0,fallbackDuration:o=3600,errorTtl:a=.15,resolver:n=new Hoe,lookup:u=jrt}={}){if(this.maxTtl=r,this.errorTtl=a,this._cache=e,this._resolver=n,this._dnsLookup=p4(u),this._resolver instanceof Hoe?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=p4(this._resolver.resolve4.bind(this._resolver)),this._resolve6=p4(this._resolver.resolve6.bind(this._resolver))),this._iface=Goe(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,o<1)this._fallback=!1;else{this._fallback=!0;let A=setInterval(()=>{this._hostnamesToFallback.clear()},o*1e3);A.unref&&A.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,o){if(typeof r=="function"?(o=r,r={}):typeof r=="number"&&(r={family:r}),!o)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(a=>{r.all?o(null,a):o(null,a.address,a.family,a.expires,a.ttl)},o)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let o=await this.query(e);if(r.family===6){let a=o.filter(n=>n.family===6);r.hints&Hrt&&(Wrt&&r.hints&Yoe||a.length===0)?Yrt(o):o=a}else r.family===4&&(o=o.filter(a=>a.family===4));if(r.hints&qrt){let{_iface:a}=this;o=o.filter(n=>n.family===6?a.has6:a.has4)}if(o.length===0){let a=new Error(`cacheableLookup ENOTFOUND ${e}`);throw a.code="ENOTFOUND",a.hostname=e,a}return r.all?o:o[0]}async query(e){let r=await this._cache.get(e);if(!r){let o=this._pending[e];if(o)r=await o;else{let a=this.queryAndCache(e);this._pending[e]=a,r=await a}}return r=r.map(o=>({...o})),r}async _resolve(e){let r=async h=>{try{return await h}catch(E){if(E.code==="ENODATA"||E.code==="ENOTFOUND")return[];throw E}},[o,a]=await Promise.all([this._resolve4(e,Woe),this._resolve6(e,Woe)].map(h=>r(h))),n=0,u=0,A=0,p=Date.now();for(let h of o)h.family=4,h.expires=p+h.ttl*1e3,n=Math.max(n,h.ttl);for(let h of a)h.family=6,h.expires=p+h.ttl*1e3,u=Math.max(u,h.ttl);return o.length>0?a.length>0?A=Math.min(n,u):A=n:A=u,{entries:[...o,...a],cacheTtl:A}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch{return{entries:[],cacheTtl:0}}}async _set(e,r,o){if(this.maxTtl>0&&o>0){o=Math.min(o,this.maxTtl)*1e3,r[qoe]=Date.now()+o;try{await this._cache.set(e,r,o)}catch(a){this.lookupAsync=async()=>{let n=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw n.cause=a,n}}Vrt(this._cache)&&this._tick(o)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Krt);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let o=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,o),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let o=1/0,a=Date.now();for(let[n,u]of this._cache){let A=u[qoe];a>=A?this._cache.delete(n):A("lookup"in r||(r.lookup=this.lookup),e[Cy](r,o))}uninstall(e){if(joe(e),e[Cy]){if(e[h4]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Cy],delete e[Cy],delete e[h4]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=Goe(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};g4.exports=xx;g4.exports.default=xx});var zoe=_((YLt,d4)=>{"use strict";var Jrt=typeof URL>"u"?ve("url").URL:URL,zrt="text/plain",Xrt="us-ascii",Koe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),Zrt=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let o=r[1].split(";"),a=r[2],n=e?"":r[3],u=!1;o[o.length-1]==="base64"&&(o.pop(),u=!0);let A=(o.shift()||"").toLowerCase(),h=[...o.map(E=>{let[w,D=""]=E.split("=").map(b=>b.trim());return w==="charset"&&(D=D.toLowerCase(),D===Xrt)?"":`${w}${D?`=${D}`:""}`}).filter(Boolean)];return u&&h.push("base64"),(h.length!==0||A&&A!==zrt)&&h.unshift(A),`data:${h.join(";")},${u?a.trim():a}${n?`#${n}`:""}`},Joe=(t,e)=>{if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return Zrt(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new Jrt(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash&&(a.hash=""),a.pathname&&(a.pathname=a.pathname.replace(/((?!:).|^)\/{2,}/g,(n,u)=>/^(?!\/)/g.test(u)?`${u}/`:"/")),a.pathname&&(a.pathname=decodeURI(a.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let n=a.pathname.split("/"),u=n[n.length-1];Koe(u,e.removeDirectoryIndex)&&(n=n.slice(0,n.length-1),a.pathname=n.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let n of[...a.searchParams.keys()])Koe(n,e.removeQueryParameters)&&a.searchParams.delete(n);return e.sortQueryParameters&&a.searchParams.sort(),e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,"")),t=a.toString(),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};d4.exports=Joe;d4.exports.default=Joe});var $oe=_((VLt,Zoe)=>{Zoe.exports=Xoe;function Xoe(t,e){if(t&&e)return Xoe(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(o){r[o]=t[o]}),r;function r(){for(var o=new Array(arguments.length),a=0;a{var eae=$oe();m4.exports=eae(bx);m4.exports.strict=eae(tae);bx.proto=bx(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return bx(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return tae(this)},configurable:!0})});function bx(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function tae(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var E4=_((JLt,nae)=>{var $rt=y4(),ent=function(){},tnt=function(t){return t.setHeader&&typeof t.abort=="function"},rnt=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},rae=function(t,e,r){if(typeof e=="function")return rae(t,null,e);e||(e={}),r=$rt(r||ent);var o=t._writableState,a=t._readableState,n=e.readable||e.readable!==!1&&t.readable,u=e.writable||e.writable!==!1&&t.writable,A=function(){t.writable||p()},p=function(){u=!1,n||r.call(t)},h=function(){n=!1,u||r.call(t)},E=function(C){r.call(t,C?new Error("exited with error code: "+C):null)},w=function(C){r.call(t,C)},D=function(){if(n&&!(a&&a.ended))return r.call(t,new Error("premature close"));if(u&&!(o&&o.ended))return r.call(t,new Error("premature close"))},b=function(){t.req.on("finish",p)};return tnt(t)?(t.on("complete",p),t.on("abort",D),t.req?b():t.on("request",b)):u&&!o&&(t.on("end",A),t.on("close",A)),rnt(t)&&t.on("exit",E),t.on("end",h),t.on("finish",p),e.error!==!1&&t.on("error",w),t.on("close",D),function(){t.removeListener("complete",p),t.removeListener("abort",D),t.removeListener("request",b),t.req&&t.req.removeListener("finish",p),t.removeListener("end",A),t.removeListener("close",A),t.removeListener("finish",p),t.removeListener("exit",E),t.removeListener("end",h),t.removeListener("error",w),t.removeListener("close",D)}};nae.exports=rae});var oae=_((zLt,sae)=>{var nnt=y4(),int=E4(),C4=ve("fs"),Q1=function(){},snt=/^v?\.0/.test(process.version),kx=function(t){return typeof t=="function"},ont=function(t){return!snt||!C4?!1:(t instanceof(C4.ReadStream||Q1)||t instanceof(C4.WriteStream||Q1))&&kx(t.close)},ant=function(t){return t.setHeader&&kx(t.abort)},lnt=function(t,e,r,o){o=nnt(o);var a=!1;t.on("close",function(){a=!0}),int(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,ont(t))return t.close(Q1);if(ant(t))return t.abort();if(kx(t.destroy))return t.destroy();o(u||new Error("stream was destroyed"))}}},iae=function(t){t()},cnt=function(t,e){return t.pipe(e)},unt=function(){var t=Array.prototype.slice.call(arguments),e=kx(t[t.length-1]||Q1)&&t.pop()||Q1;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,o=t.map(function(a,n){var u=n0;return lnt(a,u,A,function(p){r||(r=p),p&&o.forEach(iae),!u&&(o.forEach(iae),e(r))})});return t.reduce(cnt)};sae.exports=unt});var lae=_((XLt,aae)=>{"use strict";var{PassThrough:Ant}=ve("stream");aae.exports=t=>{t={...t};let{array:e}=t,{encoding:r}=t,o=r==="buffer",a=!1;e?a=!(r||o):r=r||"utf8",o&&(r=null);let n=new Ant({objectMode:a});r&&n.setEncoding(r);let u=0,A=[];return n.on("data",p=>{A.push(p),a?u=A.length:u+=p.length}),n.getBufferedValue=()=>e?A:o?Buffer.concat(A,u):A.join(""),n.getBufferedLength=()=>u,n}});var cae=_((ZLt,Iy)=>{"use strict";var fnt=oae(),pnt=lae(),Qx=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function Fx(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e={maxBuffer:1/0,...e};let{maxBuffer:r}=e,o;return await new Promise((a,n)=>{let u=A=>{A&&(A.bufferedData=o.getBufferedValue()),n(A)};o=fnt(t,pnt(e),A=>{if(A){u(A);return}a()}),o.on("data",()=>{o.getBufferedLength()>r&&u(new Qx)})}),o.getBufferedValue()}Iy.exports=Fx;Iy.exports.default=Fx;Iy.exports.buffer=(t,e)=>Fx(t,{...e,encoding:"buffer"});Iy.exports.array=(t,e)=>Fx(t,{...e,array:!0});Iy.exports.MaxBufferError=Qx});var Aae=_((eNt,uae)=>{"use strict";var hnt=new Set([200,203,204,206,300,301,308,404,405,410,414,501]),gnt=new Set([200,203,204,300,301,302,303,307,308,404,405,410,414,501]),dnt=new Set([500,502,503,504]),mnt={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},ynt={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Pg(t){let e=parseInt(t,10);return isFinite(e)?e:0}function Ent(t){return t?dnt.has(t.status):!0}function I4(t){let e={};if(!t)return e;let r=t.trim().split(/,/);for(let o of r){let[a,n]=o.split(/=/,2);e[a.trim()]=n===void 0?!0:n.trim().replace(/^"|"$/g,"")}return e}function Cnt(t){let e=[];for(let r in t){let o=t[r];e.push(o===!0?r:r+"="+o)}if(e.length)return e.join(", ")}uae.exports=class{constructor(e,r,{shared:o,cacheHeuristic:a,immutableMinTimeToLive:n,ignoreCargoCult:u,_fromObject:A}={}){if(A){this._fromObject(A);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=o!==!1,this._cacheHeuristic=a!==void 0?a:.1,this._immutableMinTtl=n!==void 0?n:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=I4(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=I4(e.headers["cache-control"]),u&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":Cnt(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),r.headers["cache-control"]==null&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&gnt.has(this._status)&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc["max-age"]||this._isShared&&this._rescc["s-maxage"]||this._rescc.public||hnt.has(this._status)))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=I4(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let o of r)if(e.headers[o]!==this._reqHeaders[o])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let o in e)mnt[o]||(r[o]=e[o]);if(e.connection){let o=e.connection.trim().split(/\s*,\s*/);for(let a of o)delete r[a]}if(r.warning){let o=r.warning.split(/,/).filter(a=>!/^\s*1[0-9][0-9]/.test(a));o.length?r.warning=o.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){let e=Date.parse(this._resHeaders.date);return isFinite(e)?e:this._responseTime}age(){let e=this._ageValue(),r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){return Pg(this._resHeaders.age)}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return Pg(this._rescc["s-maxage"])}if(this._rescc["max-age"])return Pg(this._rescc["max-age"]);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this.date();if(this._resHeaders.expires){let o=Date.parse(this._resHeaders.expires);return Number.isNaN(o)||oo)return Math.max(e,(r-o)/1e3*this._cacheHeuristic)}return e}timeToLive(){let e=this.maxAge()-this.age(),r=e+Pg(this._rescc["stale-if-error"]),o=e+Pg(this._rescc["stale-while-revalidate"]);return Math.max(0,e,r,o)*1e3}stale(){return this.maxAge()<=this.age()}_useStaleIfError(){return this.maxAge()+Pg(this._rescc["stale-if-error"])>this.age()}useStaleWhileRevalidate(){return this.maxAge()+Pg(this._rescc["stale-while-revalidate"])>this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let a=r["if-none-match"].split(/,/).filter(n=>!/^\s*W\//.test(n));a.length?r["if-none-match"]=a.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),this._useStaleIfError()&&Ent(r))return{modified:!1,matches:!1,policy:this};if(!r||!r.headers)throw Error("Response headers missing");let o=!1;if(r.status!==void 0&&r.status!=304?o=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?o=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?o=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?o=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(o=!0),!o)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let a={};for(let u in this._resHeaders)a[u]=u in r.headers&&!ynt[u]?r.headers[u]:this._resHeaders[u];let n=Object.assign({},r,{status:this._status,method:this._method,headers:a});return{policy:new this.constructor(e,n,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl}),modified:!1,matches:!0}}}});var Rx=_((tNt,fae)=>{"use strict";fae.exports=t=>{let e={};for(let[r,o]of Object.entries(t))e[r.toLowerCase()]=o;return e}});var hae=_((rNt,pae)=>{"use strict";var Int=ve("stream").Readable,wnt=Rx(),w4=class extends Int{constructor(e,r,o,a){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(o instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof a!="string")throw new TypeError("Argument `url` should be a string");super(),this.statusCode=e,this.headers=wnt(r),this.body=o,this.url=a}_read(){this.push(this.body),this.push(null)}};pae.exports=w4});var dae=_((nNt,gae)=>{"use strict";var Bnt=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];gae.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Bnt));for(let o of r)o in e||(e[o]=typeof t[o]=="function"?t[o].bind(t):t[o])}});var yae=_((iNt,mae)=>{"use strict";var vnt=ve("stream").PassThrough,Dnt=dae(),Snt=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new vnt;return Dnt(t,e),t.pipe(e)};mae.exports=Snt});var Eae=_(B4=>{B4.stringify=function t(e){if(typeof e>"u")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",o=Array.isArray(e);r=o?"[":"{";var a=!0;for(var n in e){var u=typeof e[n]=="function"||!o&&typeof e[n]>"u";Object.hasOwnProperty.call(e,n)&&!u&&(a||(r+=","),a=!1,o?e[n]==null?r+="null":r+=t(e[n]):e[n]!==void 0&&(r+=t(n)+":"+t(e[n])))}return r+=o?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e>"u"?"null":JSON.stringify(e)};B4.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Bae=_((oNt,wae)=>{"use strict";var Pnt=ve("events"),Cae=Eae(),xnt=t=>{let e={redis:"@keyv/redis",rediss:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql",etcd:"@keyv/etcd",offline:"@keyv/offline",tiered:"@keyv/tiered"};if(t.adapter||t.uri){let r=t.adapter||/^[^:+]*/.exec(t.uri)[0];return new(ve(e[r]))(t)}return new Map},Iae=["sqlite","postgres","mysql","mongo","redis","tiered"],v4=class extends Pnt{constructor(e,{emitErrors:r=!0,...o}={}){if(super(),this.opts={namespace:"keyv",serialize:Cae.stringify,deserialize:Cae.parse,...typeof e=="string"?{uri:e}:e,...o},!this.opts.store){let n={...this.opts};this.opts.store=xnt(n)}if(this.opts.compression){let n=this.opts.compression;this.opts.serialize=n.serialize.bind(n),this.opts.deserialize=n.deserialize.bind(n)}typeof this.opts.store.on=="function"&&r&&this.opts.store.on("error",n=>this.emit("error",n)),this.opts.store.namespace=this.opts.namespace;let a=n=>async function*(){for await(let[u,A]of typeof n=="function"?n(this.opts.store.namespace):n){let p=await this.opts.deserialize(A);if(!(this.opts.store.namespace&&!u.includes(this.opts.store.namespace))){if(typeof p.expires=="number"&&Date.now()>p.expires){this.delete(u);continue}yield[this._getKeyUnprefix(u),p.value]}}};typeof this.opts.store[Symbol.iterator]=="function"&&this.opts.store instanceof Map?this.iterator=a(this.opts.store):typeof this.opts.store.iterator=="function"&&this.opts.store.opts&&this._checkIterableAdaptar()&&(this.iterator=a(this.opts.store.iterator.bind(this.opts.store)))}_checkIterableAdaptar(){return Iae.includes(this.opts.store.opts.dialect)||Iae.findIndex(e=>this.opts.store.opts.url.includes(e))>=0}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}_getKeyPrefixArray(e){return e.map(r=>`${this.opts.namespace}:${r}`)}_getKeyUnprefix(e){return e.split(":").splice(1).join(":")}get(e,r){let{store:o}=this.opts,a=Array.isArray(e),n=a?this._getKeyPrefixArray(e):this._getKeyPrefix(e);if(a&&o.getMany===void 0){let u=[];for(let A of n)u.push(Promise.resolve().then(()=>o.get(A)).then(p=>typeof p=="string"?this.opts.deserialize(p):this.opts.compression?this.opts.deserialize(p):p).then(p=>{if(p!=null)return typeof p.expires=="number"&&Date.now()>p.expires?this.delete(A).then(()=>{}):r&&r.raw?p:p.value}));return Promise.allSettled(u).then(A=>{let p=[];for(let h of A)p.push(h.value);return p})}return Promise.resolve().then(()=>a?o.getMany(n):o.get(n)).then(u=>typeof u=="string"?this.opts.deserialize(u):this.opts.compression?this.opts.deserialize(u):u).then(u=>{if(u!=null)return a?u.map((A,p)=>{if(typeof A=="string"&&(A=this.opts.deserialize(A)),A!=null){if(typeof A.expires=="number"&&Date.now()>A.expires){this.delete(e[p]).then(()=>{});return}return r&&r.raw?A:A.value}}):typeof u.expires=="number"&&Date.now()>u.expires?this.delete(e).then(()=>{}):r&&r.raw?u:u.value})}set(e,r,o){let a=this._getKeyPrefix(e);typeof o>"u"&&(o=this.opts.ttl),o===0&&(o=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let u=typeof o=="number"?Date.now()+o:null;return typeof r=="symbol"&&this.emit("error","symbol cannot be serialized"),r={value:r,expires:u},this.opts.serialize(r)}).then(u=>n.set(a,u,o)).then(()=>!0)}delete(e){let{store:r}=this.opts;if(Array.isArray(e)){let a=this._getKeyPrefixArray(e);if(r.deleteMany===void 0){let n=[];for(let u of a)n.push(r.delete(u));return Promise.allSettled(n).then(u=>u.every(A=>A.value===!0))}return Promise.resolve().then(()=>r.deleteMany(a))}let o=this._getKeyPrefix(e);return Promise.resolve().then(()=>r.delete(o))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}has(e){let r=this._getKeyPrefix(e),{store:o}=this.opts;return Promise.resolve().then(async()=>typeof o.has=="function"?o.has(r):await o.get(r)!==void 0)}disconnect(){let{store:e}=this.opts;if(typeof e.disconnect=="function")return e.disconnect()}};wae.exports=v4});var Sae=_((lNt,Dae)=>{"use strict";var bnt=ve("events"),Tx=ve("url"),knt=zoe(),Qnt=cae(),D4=Aae(),vae=hae(),Fnt=Rx(),Rnt=yae(),Tnt=Bae(),F1=class t{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Tnt({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,o)=>{let a;if(typeof r=="string")a=S4(Tx.parse(r)),r={};else if(r instanceof Tx.URL)a=S4(Tx.parse(r.toString())),r={};else{let[w,...D]=(r.path||"").split("?"),b=D.length>0?`?${D.join("?")}`:"";a=S4({...r,pathname:w,search:b})}r={headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1,...r,...Lnt(a)},r.headers=Fnt(r.headers);let n=new bnt,u=knt(Tx.format(a),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),A=`${r.method}:${u}`,p=!1,h=!1,E=w=>{h=!0;let D=!1,b,C=new Promise(N=>{b=()=>{D||(D=!0,N())}}),T=N=>{if(p&&!w.forceRefresh){N.status=N.statusCode;let J=D4.fromObject(p.cachePolicy).revalidatedPolicy(w,N);if(!J.modified){let te=J.policy.responseHeaders();N=new vae(p.statusCode,te,p.body,p.url),N.cachePolicy=J.policy,N.fromCache=!0}}N.fromCache||(N.cachePolicy=new D4(w,N,w),N.fromCache=!1);let U;w.cache&&N.cachePolicy.storable()?(U=Rnt(N),(async()=>{try{let J=Qnt.buffer(N);if(await Promise.race([C,new Promise(ue=>N.once("end",ue))]),D)return;let te=await J,le={cachePolicy:N.cachePolicy.toObject(),url:N.url,statusCode:N.fromCache?p.statusCode:N.statusCode,body:te},ce=w.strictTtl?N.cachePolicy.timeToLive():void 0;w.maxTtl&&(ce=ce?Math.min(ce,w.maxTtl):w.maxTtl),await this.cache.set(A,le,ce)}catch(J){n.emit("error",new t.CacheError(J))}})()):w.cache&&p&&(async()=>{try{await this.cache.delete(A)}catch(J){n.emit("error",new t.CacheError(J))}})(),n.emit("response",U||N),typeof o=="function"&&o(U||N)};try{let N=e(w,T);N.once("error",b),N.once("abort",b),n.emit("request",N)}catch(N){n.emit("error",new t.RequestError(N))}};return(async()=>{let w=async b=>{await Promise.resolve();let C=b.cache?await this.cache.get(A):void 0;if(typeof C>"u")return E(b);let T=D4.fromObject(C.cachePolicy);if(T.satisfiesWithoutRevalidation(b)&&!b.forceRefresh){let N=T.responseHeaders(),U=new vae(C.statusCode,N,C.body,C.url);U.cachePolicy=T,U.fromCache=!0,n.emit("response",U),typeof o=="function"&&o(U)}else p=C,b.headers=T.revalidationHeaders(b),E(b)},D=b=>n.emit("error",new t.CacheError(b));this.cache.once("error",D),n.on("response",()=>this.cache.removeListener("error",D));try{await w(r)}catch(b){r.automaticFailover&&!h&&E(r),n.emit("error",new t.CacheError(b))}})(),n}}};function Lnt(t){let e={...t};return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function S4(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}F1.RequestError=class extends Error{constructor(t){super(t.message),this.name="RequestError",Object.assign(this,t)}};F1.CacheError=class extends Error{constructor(t){super(t.message),this.name="CacheError",Object.assign(this,t)}};Dae.exports=F1});var xae=_((ANt,Pae)=>{"use strict";var Nnt=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];Pae.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(Nnt)),o={};for(let a of r)a in e||(o[a]={get(){let n=t[a];return typeof n=="function"?n.bind(t):n},set(n){t[a]=n},enumerable:!0,configurable:!1});return Object.defineProperties(e,o),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var kae=_((fNt,bae)=>{"use strict";var{Transform:Ont,PassThrough:Mnt}=ve("stream"),P4=ve("zlib"),Unt=xae();bae.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof P4.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let o=!0,a=new Ont({transform(A,p,h){o=!1,h(null,A)},flush(A){A()}}),n=new Mnt({autoDestroy:!1,destroy(A,p){t.destroy(),p(A)}}),u=r?P4.createBrotliDecompress():P4.createUnzip();return u.once("error",A=>{if(o&&!t.readable){n.end();return}n.destroy(A)}),Unt(t,n),t.pipe(a).pipe(u).pipe(n),n}});var b4=_((pNt,Qae)=>{"use strict";var x4=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[o,a]of this.oldCache.entries())this.onEviction(o,a);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};Qae.exports=x4});var Q4=_((hNt,Lae)=>{"use strict";var _nt=ve("events"),Hnt=ve("tls"),qnt=ve("http2"),jnt=b4(),ea=Symbol("currentStreamsCount"),Fae=Symbol("request"),Jl=Symbol("cachedOriginSet"),wy=Symbol("gracefullyClosing"),Gnt=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Wnt=(t,e,r)=>{let o=0,a=t.length;for(;o>>1;r(t[n],e)?o=n+1:a=n}return o},Ynt=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,k4=(t,e)=>{for(let r of t)r[Jl].lengthe[Jl].includes(o))&&r[ea]+e[ea]<=e.remoteSettings.maxConcurrentStreams&&Tae(r)},Vnt=(t,e)=>{for(let r of t)e[Jl].lengthr[Jl].includes(o))&&e[ea]+r[ea]<=r.remoteSettings.maxConcurrentStreams&&Tae(e)},Rae=({agent:t,isFree:e})=>{let r={};for(let o in t.sessions){let n=t.sessions[o].filter(u=>{let A=u[xg.kCurrentStreamsCount]{t[wy]=!0,t[ea]===0&&t.close()},xg=class t extends _nt{constructor({timeout:e=6e4,maxSessions:r=1/0,maxFreeSessions:o=10,maxCachedTlsSessions:a=100}={}){super(),this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=o,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new jnt({maxSize:a})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let o of Gnt)e[o]&&(r+=`:${e[o]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let o=this.queue[e][r];this._sessionsCount{Array.isArray(o)?(o=[...o],a()):o=[{resolve:a,reject:n}];let u=this.normalizeOptions(r),A=t.normalizeOrigin(e,r&&r.servername);if(A===void 0){for(let{reject:E}of o)E(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(u in this.sessions){let E=this.sessions[u],w=-1,D=-1,b;for(let C of E){let T=C.remoteSettings.maxConcurrentStreams;if(T=T||C[wy]||C.destroyed)continue;b||(w=T),N>D&&(b=C,D=N)}}if(b){if(o.length!==1){for(let{reject:C}of o){let T=new Error(`Expected the length of listeners to be 1, got ${o.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);C(T)}return}o[0].resolve(b);return}}if(u in this.queue){if(A in this.queue[u]){this.queue[u][A].listeners.push(...o),this._tryToCreateNewSession(u,A);return}}else this.queue[u]={};let p=()=>{u in this.queue&&this.queue[u][A]===h&&(delete this.queue[u][A],Object.keys(this.queue[u]).length===0&&delete this.queue[u])},h=()=>{let E=`${A}:${u}`,w=!1;try{let D=qnt.connect(e,{createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(E),...r});D[ea]=0,D[wy]=!1;let b=()=>D[ea]{this.tlsSessionCache.set(E,N)}),D.once("error",N=>{for(let{reject:U}of o)U(N);this.tlsSessionCache.delete(E)}),D.setTimeout(this.timeout,()=>{D.destroy()}),D.once("close",()=>{if(w){C&&this._freeSessionsCount--,this._sessionsCount--;let N=this.sessions[u];N.splice(N.indexOf(D),1),N.length===0&&delete this.sessions[u]}else{let N=new Error("Session closed without receiving a SETTINGS frame");N.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:U}of o)U(N);p()}this._tryToCreateNewSession(u,A)});let T=()=>{if(!(!(u in this.queue)||!b())){for(let N of D[Jl])if(N in this.queue[u]){let{listeners:U}=this.queue[u][N];for(;U.length!==0&&b();)U.shift().resolve(D);let J=this.queue[u];if(J[N].listeners.length===0&&(delete J[N],Object.keys(J).length===0)){delete this.queue[u];break}if(!b())break}}};D.on("origin",()=>{D[Jl]=D.originSet,b()&&(T(),k4(this.sessions[u],D))}),D.once("remoteSettings",()=>{if(D.ref(),D.unref(),this._sessionsCount++,h.destroyed){let N=new Error("Agent has been destroyed");for(let U of o)U.reject(N);D.destroy();return}D[Jl]=D.originSet;{let N=this.sessions;if(u in N){let U=N[u];U.splice(Wnt(U,D,Ynt),0,D)}else N[u]=[D]}this._freeSessionsCount+=1,w=!0,this.emit("session",D),T(),p(),D[ea]===0&&this._freeSessionsCount>this.maxFreeSessions&&D.close(),o.length!==0&&(this.getSession(A,r,o),o.length=0),D.on("remoteSettings",()=>{T(),k4(this.sessions[u],D)})}),D[Fae]=D.request,D.request=(N,U)=>{if(D[wy])throw new Error("The session is gracefully closing. No new streams are allowed.");let J=D[Fae](N,U);return D.ref(),++D[ea],D[ea]===D.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,J.once("close",()=>{if(C=b(),--D[ea],!D.destroyed&&!D.closed&&(Vnt(this.sessions[u],D),b()&&!D.closed)){C||(this._freeSessionsCount++,C=!0);let te=D[ea]===0;te&&D.unref(),te&&(this._freeSessionsCount>this.maxFreeSessions||D[wy])?D.close():(k4(this.sessions[u],D),T())}}),J}}catch(D){for(let b of o)b.reject(D);p()}};h.listeners=o,h.completed=!1,h.destroyed=!1,this.queue[u][A]=h,this._tryToCreateNewSession(u,A)})}request(e,r,o,a){return new Promise((n,u)=>{this.getSession(e,r,[{reject:u,resolve:A=>{try{n(A.request(o,a))}catch(p){u(p)}}}])})}createConnection(e,r){return t.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let o=e.port||443,a=e.hostname||e.host;return typeof r.servername>"u"&&(r.servername=a),Hnt.connect(o,a,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[ea]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let o of r)o.destroy(e);for(let r of Object.values(this.queue))for(let o of Object.values(r))o.destroyed=!0;this.queue={}}get freeSessions(){return Rae({agent:this,isFree:!0})}get busySessions(){return Rae({agent:this,isFree:!1})}};xg.kCurrentStreamsCount=ea;xg.kGracefullyClosing=wy;Lae.exports={Agent:xg,globalAgent:new xg}});var R4=_((gNt,Nae)=>{"use strict";var{Readable:Knt}=ve("stream"),F4=class extends Knt{constructor(e,r){super({highWaterMark:r,autoDestroy:!1}),this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};Nae.exports=F4});var T4=_((dNt,Oae)=>{"use strict";Oae.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var Uae=_((mNt,Mae)=>{"use strict";Mae.exports=(t,e,r)=>{for(let o of r)t.on(o,(...a)=>e.emit(o,...a))}});var Hae=_((yNt,_ae)=>{"use strict";_ae.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var jae=_((CNt,qae)=>{"use strict";var By=(t,e,r)=>{qae.exports[e]=class extends t{constructor(...a){super(typeof r=="string"?r:r(a)),this.name=`${super.name} [${e}]`,this.code=e}}};By(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],o=Array.isArray(r);return o&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${o?"one of":"of"} type ${r}. Received ${typeof t[2]}`});By(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);By(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);By(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);By(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);By(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var U4=_((INt,zae)=>{"use strict";var Jnt=ve("http2"),{Writable:znt}=ve("stream"),{Agent:Gae,globalAgent:Xnt}=Q4(),Znt=R4(),$nt=T4(),eit=Uae(),tit=Hae(),{ERR_INVALID_ARG_TYPE:L4,ERR_INVALID_PROTOCOL:rit,ERR_HTTP_HEADERS_SENT:Wae,ERR_INVALID_HTTP_TOKEN:nit,ERR_HTTP_INVALID_HEADER_VALUE:iit,ERR_INVALID_CHAR:sit}=jae(),{HTTP2_HEADER_STATUS:Yae,HTTP2_HEADER_METHOD:Vae,HTTP2_HEADER_PATH:Kae,HTTP2_METHOD_CONNECT:oit}=Jnt.constants,vo=Symbol("headers"),N4=Symbol("origin"),O4=Symbol("session"),Jae=Symbol("options"),Lx=Symbol("flushedHeaders"),R1=Symbol("jobs"),ait=/^[\^`\-\w!#$%&*+.|~]+$/,lit=/[^\t\u0020-\u007E\u0080-\u00FF]/,M4=class extends znt{constructor(e,r,o){super({autoDestroy:!1});let a=typeof e=="string"||e instanceof URL;if(a&&(e=$nt(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(o=r,r=a?e:{...e}):r={...e,...r},r.h2session)this[O4]=r.h2session;else if(r.agent===!1)this.agent=new Gae({maxFreeSessions:0});else if(typeof r.agent>"u"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new Gae({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=Xnt;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new L4("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new rit(r.protocol,"https:");let n=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,u=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:A}=r;if(r.timeout=void 0,this[vo]=Object.create(null),this[R1]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[p,h]of Object.entries(r.headers))this.setHeader(p,h);r.auth&&!("authorization"in this[vo])&&(this[vo].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[Jae]=r,n===443?(this[N4]=`https://${u}`,":authority"in this[vo]||(this[vo][":authority"]=u)):(this[N4]=`https://${u}:${n}`,":authority"in this[vo]||(this[vo][":authority"]=`${u}:${n}`)),A&&this.setTimeout(A),o&&this.once("response",o),this[Lx]=!1}get method(){return this[vo][Vae]}set method(e){e&&(this[vo][Vae]=e.toUpperCase())}get path(){return this[vo][Kae]}set path(e){e&&(this[vo][Kae]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,o){if(this._mustNotHaveABody){o(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let a=()=>this._request.write(e,r,o);this._request?a():this[R1].push(a)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[R1].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[Lx]||this.destroyed)return;this[Lx]=!0;let e=this.method===oit,r=o=>{if(this._request=o,this.destroyed){o.destroy();return}e||eit(o,this,["timeout","continue","close","error"]);let a=u=>(...A)=>{!this.writable&&!this.destroyed?u(...A):this.once("finish",()=>{u(...A)})};o.once("response",a((u,A,p)=>{let h=new Znt(this.socket,o.readableHighWaterMark);this.res=h,h.req=this,h.statusCode=u[Yae],h.headers=u,h.rawHeaders=p,h.once("end",()=>{this.aborted?(h.aborted=!0,h.emit("aborted")):(h.complete=!0,h.socket=null,h.connection=null)}),e?(h.upgrade=!0,this.emit("connect",h,o,Buffer.alloc(0))?this.emit("close"):o.destroy()):(o.on("data",E=>{!h._dumped&&!h.push(E)&&o.pause()}),o.once("end",()=>{h.push(null)}),this.emit("response",h)||h._dump())})),o.once("headers",a(u=>this.emit("information",{statusCode:u[Yae]}))),o.once("trailers",a((u,A,p)=>{let{res:h}=this;h.trailers=u,h.rawTrailers=p}));let{socket:n}=o.session;this.socket=n,this.connection=n;for(let u of this[R1])u();this.emit("socket",this.socket)};if(this[O4])try{r(this[O4].request(this[vo]))}catch(o){this.emit("error",o)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[N4],this[Jae],this[vo]))}catch(o){this.emit("error",o)}}}getHeader(e){if(typeof e!="string")throw new L4("name","string",e);return this[vo][e.toLowerCase()]}get headersSent(){return this[Lx]}removeHeader(e){if(typeof e!="string")throw new L4("name","string",e);if(this.headersSent)throw new Wae("remove");delete this[vo][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new Wae("set");if(typeof e!="string"||!ait.test(e)&&!tit(e))throw new nit("Header name",e);if(typeof r>"u")throw new iit(r,e);if(lit.test(r))throw new sit("header content",e);this[vo][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let o=()=>this._request.setTimeout(e,r);return this._request?o():this[R1].push(o),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};zae.exports=M4});var Zae=_((wNt,Xae)=>{"use strict";var cit=ve("tls");Xae.exports=(t={},e=cit.connect)=>new Promise((r,o)=>{let a=!1,n,u=async()=>{await p,n.off("timeout",A),n.off("error",o),t.resolveSocket?(r({alpnProtocol:n.alpnProtocol,socket:n,timeout:a}),a&&(await Promise.resolve(),n.emit("timeout"))):(n.destroy(),r({alpnProtocol:n.alpnProtocol,timeout:a}))},A=async()=>{a=!0,u()},p=(async()=>{try{n=await e(t,u),n.on("error",o),n.once("timeout",A)}catch(h){o(h)}})()})});var ele=_((BNt,$ae)=>{"use strict";var uit=ve("net");$ae.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),uit.isIP(e)?"":e}});var nle=_((vNt,H4)=>{"use strict";var tle=ve("http"),_4=ve("https"),Ait=Zae(),fit=b4(),pit=U4(),hit=ele(),git=T4(),Nx=new fit({maxSize:100}),T1=new Map,rle=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let o=()=>{t.emit("free",e,r)};e.on("free",o);let a=()=>{t.removeSocket(e,r)};e.on("close",a);let n=()=>{t.removeSocket(e,r),e.off("close",a),e.off("free",o),e.off("agentRemove",n)};e.on("agentRemove",n),t.emit("free",e,r)},dit=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Nx.has(e)){if(T1.has(e))return(await T1.get(e)).alpnProtocol;let{path:r,agent:o}=t;t.path=t.socketPath;let a=Ait(t);T1.set(e,a);try{let{socket:n,alpnProtocol:u}=await a;if(Nx.set(e,u),t.path=r,u==="h2")n.destroy();else{let{globalAgent:A}=_4,p=_4.Agent.prototype.createConnection;o?o.createConnection===p?rle(o,n,t):n.destroy():A.createConnection===p?rle(A,n,t):n.destroy()}return T1.delete(e),u}catch(n){throw T1.delete(e),n}}return Nx.get(e)};H4.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=git(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e={ALPNProtocols:["h2","http/1.1"],...t,...e,resolveSocket:!0},!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let o=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||hit(e),e.port=e.port||(o?443:80),e._defaultAgent=o?_4.globalAgent:tle.globalAgent;let a=e.agent;if(a){if(a.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=a[o?"https":"http"]}return o&&await dit(e)==="h2"?(a&&(e.agent=a.http2),new pit(e,r)):tle.request(e,r)};H4.exports.protocolCache=Nx});var sle=_((DNt,ile)=>{"use strict";var mit=ve("http2"),yit=Q4(),q4=U4(),Eit=R4(),Cit=nle(),Iit=(t,e,r)=>new q4(t,e,r),wit=(t,e,r)=>{let o=new q4(t,e,r);return o.end(),o};ile.exports={...mit,ClientRequest:q4,IncomingMessage:Eit,...yit,request:Iit,get:wit,auto:Cit}});var G4=_(j4=>{"use strict";Object.defineProperty(j4,"__esModule",{value:!0});var ole=Ff();j4.default=t=>ole.default.nodeStream(t)&&ole.default.function_(t.getBoundary)});var ule=_(W4=>{"use strict";Object.defineProperty(W4,"__esModule",{value:!0});var lle=ve("fs"),cle=ve("util"),ale=Ff(),Bit=G4(),vit=cle.promisify(lle.stat);W4.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(ale.default.string(t))return Buffer.byteLength(t);if(ale.default.buffer(t))return t.length;if(Bit.default(t))return cle.promisify(t.getLength.bind(t))();if(t instanceof lle.ReadStream){let{size:r}=await vit(t.path);return r===0?void 0:r}}});var V4=_(Y4=>{"use strict";Object.defineProperty(Y4,"__esModule",{value:!0});function Dit(t,e,r){let o={};for(let a of r)o[a]=(...n)=>{e.emit(a,...n)},t.on(a,o[a]);return()=>{for(let a of r)t.off(a,o[a])}}Y4.default=Dit});var Ale=_(K4=>{"use strict";Object.defineProperty(K4,"__esModule",{value:!0});K4.default=()=>{let t=[];return{once(e,r,o){e.once(r,o),t.push({origin:e,event:r,fn:o})},unhandleAll(){for(let e of t){let{origin:r,event:o,fn:a}=e;r.removeListener(o,a)}t.length=0}}}});var ple=_(L1=>{"use strict";Object.defineProperty(L1,"__esModule",{value:!0});L1.TimeoutError=void 0;var Sit=ve("net"),Pit=Ale(),fle=Symbol("reentry"),xit=()=>{},Ox=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`),this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};L1.TimeoutError=Ox;L1.default=(t,e,r)=>{if(fle in t)return xit;t[fle]=!0;let o=[],{once:a,unhandleAll:n}=Pit.default(),u=(w,D,b)=>{var C;let T=setTimeout(D,w,w,b);(C=T.unref)===null||C===void 0||C.call(T);let N=()=>{clearTimeout(T)};return o.push(N),N},{host:A,hostname:p}=r,h=(w,D)=>{t.destroy(new Ox(w,D))},E=()=>{for(let w of o)w();n()};if(t.once("error",w=>{if(E(),t.listenerCount("error")===0)throw w}),t.once("close",E),a(t,"response",w=>{a(w,"end",E)}),typeof e.request<"u"&&u(e.request,h,"request"),typeof e.socket<"u"){let w=()=>{h(e.socket,"socket")};t.setTimeout(e.socket,w),o.push(()=>{t.removeListener("timeout",w)})}return a(t,"socket",w=>{var D;let{socketPath:b}=t;if(w.connecting){let C=!!(b??Sit.isIP((D=p??A)!==null&&D!==void 0?D:"")!==0);if(typeof e.lookup<"u"&&!C&&typeof w.address().address>"u"){let T=u(e.lookup,h,"lookup");a(w,"lookup",T)}if(typeof e.connect<"u"){let T=()=>u(e.connect,h,"connect");C?a(w,"connect",T()):a(w,"lookup",N=>{N===null&&a(w,"connect",T())})}typeof e.secureConnect<"u"&&r.protocol==="https:"&&a(w,"connect",()=>{let T=u(e.secureConnect,h,"secureConnect");a(w,"secureConnect",T)})}if(typeof e.send<"u"){let C=()=>u(e.send,h,"send");w.connecting?a(w,"connect",()=>{a(t,"upload-complete",C())}):a(t,"upload-complete",C())}}),typeof e.response<"u"&&a(t,"upload-complete",()=>{let w=u(e.response,h,"response");a(t,"response",w)}),E}});var gle=_(J4=>{"use strict";Object.defineProperty(J4,"__esModule",{value:!0});var hle=Ff();J4.default=t=>{t=t;let e={protocol:t.protocol,hostname:hle.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return hle.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var dle=_(z4=>{"use strict";Object.defineProperty(z4,"__esModule",{value:!0});var bit=ve("url"),kit=["protocol","host","hostname","port","pathname","search"];z4.default=(t,e)=>{var r,o;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(o=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&o!==void 0?o:""}`}let a=new bit.URL(t);if(e.path){let n=e.path.indexOf("?");n===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,n),e.search=e.path.slice(n+1)),delete e.path}for(let n of kit)e[n]&&(a[n]=e[n].toString());return a}});var mle=_(Z4=>{"use strict";Object.defineProperty(Z4,"__esModule",{value:!0});var X4=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};Z4.default=X4});var eU=_($4=>{"use strict";Object.defineProperty($4,"__esModule",{value:!0});var Qit=async t=>{let e=[],r=0;for await(let o of t)e.push(o),r+=Buffer.byteLength(o);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};$4.default=Qit});var Ele=_(bg=>{"use strict";Object.defineProperty(bg,"__esModule",{value:!0});bg.dnsLookupIpVersionToFamily=bg.isDnsLookupIpVersion=void 0;var yle={auto:0,ipv4:4,ipv6:6};bg.isDnsLookupIpVersion=t=>t in yle;bg.dnsLookupIpVersionToFamily=t=>{if(bg.isDnsLookupIpVersion(t))return yle[t];throw new Error("Invalid DNS lookup IP version")}});var tU=_(Mx=>{"use strict";Object.defineProperty(Mx,"__esModule",{value:!0});Mx.isResponseOk=void 0;Mx.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var Ile=_(rU=>{"use strict";Object.defineProperty(rU,"__esModule",{value:!0});var Cle=new Set;rU.default=t=>{Cle.has(t)||(Cle.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var wle=_(nU=>{"use strict";Object.defineProperty(nU,"__esModule",{value:!0});var mi=Ff(),Fit=(t,e)=>{if(mi.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");mi.assert.any([mi.default.string,mi.default.undefined],t.encoding),mi.assert.any([mi.default.boolean,mi.default.undefined],t.resolveBodyOnly),mi.assert.any([mi.default.boolean,mi.default.undefined],t.methodRewriting),mi.assert.any([mi.default.boolean,mi.default.undefined],t.isStream),mi.assert.any([mi.default.string,mi.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry={...e.retry}:t.retry={calculateDelay:o=>o.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},mi.default.object(r)?(t.retry={...t.retry,...r},t.retry.methods=[...new Set(t.retry.methods.map(o=>o.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):mi.default.number(r)&&(t.retry.limit=r),mi.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(mi.default.number))),mi.default.object(t.pagination)){e&&(t.pagination={...e.pagination,...t.pagination});let{pagination:o}=t;if(!mi.default.function_(o.transform))throw new Error("`options.pagination.transform` must be implemented");if(!mi.default.function_(o.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!mi.default.function_(o.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!mi.default.function_(o.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};nU.default=Fit});var Ble=_(N1=>{"use strict";Object.defineProperty(N1,"__esModule",{value:!0});N1.retryAfterStatusCodes=void 0;N1.retryAfterStatusCodes=new Set([413,429,503]);var Rit=({attemptCount:t,retryOptions:e,error:r,retryAfter:o})=>{if(t>e.limit)return 0;let a=e.methods.includes(r.options.method),n=e.errorCodes.includes(r.code),u=r.response&&e.statusCodes.includes(r.response.statusCode);if(!a||!n&&!u)return 0;if(r.response){if(o)return e.maxRetryAfter===void 0||o>e.maxRetryAfter?0:o;if(r.response.statusCode===413)return 0}let A=Math.random()*100;return 2**(t-1)*1e3+A};N1.default=Rit});var U1=_(Qn=>{"use strict";Object.defineProperty(Qn,"__esModule",{value:!0});Qn.UnsupportedProtocolError=Qn.ReadError=Qn.TimeoutError=Qn.UploadError=Qn.CacheError=Qn.HTTPError=Qn.MaxRedirectsError=Qn.RequestError=Qn.setNonEnumerableProperties=Qn.knownHookEvents=Qn.withoutBody=Qn.kIsNormalizedAlready=void 0;var vle=ve("util"),Dle=ve("stream"),Tit=ve("fs"),uh=ve("url"),Sle=ve("http"),iU=ve("http"),Lit=ve("https"),Nit=_oe(),Oit=Voe(),Ple=Sae(),Mit=kae(),Uit=sle(),_it=Rx(),at=Ff(),Hit=ule(),xle=G4(),qit=V4(),ble=ple(),jit=gle(),kle=dle(),Git=mle(),Wit=eU(),Qle=Ele(),Yit=tU(),Ah=Ile(),Vit=wle(),Kit=Ble(),sU,Ys=Symbol("request"),Hx=Symbol("response"),vy=Symbol("responseSize"),Dy=Symbol("downloadedSize"),Sy=Symbol("bodySize"),Py=Symbol("uploadedSize"),Ux=Symbol("serverResponsesPiped"),Fle=Symbol("unproxyEvents"),Rle=Symbol("isFromCache"),oU=Symbol("cancelTimeouts"),Tle=Symbol("startedReading"),xy=Symbol("stopReading"),_x=Symbol("triggerRead"),fh=Symbol("body"),O1=Symbol("jobs"),Lle=Symbol("originalResponse"),Nle=Symbol("retryTimeout");Qn.kIsNormalizedAlready=Symbol("isNormalizedAlready");var Jit=at.default.string(process.versions.brotli);Qn.withoutBody=new Set(["GET","HEAD"]);Qn.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function zit(t){for(let e in t){let r=t[e];if(!at.default.string(r)&&!at.default.number(r)&&!at.default.boolean(r)&&!at.default.null_(r)&&!at.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function Xit(t){return at.default.object(t)&&!("statusCode"in t)}var aU=new Git.default,Zit=async t=>new Promise((e,r)=>{let o=a=>{r(a)};t.pending||e(),t.once("error",o),t.once("ready",()=>{t.off("error",o),e()})}),$it=new Set([300,301,302,303,304,307,308]),est=["context","body","json","form"];Qn.setNonEnumerableProperties=(t,e)=>{let r={};for(let o of t)if(o)for(let a of est)a in o&&(r[a]={writable:!0,configurable:!0,enumerable:!1,value:o[a]});Object.defineProperties(e,r)};var zi=class extends Error{constructor(e,r,o){var a;if(super(e),Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,o instanceof Kx?(Object.defineProperty(this,"request",{enumerable:!1,value:o}),Object.defineProperty(this,"response",{enumerable:!1,value:o[Hx]}),Object.defineProperty(this,"options",{enumerable:!1,value:o.options})):Object.defineProperty(this,"options",{enumerable:!1,value:o}),this.timings=(a=this.request)===null||a===void 0?void 0:a.timings,at.default.string(r.stack)&&at.default.string(this.stack)){let n=this.stack.indexOf(this.message)+this.message.length,u=this.stack.slice(n).split(` -`).reverse(),A=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` -`).reverse();for(;A.length!==0&&A[0]===u[0];)u.shift();this.stack=`${this.stack.slice(0,n)}${u.reverse().join(` -`)}${A.reverse().join(` -`)}`}}};Qn.RequestError=zi;var qx=class extends zi{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e),this.name="MaxRedirectsError"}};Qn.MaxRedirectsError=qx;var jx=class extends zi{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request),this.name="HTTPError"}};Qn.HTTPError=jx;var Gx=class extends zi{constructor(e,r){super(e.message,e,r),this.name="CacheError"}};Qn.CacheError=Gx;var Wx=class extends zi{constructor(e,r){super(e.message,e,r),this.name="UploadError"}};Qn.UploadError=Wx;var Yx=class extends zi{constructor(e,r,o){super(e.message,e,o),this.name="TimeoutError",this.event=e.event,this.timings=r}};Qn.TimeoutError=Yx;var M1=class extends zi{constructor(e,r){super(e.message,e,r),this.name="ReadError"}};Qn.ReadError=M1;var Vx=class extends zi{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e),this.name="UnsupportedProtocolError"}};Qn.UnsupportedProtocolError=Vx;var tst=["socket","connect","continue","information","upgrade","timeout"],Kx=class extends Dle.Duplex{constructor(e,r={},o){super({autoDestroy:!1,highWaterMark:0}),this[Dy]=0,this[Py]=0,this.requestInitialized=!1,this[Ux]=new Set,this.redirects=[],this[xy]=!1,this[_x]=!1,this[O1]=[],this.retryCount=0,this._progressCallbacks=[];let a=()=>this._unlockWrite(),n=()=>this._lockWrite();this.on("pipe",h=>{h.prependListener("data",a),h.on("data",n),h.prependListener("end",a),h.on("end",n)}),this.on("unpipe",h=>{h.off("data",a),h.off("data",n),h.off("end",a),h.off("end",n)}),this.on("pipe",h=>{h instanceof iU.IncomingMessage&&(this.options.headers={...h.headers,...this.options.headers})});let{json:u,body:A,form:p}=r;if((u||A||p)&&this._lockWrite(),Qn.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,o)}catch(h){at.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(h);return}(async()=>{var h;try{this.options.body instanceof Tit.ReadStream&&await Zit(this.options.body);let{url:E}=this.options;if(!E)throw new TypeError("Missing `url` property");if(this.requestUrl=E.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(h=this[Ys])===null||h===void 0||h.destroy();return}for(let w of this[O1])w();this[O1].length=0,this.requestInitialized=!0}catch(E){if(E instanceof zi){this._beforeError(E);return}this.destroyed||this.destroy(E)}})()}static normalizeArguments(e,r,o){var a,n,u,A,p;let h=r;if(at.default.object(e)&&!at.default.urlInstance(e))r={...o,...e,...r};else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r={...o,...r},e!==void 0&&(r.url=e),at.default.urlInstance(r.url)&&(r.url=new uh.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),at.assert.any([at.default.string,at.default.undefined],r.method),at.assert.any([at.default.object,at.default.undefined],r.headers),at.assert.any([at.default.string,at.default.urlInstance,at.default.undefined],r.prefixUrl),at.assert.any([at.default.object,at.default.undefined],r.cookieJar),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.searchParams),at.assert.any([at.default.object,at.default.string,at.default.undefined],r.cache),at.assert.any([at.default.object,at.default.number,at.default.undefined],r.timeout),at.assert.any([at.default.object,at.default.undefined],r.context),at.assert.any([at.default.object,at.default.undefined],r.hooks),at.assert.any([at.default.boolean,at.default.undefined],r.decompress),at.assert.any([at.default.boolean,at.default.undefined],r.ignoreInvalidCookies),at.assert.any([at.default.boolean,at.default.undefined],r.followRedirect),at.assert.any([at.default.number,at.default.undefined],r.maxRedirects),at.assert.any([at.default.boolean,at.default.undefined],r.throwHttpErrors),at.assert.any([at.default.boolean,at.default.undefined],r.http2),at.assert.any([at.default.boolean,at.default.undefined],r.allowGetBody),at.assert.any([at.default.string,at.default.undefined],r.localAddress),at.assert.any([Qle.isDnsLookupIpVersion,at.default.undefined],r.dnsLookupIpVersion),at.assert.any([at.default.object,at.default.undefined],r.https),at.assert.any([at.default.boolean,at.default.undefined],r.rejectUnauthorized),r.https&&(at.assert.any([at.default.boolean,at.default.undefined],r.https.rejectUnauthorized),at.assert.any([at.default.function_,at.default.undefined],r.https.checkServerIdentity),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificateAuthority),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.key),at.assert.any([at.default.string,at.default.object,at.default.array,at.default.undefined],r.https.certificate),at.assert.any([at.default.string,at.default.undefined],r.https.passphrase),at.assert.any([at.default.string,at.default.buffer,at.default.array,at.default.undefined],r.https.pfx)),at.assert.any([at.default.object,at.default.undefined],r.cacheOptions),at.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===o?.headers?r.headers={...r.headers}:r.headers=_it({...o?.headers,...r.headers}),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==o?.searchParams){let b;if(at.default.string(r.searchParams)||r.searchParams instanceof uh.URLSearchParams)b=new uh.URLSearchParams(r.searchParams);else{zit(r.searchParams),b=new uh.URLSearchParams;for(let C in r.searchParams){let T=r.searchParams[C];T===null?b.append(C,""):T!==void 0&&b.append(C,T)}}(a=o?.searchParams)===null||a===void 0||a.forEach((C,T)=>{b.has(T)||b.append(T,C)}),r.searchParams=b}if(r.username=(n=r.username)!==null&&n!==void 0?n:"",r.password=(u=r.password)!==null&&u!==void 0?u:"",at.default.undefined(r.prefixUrl)?r.prefixUrl=(A=o?.prefixUrl)!==null&&A!==void 0?A:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),at.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=kle.default(r.prefixUrl+r.url,r)}else(at.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=kle.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:b}=r;Object.defineProperty(r,"prefixUrl",{set:T=>{let N=r.url;if(!N.href.startsWith(T))throw new Error(`Cannot change \`prefixUrl\` from ${b} to ${T}: ${N.href}`);r.url=new uh.URL(T+N.href.slice(b.length)),b=T},get:()=>b});let{protocol:C}=r.url;if(C==="unix:"&&(C="http:",r.url=new uh.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),C!=="http:"&&C!=="https:")throw new Vx(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:E}=r;if(E){let{setCookie:b,getCookieString:C}=E;at.assert.function_(b),at.assert.function_(C),b.length===4&&C.length===0&&(b=vle.promisify(b.bind(r.cookieJar)),C=vle.promisify(C.bind(r.cookieJar)),r.cookieJar={setCookie:b,getCookieString:C})}let{cache:w}=r;if(w&&(aU.has(w)||aU.set(w,new Ple((b,C)=>{let T=b[Ys](b,C);return at.default.promise(T)&&(T.once=(N,U)=>{if(N==="error")T.catch(U);else if(N==="abort")(async()=>{try{(await T).once("abort",U)}catch{}})();else throw new Error(`Unknown HTTP2 promise event: ${N}`);return T}),T},w))),r.cacheOptions={...r.cacheOptions},r.dnsCache===!0)sU||(sU=new Oit.default),r.dnsCache=sU;else if(!at.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${at.default(r.dnsCache)}`);at.default.number(r.timeout)?r.timeout={request:r.timeout}:o&&r.timeout!==o.timeout?r.timeout={...o.timeout,...r.timeout}:r.timeout={...r.timeout},r.context||(r.context={});let D=r.hooks===o?.hooks;r.hooks={...r.hooks};for(let b of Qn.knownHookEvents)if(b in r.hooks)if(at.default.array(r.hooks[b]))r.hooks[b]=[...r.hooks[b]];else throw new TypeError(`Parameter \`${b}\` must be an Array, got ${at.default(r.hooks[b])}`);else r.hooks[b]=[];if(o&&!D)for(let b of Qn.knownHookEvents)o.hooks[b].length>0&&(r.hooks[b]=[...o.hooks[b],...r.hooks[b]]);if("family"in r&&Ah.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),o?.https&&(r.https={...o.https,...r.https}),"rejectUnauthorized"in r&&Ah.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&Ah.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&Ah.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&Ah.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&Ah.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&Ah.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&Ah.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let b in r.agent)if(b!=="http"&&b!=="https"&&b!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${b}\``)}return r.maxRedirects=(p=r.maxRedirects)!==null&&p!==void 0?p:0,Qn.setNonEnumerableProperties([o,h],r),Vit.default(r,o)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,o=!at.default.undefined(e.form),a=!at.default.undefined(e.json),n=!at.default.undefined(e.body),u=o||a||n,A=Qn.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=A,u){if(A)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([n,o,a].filter(p=>p).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(n&&!(e.body instanceof Dle.Readable)&&!at.default.string(e.body)&&!at.default.buffer(e.body)&&!xle.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(o&&!at.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let p=!at.default.string(r["content-type"]);n?(xle.default(e.body)&&p&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[fh]=e.body):o?(p&&(r["content-type"]="application/x-www-form-urlencoded"),this[fh]=new uh.URLSearchParams(e.form).toString()):(p&&(r["content-type"]="application/json"),this[fh]=e.stringifyJson(e.json));let h=await Hit.default(this[fh],e.headers);at.default.undefined(r["content-length"])&&at.default.undefined(r["transfer-encoding"])&&!A&&!at.default.undefined(h)&&(r["content-length"]=String(h))}}else A?this._lockWrite():this._unlockWrite();this[Sy]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:o}=r;this[Lle]=e,r.decompress&&(e=Mit(e));let a=e.statusCode,n=e;n.statusMessage=n.statusMessage?n.statusMessage:Sle.STATUS_CODES[a],n.url=r.url.toString(),n.requestUrl=this.requestUrl,n.redirectUrls=this.redirects,n.request=this,n.isFromCache=e.fromCache||!1,n.ip=this.ip,n.retryCount=this.retryCount,this[Rle]=n.isFromCache,this[vy]=Number(e.headers["content-length"])||void 0,this[Hx]=e,e.once("end",()=>{this[vy]=this[Dy],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",A=>{e.destroy(),this._beforeError(new M1(A,this))}),e.once("aborted",()=>{this._beforeError(new M1({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let u=e.headers["set-cookie"];if(at.default.object(r.cookieJar)&&u){let A=u.map(async p=>r.cookieJar.setCookie(p,o.toString()));r.ignoreInvalidCookies&&(A=A.map(async p=>p.catch(()=>{})));try{await Promise.all(A)}catch(p){this._beforeError(p);return}}if(r.followRedirect&&e.headers.location&&$it.has(a)){if(e.resume(),this[Ys]&&(this[oU](),delete this[Ys],this[Fle]()),(a===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[fh]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new qx(this));return}try{let p=Buffer.from(e.headers.location,"binary").toString(),h=new uh.URL(p,o),E=h.toString();decodeURI(E),h.hostname!==o.hostname||h.port!==o.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(h.username=r.username,h.password=r.password),this.redirects.push(E),r.url=h;for(let w of r.hooks.beforeRedirect)await w(r,n);this.emit("redirect",n,r),await this._makeRequest()}catch(p){this._beforeError(p);return}return}if(r.isStream&&r.throwHttpErrors&&!Yit.isResponseOk(n)){this._beforeError(new jx(n));return}e.on("readable",()=>{this[_x]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let A of this[Ux])if(!A.headersSent){for(let p in e.headers){let h=r.decompress?p!=="content-encoding":!0,E=e.headers[p];h&&A.setHeader(p,E)}A.statusCode=a}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:o,url:a}=r;Nit.default(e),this[oU]=ble.default(e,o,a);let n=r.cache?"cacheableResponse":"response";e.once(n,p=>{this._onResponse(p)}),e.once("error",p=>{var h;e.destroy(),(h=e.res)===null||h===void 0||h.removeAllListeners("end"),p=p instanceof ble.TimeoutError?new Yx(p,this.timings,this):new zi(p.message,p,this),this._beforeError(p)}),this[Fle]=qit.default(e,this,tst),this[Ys]=e,this.emit("uploadProgress",this.uploadProgress);let u=this[fh],A=this.redirects.length===0?this:e;at.default.nodeStream(u)?(u.pipe(A),u.once("error",p=>{this._beforeError(new Wx(p,this))})):(this._unlockWrite(),at.default.undefined(u)?(this._cannotHaveBody||this._noPipe)&&(A.end(),this._lockWrite()):(this._writeRequest(u,void 0,()=>{}),A.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((o,a)=>{Object.assign(r,jit.default(e)),delete r.url;let n,u=aU.get(r.cache)(r,async A=>{A._readableState.autoDestroy=!1,n&&(await n).emit("cacheableResponse",A),o(A)});r.url=e,u.once("error",a),u.once("request",async A=>{n=A,o(n)})})}async _makeRequest(){var e,r,o,a,n;let{options:u}=this,{headers:A}=u;for(let U in A)if(at.default.undefined(A[U]))delete A[U];else if(at.default.null_(A[U]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${U}\` header`);if(u.decompress&&at.default.undefined(A["accept-encoding"])&&(A["accept-encoding"]=Jit?"gzip, deflate, br":"gzip, deflate"),u.cookieJar){let U=await u.cookieJar.getCookieString(u.url.toString());at.default.nonEmptyString(U)&&(u.headers.cookie=U)}for(let U of u.hooks.beforeRequest){let J=await U(u);if(!at.default.undefined(J)){u.request=()=>J;break}}u.body&&this[fh]!==u.body&&(this[fh]=u.body);let{agent:p,request:h,timeout:E,url:w}=u;if(u.dnsCache&&!("lookup"in u)&&(u.lookup=u.dnsCache.lookup),w.hostname==="unix"){let U=/(?.+?):(?.+)/.exec(`${w.pathname}${w.search}`);if(U?.groups){let{socketPath:J,path:te}=U.groups;Object.assign(u,{socketPath:J,path:te,host:""})}}let D=w.protocol==="https:",b;u.http2?b=Uit.auto:b=D?Lit.request:Sle.request;let C=(e=u.request)!==null&&e!==void 0?e:b,T=u.cache?this._createCacheableRequest:C;p&&!u.http2&&(u.agent=p[D?"https":"http"]),u[Ys]=C,delete u.request,delete u.timeout;let N=u;if(N.shared=(r=u.cacheOptions)===null||r===void 0?void 0:r.shared,N.cacheHeuristic=(o=u.cacheOptions)===null||o===void 0?void 0:o.cacheHeuristic,N.immutableMinTimeToLive=(a=u.cacheOptions)===null||a===void 0?void 0:a.immutableMinTimeToLive,N.ignoreCargoCult=(n=u.cacheOptions)===null||n===void 0?void 0:n.ignoreCargoCult,u.dnsLookupIpVersion!==void 0)try{N.family=Qle.dnsLookupIpVersionToFamily(u.dnsLookupIpVersion)}catch{throw new Error("Invalid `dnsLookupIpVersion` option value")}u.https&&("rejectUnauthorized"in u.https&&(N.rejectUnauthorized=u.https.rejectUnauthorized),u.https.checkServerIdentity&&(N.checkServerIdentity=u.https.checkServerIdentity),u.https.certificateAuthority&&(N.ca=u.https.certificateAuthority),u.https.certificate&&(N.cert=u.https.certificate),u.https.key&&(N.key=u.https.key),u.https.passphrase&&(N.passphrase=u.https.passphrase),u.https.pfx&&(N.pfx=u.https.pfx));try{let U=await T(w,N);at.default.undefined(U)&&(U=b(w,N)),u.request=h,u.timeout=E,u.agent=p,u.https&&("rejectUnauthorized"in u.https&&delete N.rejectUnauthorized,u.https.checkServerIdentity&&delete N.checkServerIdentity,u.https.certificateAuthority&&delete N.ca,u.https.certificate&&delete N.cert,u.https.key&&delete N.key,u.https.passphrase&&delete N.passphrase,u.https.pfx&&delete N.pfx),Xit(U)?this._onRequest(U):this.writable?(this.once("finish",()=>{this._onResponse(U)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(U)}catch(U){throw U instanceof Ple.CacheError?new Gx(U,this):new zi(U.message,U,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new zi(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[xy])return;let{options:r}=this,o=this.retryCount+1;this[xy]=!0,e instanceof zi||(e=new zi(e.message,e,this));let a=e,{response:n}=a;(async()=>{if(n&&!n.body){n.setEncoding(this._readableState.encoding);try{n.rawBody=await Wit.default(n),n.body=n.rawBody.toString()}catch{}}if(this.listenerCount("retry")!==0){let u;try{let A;n&&"retry-after"in n.headers&&(A=Number(n.headers["retry-after"]),Number.isNaN(A)?(A=Date.parse(n.headers["retry-after"])-Date.now(),A<=0&&(A=1)):A*=1e3),u=await r.retry.calculateDelay({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:Kit.default({attemptCount:o,retryOptions:r.retry,error:a,retryAfter:A,computedValue:0})})}catch(A){this._error(new zi(A.message,A,this));return}if(u){let A=async()=>{try{for(let p of this.options.hooks.beforeRetry)await p(this.options,a,o)}catch(p){this._error(new zi(p.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",o,e))};this[Nle]=setTimeout(A,u);return}}this._error(a)})()}_read(){this[_x]=!0;let e=this[Hx];if(e&&!this[xy]){e.readableLength&&(this[_x]=!1);let r;for(;(r=e.read())!==null;){this[Dy]+=r.length,this[Tle]=!0;let o=this.downloadProgress;o.percent<1&&this.emit("downloadProgress",o),this.push(r)}}}_write(e,r,o){let a=()=>{this._writeRequest(e,r,o)};this.requestInitialized?a():this[O1].push(a)}_writeRequest(e,r,o){this[Ys].destroyed||(this._progressCallbacks.push(()=>{this[Py]+=Buffer.byteLength(e,r);let a=this.uploadProgress;a.percent<1&&this.emit("uploadProgress",a)}),this[Ys].write(e,r,a=>{!a&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),o(a)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Ys in this)){e();return}if(this[Ys].destroyed){e();return}this[Ys].end(o=>{o||(this[Sy]=this[Py],this.emit("uploadProgress",this.uploadProgress),this[Ys].emit("upload-complete")),e(o)})};this.requestInitialized?r():this[O1].push(r)}_destroy(e,r){var o;this[xy]=!0,clearTimeout(this[Nle]),Ys in this&&(this[oU](),!((o=this[Hx])===null||o===void 0)&&o.complete||this[Ys].destroy()),e!==null&&!at.default.undefined(e)&&!(e instanceof zi)&&(e=new zi(e.message,e,this)),r(e)}get _isAboutToError(){return this[xy]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,o;return((r=(e=this[Ys])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!(!((o=this[Lle])===null||o===void 0)&&o.complete)}get socket(){var e,r;return(r=(e=this[Ys])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[vy]?e=this[Dy]/this[vy]:this[vy]===this[Dy]?e=1:e=0,{percent:e,transferred:this[Dy],total:this[vy]}}get uploadProgress(){let e;return this[Sy]?e=this[Py]/this[Sy]:this[Sy]===this[Py]?e=1:e=0,{percent:e,transferred:this[Py],total:this[Sy]}}get timings(){var e;return(e=this[Ys])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[Rle]}pipe(e,r){if(this[Tle])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof iU.ServerResponse&&this[Ux].add(e),super.pipe(e,r)}unpipe(e){return e instanceof iU.ServerResponse&&this[Ux].delete(e),super.unpipe(e),this}};Qn.default=Kx});var _1=_(zc=>{"use strict";var rst=zc&&zc.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),nst=zc&&zc.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&rst(e,t,r)};Object.defineProperty(zc,"__esModule",{value:!0});zc.CancelError=zc.ParseError=void 0;var Ole=U1(),lU=class extends Ole.RequestError{constructor(e,r){let{options:o}=r.request;super(`${e.message} in "${o.url.toString()}"`,e,r.request),this.name="ParseError"}};zc.ParseError=lU;var cU=class extends Ole.RequestError{constructor(e){super("Promise was canceled",{},e),this.name="CancelError"}get isCanceled(){return!0}};zc.CancelError=cU;nst(U1(),zc)});var Ule=_(uU=>{"use strict";Object.defineProperty(uU,"__esModule",{value:!0});var Mle=_1(),ist=(t,e,r,o)=>{let{rawBody:a}=t;try{if(e==="text")return a.toString(o);if(e==="json")return a.length===0?"":r(a.toString());if(e==="buffer")return a;throw new Mle.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(n){throw new Mle.ParseError(n,t)}};uU.default=ist});var AU=_(ph=>{"use strict";var sst=ph&&ph.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ost=ph&&ph.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&sst(e,t,r)};Object.defineProperty(ph,"__esModule",{value:!0});var ast=ve("events"),lst=Ff(),cst=Moe(),Jx=_1(),_le=Ule(),Hle=U1(),ust=V4(),Ast=eU(),qle=tU(),fst=["request","response","redirect","uploadProgress","downloadProgress"];function jle(t){let e,r,o=new ast.EventEmitter,a=new cst((u,A,p)=>{let h=E=>{let w=new Hle.default(void 0,t);w.retryCount=E,w._noPipe=!0,p(()=>w.destroy()),p.shouldReject=!1,p(()=>A(new Jx.CancelError(w))),e=w,w.once("response",async C=>{var T;if(C.retryCount=E,C.request.aborted)return;let N;try{N=await Ast.default(w),C.rawBody=N}catch{return}if(w._isAboutToError)return;let U=((T=C.headers["content-encoding"])!==null&&T!==void 0?T:"").toLowerCase(),J=["gzip","deflate","br"].includes(U),{options:te}=w;if(J&&!te.decompress)C.body=N;else try{C.body=_le.default(C,te.responseType,te.parseJson,te.encoding)}catch(le){if(C.body=N.toString(),qle.isResponseOk(C)){w._beforeError(le);return}}try{for(let[le,ce]of te.hooks.afterResponse.entries())C=await ce(C,async ue=>{let Ie=Hle.default.normalizeArguments(void 0,{...ue,retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1},te);Ie.hooks.afterResponse=Ie.hooks.afterResponse.slice(0,le);for(let De of Ie.hooks.beforeRetry)await De(Ie);let he=jle(Ie);return p(()=>{he.catch(()=>{}),he.cancel()}),he})}catch(le){w._beforeError(new Jx.RequestError(le.message,le,w));return}if(!qle.isResponseOk(C)){w._beforeError(new Jx.HTTPError(C));return}r=C,u(w.options.resolveBodyOnly?C.body:C)});let D=C=>{if(a.isCanceled)return;let{options:T}=w;if(C instanceof Jx.HTTPError&&!T.throwHttpErrors){let{response:N}=C;u(w.options.resolveBodyOnly?N.body:N);return}A(C)};w.once("error",D);let b=w.options.body;w.once("retry",(C,T)=>{var N,U;if(b===((N=T.request)===null||N===void 0?void 0:N.options.body)&&lst.default.nodeStream((U=T.request)===null||U===void 0?void 0:U.options.body)){D(T);return}h(C)}),ust.default(w,o,fst)};h(0)});a.on=(u,A)=>(o.on(u,A),a);let n=u=>{let A=(async()=>{await a;let{options:p}=r.request;return _le.default(r,u,p.parseJson,p.encoding)})();return Object.defineProperties(A,Object.getOwnPropertyDescriptors(a)),A};return a.json=()=>{let{headers:u}=e.options;return!e.writableFinished&&u.accept===void 0&&(u.accept="application/json"),n("json")},a.buffer=()=>n("buffer"),a.text=()=>n("text"),a}ph.default=jle;ost(_1(),ph)});var Gle=_(fU=>{"use strict";Object.defineProperty(fU,"__esModule",{value:!0});var pst=_1();function hst(t,...e){let r=(async()=>{if(t instanceof pst.RequestError)try{for(let a of e)if(a)for(let n of a)t=await n(t)}catch(a){t=a}throw t})(),o=()=>r;return r.json=o,r.text=o,r.buffer=o,r.on=o,r}fU.default=hst});var Vle=_(pU=>{"use strict";Object.defineProperty(pU,"__esModule",{value:!0});var Wle=Ff();function Yle(t){for(let e of Object.values(t))(Wle.default.plainObject(e)||Wle.default.array(e))&&Yle(e);return Object.freeze(t)}pU.default=Yle});var Jle=_(Kle=>{"use strict";Object.defineProperty(Kle,"__esModule",{value:!0})});var hU=_(Xl=>{"use strict";var gst=Xl&&Xl.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),dst=Xl&&Xl.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&gst(e,t,r)};Object.defineProperty(Xl,"__esModule",{value:!0});Xl.defaultHandler=void 0;var zle=Ff(),zl=AU(),mst=Gle(),Xx=U1(),yst=Vle(),Est={RequestError:zl.RequestError,CacheError:zl.CacheError,ReadError:zl.ReadError,HTTPError:zl.HTTPError,MaxRedirectsError:zl.MaxRedirectsError,TimeoutError:zl.TimeoutError,ParseError:zl.ParseError,CancelError:zl.CancelError,UnsupportedProtocolError:zl.UnsupportedProtocolError,UploadError:zl.UploadError},Cst=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:zx}=Xx.default,Xle=(...t)=>{let e;for(let r of t)e=zx(void 0,r,e);return e},Ist=t=>t.isStream?new Xx.default(void 0,t):zl.default(t),wst=t=>"defaults"in t&&"options"in t.defaults,Bst=["get","post","put","patch","head","delete"];Xl.defaultHandler=(t,e)=>e(t);var Zle=(t,e)=>{if(t)for(let r of t)r(e)},$le=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(o=>(a,n)=>{let u,A=o(a,p=>(u=n(p),u));if(A!==u&&!a.isStream&&u){let p=A,{then:h,catch:E,finally:w}=p;Object.setPrototypeOf(p,Object.getPrototypeOf(u)),Object.defineProperties(p,Object.getOwnPropertyDescriptors(u)),p.then=h,p.catch=E,p.finally=w}return A});let e=(o,a={},n)=>{var u,A;let p=0,h=E=>t.handlers[p++](E,p===t.handlers.length?Ist:h);if(zle.default.plainObject(o)){let E={...o,...a};Xx.setNonEnumerableProperties([o,a],E),a=E,o=void 0}try{let E;try{Zle(t.options.hooks.init,a),Zle((u=a.hooks)===null||u===void 0?void 0:u.init,a)}catch(D){E=D}let w=zx(o,a,n??t.options);if(w[Xx.kIsNormalizedAlready]=!0,E)throw new zl.RequestError(E.message,E,w);return h(w)}catch(E){if(a.isStream)throw E;return mst.default(E,t.options.hooks.beforeError,(A=a.hooks)===null||A===void 0?void 0:A.beforeError)}};e.extend=(...o)=>{let a=[t.options],n=[...t._rawHandlers],u;for(let A of o)wst(A)?(a.push(A.defaults.options),n.push(...A.defaults._rawHandlers),u=A.defaults.mutableDefaults):(a.push(A),"handlers"in A&&n.push(...A.handlers),u=A.mutableDefaults);return n=n.filter(A=>A!==Xl.defaultHandler),n.length===0&&n.push(Xl.defaultHandler),$le({options:Xle(...a),handlers:n,mutableDefaults:!!u})};let r=async function*(o,a){let n=zx(o,a,t.options);n.resolveBodyOnly=!1;let u=n.pagination;if(!zle.default.object(u))throw new TypeError("`options.pagination` must be implemented");let A=[],{countLimit:p}=u,h=0;for(;h{let n=[];for await(let u of r(o,a))n.push(u);return n},e.paginate.each=r,e.stream=(o,a)=>e(o,{...a,isStream:!0});for(let o of Bst)e[o]=(a,n)=>e(a,{...n,method:o}),e.stream[o]=(a,n)=>e(a,{...n,method:o,isStream:!0});return Object.assign(e,Est),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:yst.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=Xle,e};Xl.default=$le;dst(Jle(),Xl)});var rce=_((Rf,Zx)=>{"use strict";var vst=Rf&&Rf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ece=Rf&&Rf.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&vst(e,t,r)};Object.defineProperty(Rf,"__esModule",{value:!0});var Dst=ve("url"),tce=hU(),Sst={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let o of e){let a=o.split(";");if(a[1].includes("next")){r=a[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new Dst.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:1/0,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[tce.defaultHandler],mutableDefaults:!1},gU=tce.default(Sst);Rf.default=gU;Zx.exports=gU;Zx.exports.default=gU;Zx.exports.__esModule=!0;ece(hU(),Rf);ece(AU(),Rf)});var on={};Vt(on,{Method:()=>cce,del:()=>Qst,get:()=>EU,getNetworkSettings:()=>lce,post:()=>CU,put:()=>kst,request:()=>H1});function sce(t){let e=new URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),e.username&&e.password&&(r.proxyAuth=`${e.username}:${e.password}`),{proxy:r}}async function dU(t){return Al(ice,t,()=>ae.readFilePromise(t).then(e=>(ice.set(t,e),e)))}function bst({statusCode:t,statusMessage:e},r){let o=Ut(r,t,Ct.NUMBER),a=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return ty(r,`${o}${e?` (${e})`:""}`,a)}async function $x(t,{configuration:e,customErrorMessage:r}){try{return await t}catch(o){if(o.name!=="HTTPError")throw o;let a=r?.(o,e)??o.response.body?.error;a==null&&(o.message.startsWith("Response code")?a="The remote server failed to provide the requested resource":a=o.message),o.code==="ETIMEDOUT"&&o.event==="socket"&&(a+=`(can be increased via ${Ut(e,"httpTimeout",Ct.SETTING)})`);let n=new Jt(35,a,u=>{o.response&&u.reportError(35,` ${$u(e,{label:"Response Code",value:Yc(Ct.NO_HINT,bst(o.response,e))})}`),o.request&&(u.reportError(35,` ${$u(e,{label:"Request Method",value:Yc(Ct.NO_HINT,o.request.options.method)})}`),u.reportError(35,` ${$u(e,{label:"Request URL",value:Yc(Ct.URL,o.request.requestUrl)})}`)),o.request.redirects.length>0&&u.reportError(35,` ${$u(e,{label:"Request Redirects",value:Yc(Ct.NO_HINT,cO(e,o.request.redirects,Ct.URL))})}`),o.request.retryCount===o.request.options.retry.limit&&u.reportError(35,` ${$u(e,{label:"Request Retry Count",value:Yc(Ct.NO_HINT,`${Ut(e,o.request.retryCount,Ct.NUMBER)} (can be increased via ${Ut(e,"httpRetry",Ct.SETTING)})`)})}`)});throw n.originalError=o,n}}function lce(t,e){let r=[...e.configuration.get("networkSettings")].sort(([u],[A])=>A.length-u.length),o={enableNetwork:void 0,httpsCaFilePath:void 0,httpProxy:void 0,httpsProxy:void 0,httpsKeyFilePath:void 0,httpsCertFilePath:void 0},a=Object.keys(o),n=typeof t=="string"?new URL(t):t;for(let[u,A]of r)if(yU.default.isMatch(n.hostname,u))for(let p of a){let h=A.get(p);h!==null&&typeof o[p]>"u"&&(o[p]=h)}for(let u of a)typeof o[u]>"u"&&(o[u]=e.configuration.get(u));return o}async function H1(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET",wrapNetworkRequest:A}){let p={target:t,body:e,configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u},h=async()=>await Fst(t,e,p),E=typeof A<"u"?await A(h,p):h;return await(await r.reduceHook(D=>D.wrapNetworkRequest,E,p))()}async function EU(t,{configuration:e,jsonResponse:r,customErrorMessage:o,wrapNetworkRequest:a,...n}){let u=()=>$x(H1(t,null,{configuration:e,wrapNetworkRequest:a,...n}),{configuration:e,customErrorMessage:o}).then(p=>p.body),A=await(typeof a<"u"?u():Al(nce,t,()=>u().then(p=>(nce.set(t,p),p))));return r?JSON.parse(A.toString()):A}async function kst(t,e,{customErrorMessage:r,...o}){return(await $x(H1(t,e,{...o,method:"PUT"}),{customErrorMessage:r,configuration:o.configuration})).body}async function CU(t,e,{customErrorMessage:r,...o}){return(await $x(H1(t,e,{...o,method:"POST"}),{customErrorMessage:r,configuration:o.configuration})).body}async function Qst(t,{customErrorMessage:e,...r}){return(await $x(H1(t,null,{...r,method:"DELETE"}),{customErrorMessage:e,configuration:r.configuration})).body}async function Fst(t,e,{configuration:r,headers:o,jsonRequest:a,jsonResponse:n,method:u="GET"}){let A=typeof t=="string"?new URL(t):t,p=lce(A,{configuration:r});if(p.enableNetwork===!1)throw new Jt(80,`Request to '${A.href}' has been blocked because of your configuration settings`);if(A.protocol==="http:"&&!yU.default.isMatch(A.hostname,r.get("unsafeHttpWhitelist")))throw new Jt(81,`Unsafe http requests must be explicitly whitelisted in your configuration (${A.hostname})`);let E={agent:{http:p.httpProxy?mU.default.httpOverHttp(sce(p.httpProxy)):Pst,https:p.httpsProxy?mU.default.httpsOverHttp(sce(p.httpsProxy)):xst},headers:o,method:u};E.responseType=n?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!a&&typeof e=="string"?E.body=e:E.json=e);let w=r.get("httpTimeout"),D=r.get("httpRetry"),b=r.get("enableStrictSsl"),C=p.httpsCaFilePath,T=p.httpsCertFilePath,N=p.httpsKeyFilePath,{default:U}=await Promise.resolve().then(()=>et(rce())),J=C?await dU(C):void 0,te=T?await dU(T):void 0,le=N?await dU(N):void 0,ce=U.extend({timeout:{socket:w},retry:D,https:{rejectUnauthorized:b,certificateAuthority:J,certificate:te,key:le},...E});return r.getLimit("networkConcurrency")(()=>ce(A))}var oce,ace,yU,mU,nce,ice,Pst,xst,cce,eb=It(()=>{St();oce=ve("https"),ace=ve("http"),yU=et(Xo()),mU=et(Roe());Kl();Wl();Gl();nce=new Map,ice=new Map,Pst=new ace.Agent({keepAlive:!0}),xst=new oce.Agent({keepAlive:!0});cce=(a=>(a.GET="GET",a.PUT="PUT",a.POST="POST",a.DELETE="DELETE",a))(cce||{})});var Xi={};Vt(Xi,{availableParallelism:()=>wU,getArchitecture:()=>q1,getArchitectureName:()=>Ost,getArchitectureSet:()=>IU,getCaller:()=>Hst,major:()=>Rst,openUrl:()=>Tst});function Nst(){if(process.platform==="darwin"||process.platform==="win32")return null;let t;try{t=ae.readFileSync(Lst)}catch{}if(typeof t<"u"){if(t&&(t.includes("GLIBC")||t.includes("libc")))return"glibc";if(t&&t.includes("musl"))return"musl"}let r=(process.report?.getReport()??{}).sharedObjects??[],o=/\/(?:(ld-linux-|[^/]+-linux-gnu\/)|(libc.musl-|ld-musl-))/;return eh(r,a=>{let n=a.match(o);if(!n)return eh.skip;if(n[1])return"glibc";if(n[2])return"musl";throw new Error("Assertion failed: Expected the libc variant to have been detected")})??null}function q1(){return Ace=Ace??{os:process.platform,cpu:process.arch,libc:Nst()}}function Ost(t=q1()){return t.libc?`${t.os}-${t.cpu}-${t.libc}`:`${t.os}-${t.cpu}`}function IU(){let t=q1();return fce=fce??{os:[t.os],cpu:[t.cpu],libc:t.libc?[t.libc]:[]}}function _st(t){let e=Mst.exec(t);if(!e)return null;let r=e[2]&&e[2].indexOf("native")===0,o=e[2]&&e[2].indexOf("eval")===0,a=Ust.exec(e[2]);return o&&a!=null&&(e[2]=a[1],e[3]=a[2],e[4]=a[3]),{file:r?null:e[2],methodName:e[1]||"",arguments:r?[e[2]]:[],line:e[3]?+e[3]:null,column:e[4]?+e[4]:null}}function Hst(){let e=new Error().stack.split(` -`)[3];return _st(e)}function wU(){return typeof tb.default.availableParallelism<"u"?tb.default.availableParallelism():Math.max(1,tb.default.cpus().length)}var tb,Rst,uce,Tst,Lst,Ace,fce,Mst,Ust,rb=It(()=>{St();tb=et(ve("os"));nb();Gl();Rst=Number(process.versions.node.split(".")[0]),uce=new Map([["darwin","open"],["linux","xdg-open"],["win32","explorer.exe"]]).get(process.platform),Tst=typeof uce<"u"?async t=>{try{return await BU(uce,[t],{cwd:V.cwd()}),!0}catch{return!1}}:void 0,Lst="/usr/bin/ldd";Mst=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Ust=/\((\S*)(?::(\d+))(?::(\d+))\)/});function xU(t,e,r,o,a){let n=b1(r);if(o.isArray||o.type==="ANY"&&Array.isArray(n))return Array.isArray(n)?n.map((u,A)=>vU(t,`${e}[${A}]`,u,o,a)):String(n).split(/,/).map(u=>vU(t,e,u,o,a));if(Array.isArray(n))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return vU(t,e,r,o,a)}function vU(t,e,r,o,a){let n=b1(r);switch(o.type){case"ANY":return wx(n);case"SHAPE":return Wst(t,e,r,o,a);case"MAP":return Yst(t,e,r,o,a)}if(n===null&&!o.isNullable&&o.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if(o.values?.includes(n))return n;let A=(()=>{if(o.type==="BOOLEAN"&&typeof n!="string")return f1(n);if(typeof n!="string")throw new Error(`Expected configuration setting "${e}" to be a string, got ${typeof n}`);let p=NP(n,{env:t.env});switch(o.type){case"ABSOLUTE_PATH":{let h=a,E=e4(r);return E&&E[0]!=="<"&&(h=V.dirname(E)),V.resolve(h,Ae.toPortablePath(p))}case"LOCATOR_LOOSE":return Pf(p,!1);case"NUMBER":return parseInt(p);case"LOCATOR":return Pf(p);case"BOOLEAN":return f1(p);default:return p}})();if(o.values&&!o.values.includes(A))throw new Error(`Invalid value, expected one of ${o.values.join(", ")}`);return A}function Wst(t,e,r,o,a){let n=b1(r);if(typeof n!="object"||Array.isArray(n))throw new it(`Object configuration settings "${e}" must be an object`);let u=bU(t,o,{ignoreArrays:!0});if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=`${e}.${A}`;if(!o.properties[A])throw new it(`Unrecognized configuration settings found: ${e}.${A} - run "yarn config -v" to see the list of settings supported in Yarn`);u.set(A,xU(t,h,p,o.properties[A],a))}return u}function Yst(t,e,r,o,a){let n=b1(r),u=new Map;if(typeof n!="object"||Array.isArray(n))throw new it(`Map configuration settings "${e}" must be an object`);if(n===null)return u;for(let[A,p]of Object.entries(n)){let h=o.normalizeKeys?o.normalizeKeys(A):A,E=`${e}['${h}']`,w=o.valueDefinition;u.set(h,xU(t,E,p,w,a))}return u}function bU(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case"SHAPE":{if(e.isArray&&!r)return[];let o=new Map;for(let[a,n]of Object.entries(e.properties))o.set(a,bU(t,n));return o}case"MAP":return e.isArray&&!r?[]:new Map;case"ABSOLUTE_PATH":return e.default===null?null:t.projectCwd===null?Array.isArray(e.default)?e.default.map(o=>V.normalize(o)):V.isAbsolute(e.default)?V.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(o=>V.resolve(t.projectCwd,o)):V.resolve(t.projectCwd,e.default);default:return e.default}}function sb(t,e,r){if(e.type==="SECRET"&&typeof t=="string"&&r.hideSecrets)return Gst;if(e.type==="ABSOLUTE_PATH"&&typeof t=="string"&&r.getNativePaths)return Ae.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let o=[];for(let a of t)o.push(sb(a,e,r));return o}if(e.type==="MAP"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=sb(n,e.valueDefinition,r);typeof u<"u"&&o.set(a,u)}return o}if(e.type==="SHAPE"&&t instanceof Map){if(t.size===0)return;let o=new Map;for(let[a,n]of t.entries()){let u=e.properties[a],A=sb(n,u,r);typeof A<"u"&&o.set(a,A)}return o}return t}function Vst(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),e.startsWith(ob)&&(e=(0,hce.default)(e.slice(ob.length)),t[e]=r);return t}function SU(){let t=`${ob}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return PU}async function pce(t){try{return await ae.readFilePromise(t)}catch{return Buffer.of()}}async function Kst(t,e){return Buffer.compare(...await Promise.all([pce(t),pce(e)]))===0}async function Jst(t,e){let[r,o]=await Promise.all([ae.statPromise(t),ae.statPromise(e)]);return r.dev===o.dev&&r.ino===o.ino}async function Xst({configuration:t,selfPath:e}){let r=t.get("yarnPath");return t.get("ignorePath")||r===null||r===e||await zst(r,e)?null:r}var hce,Tf,gce,dce,mce,DU,qst,j1,jst,by,ob,PU,Gst,G1,yce,ab,ib,zst,ze,W1=It(()=>{St();Ol();hce=et(jK()),Tf=et(sg());Gt();gce=et(NJ()),dce=ve("module"),mce=et(lg()),DU=ve("stream");Kse();Ay();YM();VM();KM();woe();JM();Dg();Poe();vx();Wl();ah();eb();Gl();rb();bf();Io();qst=function(){if(!Tf.GITHUB_ACTIONS||!process.env.GITHUB_EVENT_PATH)return!1;let t=Ae.toPortablePath(process.env.GITHUB_EVENT_PATH),e;try{e=ae.readJsonSync(t)}catch{return!1}return!(!("repository"in e)||!e.repository||(e.repository.private??!0))}(),j1=new Set(["@yarnpkg/plugin-constraints","@yarnpkg/plugin-exec","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]),jst=new Set(["isTestEnv","injectNpmUser","injectNpmPassword","injectNpm2FaToken","zipDataEpilogue","cacheCheckpointOverride","cacheVersionOverride","lockfileVersionOverride","binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir","registry","ignoreCwd"]),by=/^(?!v)[a-z0-9._-]+$/i,ob="yarn_",PU=".yarnrc.yml",Gst="********",G1=(E=>(E.ANY="ANY",E.BOOLEAN="BOOLEAN",E.ABSOLUTE_PATH="ABSOLUTE_PATH",E.LOCATOR="LOCATOR",E.LOCATOR_LOOSE="LOCATOR_LOOSE",E.NUMBER="NUMBER",E.STRING="STRING",E.SECRET="SECRET",E.SHAPE="SHAPE",E.MAP="MAP",E))(G1||{}),yce=Ct,ab=(r=>(r.JUNCTIONS="junctions",r.SYMLINKS="symlinks",r))(ab||{}),ib={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:"STRING",default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:"ABSOLUTE_PATH",default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:"BOOLEAN",default:!1},globalFolder:{description:"Folder where all system-global files are stored",type:"ABSOLUTE_PATH",default:r4()},cacheFolder:{description:"Folder where the cache files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:"NUMBER",values:["mixed",0,1,2,3,4,5,6,7,8,9],default:0},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:"ABSOLUTE_PATH",default:"./.yarn/__virtual__"},installStatePath:{description:"Path of the file where the install state will be persisted",type:"ABSOLUTE_PATH",default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:"STRING",default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:"STRING",default:SU()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:"BOOLEAN",default:!0},cacheMigrationMode:{description:"Defines the conditions under which Yarn upgrades should cause the cache archives to be regenerated.",type:"STRING",values:["always","match-spec","required-only"],default:"always"},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:"BOOLEAN",default:UP,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:"BOOLEAN",default:lO,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:"BOOLEAN",default:Tf.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:"BOOLEAN",default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:"BOOLEAN",default:!Tf.isCI,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:"BOOLEAN",default:!0},enableTips:{description:"If true, installs will print a helpful message every day of the week",type:"BOOLEAN",default:!Tf.isCI,defaultText:""},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:"BOOLEAN",default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:"BOOLEAN",default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:"STRING",default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:"STRING",default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:"STRING",default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:"BOOLEAN",default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:"SHAPE",properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]},libc:{description:"Array of supported libc libraries, or null to target them all",type:"STRING",isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:"BOOLEAN",default:!0},enableNetwork:{description:"If false, Yarn will refuse to use the network if required to",type:"BOOLEAN",default:!0},enableOfflineMode:{description:"If true, Yarn will attempt to retrieve files and metadata from the global cache rather than the network",type:"BOOLEAN",default:!1},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:"STRING",default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:"NUMBER",default:6e4},httpRetry:{description:"Retry times on http failure",type:"NUMBER",default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:"NUMBER",default:50},taskPoolConcurrency:{description:"Maximal amount of concurrent heavy task processing",type:"NUMBER",default:wU()},taskPoolMode:{description:"Execution strategy for heavy tasks",type:"STRING",values:["async","workers"],default:"workers"},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{httpsCaFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:"BOOLEAN",default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:"STRING",default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:"STRING",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null}}}},httpsCaFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:"ABSOLUTE_PATH",default:null},httpsKeyFilePath:{description:"Path to file containing private key in PEM format",type:"ABSOLUTE_PATH",default:null},httpsCertFilePath:{description:"Path to file containing certificate chain in PEM format",type:"ABSOLUTE_PATH",default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:"BOOLEAN",default:!0},logFilters:{description:"Overrides for log levels",type:"SHAPE",isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:"STRING",default:void 0},text:{description:"Code of the texts covered by this override",type:"STRING",default:void 0},pattern:{description:"Code of the patterns covered by this override",type:"STRING",default:void 0},level:{description:"Log level override, set to null to remove override",type:"STRING",values:Object.values(HP),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:"BOOLEAN",default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:"NUMBER",default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:"STRING",default:null},enableHardenedMode:{description:"If true, automatically enable --check-resolutions --refresh-lockfile on installs",type:"BOOLEAN",default:Tf.isPR&&qst,defaultText:""},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:"BOOLEAN",default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:"BOOLEAN",default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:"BOOLEAN",default:!1},enableCacheClean:{description:"If false, disallows the `cache clean` command",type:"BOOLEAN",default:!0},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:"STRING",default:"throw"},injectEnvironmentFiles:{description:"List of all the environment files that Yarn should inject inside the process when it starts",type:"ABSOLUTE_PATH",default:[".env.yarn?"],isArray:!0},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:"MAP",valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:"SHAPE",properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:"MAP",valueDefinition:{description:"A range",type:"STRING"}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:"MAP",valueDefinition:{description:"A semver range",type:"STRING"}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:"MAP",valueDefinition:{description:"The peerDependency meta",type:"SHAPE",properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:"BOOLEAN",default:!1}}}}}}}};zst=process.platform==="win32"?Kst:Jst;ze=class t{constructor(e){this.isCI=Tf.isCI;this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.env={};this.limits=new Map;this.packageExtensions=null;this.startingCwd=e}static{this.deleteProperty=Symbol()}static{this.telemetry=null}static create(e,r,o){let a=new t(e);typeof r<"u"&&!(r instanceof Map)&&(a.projectCwd=r),a.importSettings(ib);let n=typeof o<"u"?o:r instanceof Map?r:new Map;for(let[u,A]of n)a.activatePlugin(u,A);return a}static async find(e,r,{strict:o=!0,usePathCheck:a=null,useRc:n=!0}={}){let u=Vst();delete u.rcFilename;let A=new t(e),p=await t.findRcFiles(e),h=await t.findFolderRcFile(my());h&&(p.find(Ie=>Ie.path===h.path)||p.unshift(h));let E=Soe(p.map(ue=>[ue.path,ue.data])),w=Bt.dot,D=new Set(Object.keys(ib)),b=({yarnPath:ue,ignorePath:Ie,injectEnvironmentFiles:he})=>({yarnPath:ue,ignorePath:Ie,injectEnvironmentFiles:he}),C=({yarnPath:ue,ignorePath:Ie,injectEnvironmentFiles:he,...De})=>{let Ee={};for(let[g,me]of Object.entries(De))D.has(g)&&(Ee[g]=me);return Ee},T=({yarnPath:ue,ignorePath:Ie,...he})=>{let De={};for(let[Ee,g]of Object.entries(he))D.has(Ee)||(De[Ee]=g);return De};if(A.importSettings(b(ib)),A.useWithSource("",b(u),e,{strict:!1}),E){let[ue,Ie]=E;A.useWithSource(ue,b(Ie),w,{strict:!1})}if(a){if(await Xst({configuration:A,selfPath:a})!==null)return A;A.useWithSource("",{ignorePath:!0},e,{strict:!1,overwrite:!0})}let N=await t.findProjectCwd(e);A.startingCwd=e,A.projectCwd=N;let U=Object.assign(Object.create(null),process.env);A.env=U;let J=await Promise.all(A.get("injectEnvironmentFiles").map(async ue=>{let Ie=ue.endsWith("?")?await ae.readFilePromise(ue.slice(0,-1),"utf8").catch(()=>""):await ae.readFilePromise(ue,"utf8");return(0,gce.parse)(Ie)}));for(let ue of J)for(let[Ie,he]of Object.entries(ue))A.env[Ie]=NP(he,{env:U});if(A.importSettings(C(ib)),A.useWithSource("",C(u),e,{strict:o}),E){let[ue,Ie]=E;A.useWithSource(ue,C(Ie),w,{strict:o})}let te=ue=>"default"in ue?ue.default:ue,le=new Map([["@@core",Vse]]);if(r!==null)for(let ue of r.plugins.keys())le.set(ue,te(r.modules.get(ue)));for(let[ue,Ie]of le)A.activatePlugin(ue,Ie);let ce=new Map([]);if(r!==null){let ue=new Map;for(let[De,Ee]of r.modules)ue.set(De,()=>Ee);let Ie=new Set,he=async(De,Ee)=>{let{factory:g,name:me}=vf(De);if(!g||Ie.has(me))return;let Ce=new Map(ue),fe=Z=>{if((0,dce.isBuiltin)(Z))return vf(Z);if(Ce.has(Z))return Ce.get(Z)();throw new it(`This plugin cannot access the package referenced via ${Z} which is neither a builtin, nor an exposed entry`)},ie=await zm(async()=>te(await g(fe)),Z=>`${Z} (when initializing ${me}, defined in ${Ee})`);ue.set(me,()=>ie),Ie.add(me),ce.set(me,ie)};if(u.plugins)for(let De of u.plugins.split(";")){let Ee=V.resolve(e,Ae.toPortablePath(De));await he(Ee,"")}for(let{path:De,cwd:Ee,data:g}of p)if(n&&Array.isArray(g.plugins))for(let me of g.plugins){let Ce=typeof me!="string"?me.path:me,fe=me?.spec??"",ie=me?.checksum??"";if(j1.has(fe))continue;let Z=V.resolve(Ee,Ae.toPortablePath(Ce));if(!await ae.existsPromise(Z)){if(!fe){let ht=Ut(A,V.basename(Z,".cjs"),Ct.NAME),q=Ut(A,".gitignore",Ct.NAME),nt=Ut(A,A.values.get("rcFilename"),Ct.NAME),Le=Ut(A,"https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored",Ct.URL);throw new it(`Missing source for the ${ht} plugin - please try to remove the plugin from ${nt} then reinstall it manually. This error usually occurs because ${q} is incorrect, check ${Le} to make sure your plugin folder isn't gitignored.`)}if(!fe.match(/^https?:/)){let ht=Ut(A,V.basename(Z,".cjs"),Ct.NAME),q=Ut(A,A.values.get("rcFilename"),Ct.NAME);throw new it(`Failed to recognize the source for the ${ht} plugin - please try to delete the plugin from ${q} then reinstall it manually.`)}let Se=await EU(fe,{configuration:A}),Re=Ji(Se);if(ie&&ie!==Re){let ht=Ut(A,V.basename(Z,".cjs"),Ct.NAME),q=Ut(A,A.values.get("rcFilename"),Ct.NAME),nt=Ut(A,`yarn plugin import ${fe}`,Ct.CODE);throw new it(`Failed to fetch the ${ht} plugin from its remote location: its checksum seems to have changed. If this is expected, please remove the plugin from ${q} then run ${nt} to reimport it.`)}await ae.mkdirPromise(V.dirname(Z),{recursive:!0}),await ae.writeFilePromise(Z,Se)}await he(Z,De)}}for(let[ue,Ie]of ce)A.activatePlugin(ue,Ie);if(A.useWithSource("",T(u),e,{strict:o}),E){let[ue,Ie]=E;A.useWithSource(ue,T(Ie),w,{strict:o})}return A.get("enableGlobalCache")&&(A.values.set("cacheFolder",`${A.get("globalFolder")}/cache`),A.sources.set("cacheFolder","")),A}static async findRcFiles(e){let r=SU(),o=[],a=e,n=null;for(;a!==n;){n=a;let u=V.join(n,r);if(ae.existsSync(u)){let A,p;try{p=await ae.readFilePromise(u,"utf8"),A=Vi(p)}catch{let h="";throw p?.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(h=" (in particular, make sure you list the colons after each key name)"),new it(`Parse error when loading ${u}; please check it's proper Yaml${h}`)}o.unshift({path:u,cwd:n,data:A})}a=V.dirname(n)}return o}static async findFolderRcFile(e){let r=V.join(e,mr.rc),o;try{o=await ae.readFilePromise(r,"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let a=Vi(o);return{path:r,cwd:e,data:a}}static async findProjectCwd(e){let r=null,o=e,a=null;for(;o!==a;){if(a=o,ae.existsSync(V.join(a,mr.lockfile)))return a;ae.existsSync(V.join(a,mr.manifest))&&(r=a),o=V.dirname(a)}return r}static async updateConfiguration(e,r,o={}){let a=SU(),n=V.join(e,a),u=ae.existsSync(n)?Vi(await ae.readFilePromise(n,"utf8")):{},A=!1,p;if(typeof r=="function"){try{p=r(u)}catch{p=r({})}if(p===u)return!1}else{p=u;for(let h of Object.keys(r)){let E=u[h],w=r[h],D;if(typeof w=="function")try{D=w(E)}catch{D=w(void 0)}else D=w;E!==D&&(D===t.deleteProperty?delete p[h]:p[h]=D,A=!0)}if(!A)return!1}return await ae.changeFilePromise(n,Sa(p),{automaticNewlines:!0}),!0}static async addPlugin(e,r){r.length!==0&&await t.updateConfiguration(e,o=>{let a=o.plugins??[];if(a.length===0)return{...o,plugins:r};let n=[],u=[...r];for(let A of a){let p=typeof A!="string"?A.path:A,h=u.find(E=>E.path===p);h?(n.push(h),u=u.filter(E=>E!==h)):n.push(A)}return n.push(...u),{...o,plugins:n}})}static async updateHomeConfiguration(e){let r=my();return await t.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration<"u"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,o]of Object.entries(e))if(o!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,o),this.values.set(r,bU(this,o))}}useWithSource(e,r,o,a){try{this.use(e,r,o,a)}catch(n){throw n.message+=` (in ${Ut(this,e,Ct.PATH)})`,n}}use(e,r,o,{strict:a=!0,overwrite:n=!1}={}){a=a&&this.get("enableStrictSettings");for(let u of["enableStrictSettings",...Object.keys(r)]){let A=r[u],p=e4(A);if(p&&(e=p),typeof A>"u"||u==="plugins"||e===""&&jst.has(u))continue;if(u==="rcFilename")throw new it(`The rcFilename settings can only be set via ${`${ob}RC_FILENAME`.toUpperCase()}, not via a rc file`);let h=this.settings.get(u);if(!h){let w=my(),D=e[0]!=="<"?V.dirname(e):null;if(a&&!(D!==null?w===D:!1))throw new it(`Unrecognized or legacy configuration settings found: ${u} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(u,e);continue}if(this.sources.has(u)&&!(n||h.type==="MAP"||h.isArray&&h.concatenateValues))continue;let E;try{E=xU(this,u,A,h,o)}catch(w){throw w.message+=` in ${Ut(this,e,Ct.PATH)}`,w}if(u==="enableStrictSettings"&&e!==""){a=E;continue}if(h.type==="MAP"){let w=this.values.get(u);this.values.set(u,new Map(n?[...w,...E]:[...E,...w])),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else if(h.isArray&&h.concatenateValues){let w=this.values.get(u);this.values.set(u,n?[...w,...E]:[...E,...w]),this.sources.set(u,`${this.sources.get(u)}, ${e}`)}else this.values.set(u,E),this.sources.set(u,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:o=!1}){let a=this.get(e),n=this.settings.get(e);if(typeof n>"u")throw new it(`Couldn't find a configuration settings named "${e}"`);return sb(a,n,{hideSecrets:r,getNativePaths:o})}getSubprocessStreams(e,{header:r,prefix:o,report:a}){let n,u,A=ae.createWriteStream(e);if(this.get("enableInlineBuilds")){let p=a.createStreamReporter(`${o} ${Ut(this,"STDOUT","green")}`),h=a.createStreamReporter(`${o} ${Ut(this,"STDERR","red")}`);n=new DU.PassThrough,n.pipe(p),n.pipe(A),u=new DU.PassThrough,u.pipe(h),u.pipe(A)}else n=A,u=A,typeof r<"u"&&n.write(`${r} -`);return{stdout:n,stderr:u}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let o of r.resolvers||[])e.push(new o);return new Sg([new Ix,new ci,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let o of r.fetchers||[])e.push(new o);return new py([new hy,new gy,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let o of r.linkers||[])e.push(new o);return e}getSupportedArchitectures(){let e=q1(),r=this.get("supportedArchitectures"),o=r.get("os");o!==null&&(o=o.map(u=>u==="current"?e.os:u));let a=r.get("cpu");a!==null&&(a=a.map(u=>u==="current"?e.cpu:u));let n=r.get("libc");return n!==null&&(n=ul(n,u=>u==="current"?e.libc??ul.skip:u)),{os:o,cpu:a,libc:n}}isInteractive({interactive:e,stdout:r}){return r.isTTY?e??this.get("preferInteractive"):!1}async getPackageExtensions(){if(this.packageExtensions!==null)return this.packageExtensions;this.packageExtensions=new Map;let e=this.packageExtensions,r=(o,a,{userProvided:n=!1}={})=>{if(!Fa(o.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let u=new _t;u.load(a,{yamlCompatibilityMode:!0});let A=u1(e,o.identHash),p=[];A.push([o.range,p]);let h={status:"inactive",userProvided:n,parentDescriptor:o};for(let E of u.dependencies.values())p.push({...h,type:"Dependency",descriptor:E});for(let E of u.peerDependencies.values())p.push({...h,type:"PeerDependency",descriptor:E});for(let[E,w]of u.peerDependenciesMeta)for(let[D,b]of Object.entries(w))p.push({...h,type:"PeerDependencyMeta",selector:E,key:D,value:b})};await this.triggerHook(o=>o.registerPackageExtensions,this,r);for(let[o,a]of this.get("packageExtensions"))r(lh(o,!0),LP(a),{userProvided:!0});return e}normalizeLocator(e){return Fa(e.reference)?Ps(e,`${this.get("defaultProtocol")}${e.reference}`):by.test(e.reference)?Ps(e,`${this.get("defaultProtocol")}${e.reference}`):e}normalizeDependency(e){return Fa(e.range)?kn(e,`${this.get("defaultProtocol")}${e.range}`):by.test(e.range)?kn(e,`${this.get("defaultProtocol")}${e.range}`):e}normalizeDependencyMap(e){return new Map([...e].map(([r,o])=>[r,this.normalizeDependency(o)]))}normalizePackage(e,{packageExtensions:r}){let o=E1(e),a=r.get(e.identHash);if(typeof a<"u"){let u=e.version;if(u!==null){for(let[A,p]of a)if(nA(u,A))for(let h of p)switch(h.status==="inactive"&&(h.status="redundant"),h.type){case"Dependency":typeof o.dependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.dependencies.set(h.descriptor.identHash,this.normalizeDependency(h.descriptor)));break;case"PeerDependency":typeof o.peerDependencies.get(h.descriptor.identHash)>"u"&&(h.status="active",o.peerDependencies.set(h.descriptor.identHash,h.descriptor));break;case"PeerDependencyMeta":{let E=o.peerDependenciesMeta.get(h.selector);(typeof E>"u"||!Object.hasOwn(E,h.key)||E[h.key]!==h.value)&&(h.status="active",Al(o.peerDependenciesMeta,h.selector,()=>({}))[h.key]=h.value)}break;default:tO(h)}}}let n=u=>u.scope?`${u.scope}__${u.name}`:`${u.name}`;for(let u of o.peerDependenciesMeta.keys()){let A=Zo(u);o.peerDependencies.has(A.identHash)||o.peerDependencies.set(A.identHash,kn(A,"*"))}for(let u of o.peerDependencies.values()){if(u.scope==="types")continue;let A=n(u),p=rA("types",A),h=rn(p);o.peerDependencies.has(p.identHash)||o.peerDependenciesMeta.has(h)||(o.peerDependencies.set(p.identHash,kn(p,"*")),o.peerDependenciesMeta.set(h,{optional:!0}))}return o.dependencies=new Map(Ss(o.dependencies,([,u])=>ka(u))),o.peerDependencies=new Map(Ss(o.peerDependencies,([,u])=>ka(u))),o}getLimit(e){return Al(this.limits,e,()=>(0,mce.default)(this.get(e)))}async triggerHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);n&&await n(...r)}}async triggerMultipleHooks(e,r){for(let o of r)await this.triggerHook(e,...o)}async reduceHook(e,r,...o){let a=r;for(let n of this.plugins.values()){let u=n.hooks;if(!u)continue;let A=e(u);A&&(a=await A(a,...o))}return a}async firstHook(e,...r){for(let o of this.plugins.values()){let a=o.hooks;if(!a)continue;let n=e(a);if(!n)continue;let u=await n(...r);if(typeof u<"u")return u}return null}}});var Hr={};Vt(Hr,{EndStrategy:()=>RU,ExecError:()=>lb,PipeError:()=>Y1,execvp:()=>BU,pipevp:()=>Xc});function kg(t){return t!==null&&typeof t.fd=="number"}function kU(){}function QU(){for(let t of Qg)t.kill()}async function Xc(t,e,{cwd:r,env:o=process.env,strict:a=!1,stdin:n=null,stdout:u,stderr:A,end:p=2}){let h=["pipe","pipe","pipe"];n===null?h[0]="ignore":kg(n)&&(h[0]=n),kg(u)&&(h[1]=u),kg(A)&&(h[2]=A);let E=(0,FU.default)(t,e,{cwd:Ae.fromPortablePath(r),env:{...o,PWD:Ae.fromPortablePath(r)},stdio:h});Qg.add(E),Qg.size===1&&(process.on("SIGINT",kU),process.on("SIGTERM",QU)),!kg(n)&&n!==null&&n.pipe(E.stdin),kg(u)||E.stdout.pipe(u,{end:!1}),kg(A)||E.stderr.pipe(A,{end:!1});let w=()=>{for(let D of new Set([u,A]))kg(D)||D.end()};return new Promise((D,b)=>{E.on("error",C=>{Qg.delete(E),Qg.size===0&&(process.off("SIGINT",kU),process.off("SIGTERM",QU)),(p===2||p===1)&&w(),b(C)}),E.on("close",(C,T)=>{Qg.delete(E),Qg.size===0&&(process.off("SIGINT",kU),process.off("SIGTERM",QU)),(p===2||p===1&&C!==0)&&w(),C===0||!a?D({code:TU(C,T)}):b(new Y1({fileName:t,code:C,signal:T}))})})}async function BU(t,e,{cwd:r,env:o=process.env,encoding:a="utf8",strict:n=!1}){let u=["ignore","pipe","pipe"],A=[],p=[],h=Ae.fromPortablePath(r);typeof o.PWD<"u"&&(o={...o,PWD:h});let E=(0,FU.default)(t,e,{cwd:h,env:o,stdio:u});return E.stdout.on("data",w=>{A.push(w)}),E.stderr.on("data",w=>{p.push(w)}),await new Promise((w,D)=>{E.on("error",b=>{let C=ze.create(r),T=Ut(C,t,Ct.PATH);D(new Jt(1,`Process ${T} failed to spawn`,N=>{N.reportError(1,` ${$u(C,{label:"Thrown Error",value:Yc(Ct.NO_HINT,b.message)})}`)}))}),E.on("close",(b,C)=>{let T=a==="buffer"?Buffer.concat(A):Buffer.concat(A).toString(a),N=a==="buffer"?Buffer.concat(p):Buffer.concat(p).toString(a);b===0||!n?w({code:TU(b,C),stdout:T,stderr:N}):D(new lb({fileName:t,code:b,signal:C,stdout:T,stderr:N}))})})}function TU(t,e){let r=Zst.get(e);return typeof r<"u"?128+r:t??1}function $st(t,e,{configuration:r,report:o}){o.reportError(1,` ${$u(r,t!==null?{label:"Exit Code",value:Yc(Ct.NUMBER,t)}:{label:"Exit Signal",value:Yc(Ct.CODE,e)})}`)}var FU,RU,Y1,lb,Qg,Zst,nb=It(()=>{St();FU=et(MT());W1();Kl();Wl();RU=(o=>(o[o.Never=0]="Never",o[o.ErrorCode=1]="ErrorCode",o[o.Always=2]="Always",o))(RU||{}),Y1=class extends Jt{constructor({fileName:e,code:r,signal:o}){let a=ze.create(V.cwd()),n=Ut(a,e,Ct.PATH);super(1,`Child ${n} reported an error`,u=>{$st(r,o,{configuration:a,report:u})}),this.code=TU(r,o)}},lb=class extends Y1{constructor({fileName:e,code:r,signal:o,stdout:a,stderr:n}){super({fileName:e,code:r,signal:o}),this.stdout=a,this.stderr=n}};Qg=new Set;Zst=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]])});function Cce(t){Ece=t}function V1(){return typeof LU>"u"&&(LU=Ece()),LU}var LU,Ece,NU=It(()=>{Ece=()=>{throw new Error("Assertion failed: No libzip instance is available, and no factory was configured")}});var Ice=_((ub,MU)=>{var eot=Object.assign({},ve("fs")),OU=function(){var t=typeof document<"u"&&document.currentScript?document.currentScript.src:void 0;return typeof __filename<"u"&&(t=t||__filename),function(e){e=e||{};var r=typeof e<"u"?e:{},o,a;r.ready=new Promise(function(Je,st){o=Je,a=st});var n={},u;for(u in r)r.hasOwnProperty(u)&&(n[u]=r[u]);var A=[],p="./this.program",h=function(Je,st){throw st},E=!1,w=!0,D="";function b(Je){return r.locateFile?r.locateFile(Je,D):D+Je}var C,T,N,U;w&&(E?D=ve("path").dirname(D)+"/":D=__dirname+"/",C=function(st,vt){var ar=ia(st);return ar?vt?ar:ar.toString():(N||(N=eot),U||(U=ve("path")),st=U.normalize(st),N.readFileSync(st,vt?null:"utf8"))},T=function(st){var vt=C(st,!0);return vt.buffer||(vt=new Uint8Array(vt)),me(vt.buffer),vt},process.argv.length>1&&(p=process.argv[1].replace(/\\/g,"/")),A=process.argv.slice(2),h=function(Je){process.exit(Je)},r.inspect=function(){return"[Emscripten Module object]"});var J=r.print||console.log.bind(console),te=r.printErr||console.warn.bind(console);for(u in n)n.hasOwnProperty(u)&&(r[u]=n[u]);n=null,r.arguments&&(A=r.arguments),r.thisProgram&&(p=r.thisProgram),r.quit&&(h=r.quit);var le=0,ce=function(Je){le=Je},ue;r.wasmBinary&&(ue=r.wasmBinary);var Ie=r.noExitRuntime||!0;typeof WebAssembly!="object"&&Hi("no native wasm support detected");function he(Je,st,vt){switch(st=st||"i8",st.charAt(st.length-1)==="*"&&(st="i32"),st){case"i1":return Ke[Je>>0];case"i8":return Ke[Je>>0];case"i16":return ap((Je>>1)*2);case"i32":return Rs((Je>>2)*4);case"i64":return Rs((Je>>2)*4);case"float":return gu((Je>>2)*4);case"double":return op((Je>>3)*8);default:Hi("invalid type for getValue: "+st)}return null}var De,Ee=!1,g;function me(Je,st){Je||Hi("Assertion failed: "+st)}function Ce(Je){var st=r["_"+Je];return me(st,"Cannot call unknown function "+Je+", make sure it is exported"),st}function fe(Je,st,vt,ar,ee){var ye={string:function(Qi){var Sn=0;if(Qi!=null&&Qi!==0){var fa=(Qi.length<<2)+1;Sn=pi(fa),ht(Qi,Sn,fa)}return Sn},array:function(Qi){var Sn=pi(Qi.length);return Le(Qi,Sn),Sn}};function Ne(Qi){return st==="string"?Se(Qi):st==="boolean"?!!Qi:Qi}var gt=Ce(Je),mt=[],Dt=0;if(ar)for(var er=0;er=vt)&&xe[ar];)++ar;return Z.decode(xe.subarray(Je,ar))}function Re(Je,st,vt,ar){if(!(ar>0))return 0;for(var ee=vt,ye=vt+ar-1,Ne=0;Ne=55296&><=57343){var mt=Je.charCodeAt(++Ne);gt=65536+((gt&1023)<<10)|mt&1023}if(gt<=127){if(vt>=ye)break;st[vt++]=gt}else if(gt<=2047){if(vt+1>=ye)break;st[vt++]=192|gt>>6,st[vt++]=128|gt&63}else if(gt<=65535){if(vt+2>=ye)break;st[vt++]=224|gt>>12,st[vt++]=128|gt>>6&63,st[vt++]=128|gt&63}else{if(vt+3>=ye)break;st[vt++]=240|gt>>18,st[vt++]=128|gt>>12&63,st[vt++]=128|gt>>6&63,st[vt++]=128|gt&63}}return st[vt]=0,vt-ee}function ht(Je,st,vt){return Re(Je,xe,st,vt)}function q(Je){for(var st=0,vt=0;vt=55296&&ar<=57343&&(ar=65536+((ar&1023)<<10)|Je.charCodeAt(++vt)&1023),ar<=127?++st:ar<=2047?st+=2:ar<=65535?st+=3:st+=4}return st}function nt(Je){var st=q(Je)+1,vt=aa(st);return vt&&Re(Je,Ke,vt,st),vt}function Le(Je,st){Ke.set(Je,st)}function Te(Je,st){return Je%st>0&&(Je+=st-Je%st),Je}var ke,Ke,xe,tt,He,x,I,P,y,R;function z(Je){ke=Je,r.HEAP_DATA_VIEW=R=new DataView(Je),r.HEAP8=Ke=new Int8Array(Je),r.HEAP16=tt=new Int16Array(Je),r.HEAP32=x=new Int32Array(Je),r.HEAPU8=xe=new Uint8Array(Je),r.HEAPU16=He=new Uint16Array(Je),r.HEAPU32=I=new Uint32Array(Je),r.HEAPF32=P=new Float32Array(Je),r.HEAPF64=y=new Float64Array(Je)}var X=r.INITIAL_MEMORY||16777216,$,se=[],be=[],Fe=[],lt=!1;function Et(){if(r.preRun)for(typeof r.preRun=="function"&&(r.preRun=[r.preRun]);r.preRun.length;)Pt(r.preRun.shift());hs(se)}function qt(){lt=!0,hs(be)}function nr(){if(r.postRun)for(typeof r.postRun=="function"&&(r.postRun=[r.postRun]);r.postRun.length;)Sr(r.postRun.shift());hs(Fe)}function Pt(Je){se.unshift(Je)}function cn(Je){be.unshift(Je)}function Sr(Je){Fe.unshift(Je)}var yr=0,Rr=null,Xr=null;function $n(Je){yr++,r.monitorRunDependencies&&r.monitorRunDependencies(yr)}function Xs(Je){if(yr--,r.monitorRunDependencies&&r.monitorRunDependencies(yr),yr==0&&(Rr!==null&&(clearInterval(Rr),Rr=null),Xr)){var st=Xr;Xr=null,st()}}r.preloadedImages={},r.preloadedAudios={};function Hi(Je){r.onAbort&&r.onAbort(Je),Je+="",te(Je),Ee=!0,g=1,Je="abort("+Je+"). Build with -s ASSERTIONS=1 for more info.";var st=new WebAssembly.RuntimeError(Je);throw a(st),st}var Qs="data:application/octet-stream;base64,";function Zs(Je){return Je.startsWith(Qs)}var bi="data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASELIAMhBQsgBkIuEBciA0UEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyAFEBwMAgsgA0GjEkGoEiACQYACcSIHG0EEECwgB0UEQCADIAkEf0EtBSABLwEIC0H//wNxEA0LIAMgCQR/QS0FIAEvAQoLQf//A3EQDSADIAEvAQwQDSADIAsEf0HjAAUgASgCEAtB//8DcRANIAYgASgCFDYCPAJ/IAZBPGoQjQEiCEUEQEEAIQlBIQwBCwJ/IAgoAhQiBEHQAE4EQCAEQQl0DAELIAhB0AA2AhRBgMACCyEEIAgoAgRBBXQgCCgCCEELdGogCCgCAEEBdmohCSAIKAIMIAQgCCgCEEEFdGpqQaDAAWoLIQQgAyAJQf//A3EQDSADIARB//8DcRANIAMCfyALBEBBACABKQMoQhRUDQEaCyABKAIYCxASIAEpAyAhDCADAn8gAwJ/AkAgBwRAIAxC/v///w9YBEAgASkDKEL/////D1QNAgsgA0F/EBJBfwwDC0F/IAxC/v///w9WDQEaCyAMpwsQEiABKQMoIgxC/////w8gDEL/////D1QbpwsQEiADIAEoAjAiBAR/IAQvAQQFQQALQf//A3EQDSADIAEoAjQgAhBsIAVBgAYQbGpB//8DcRANIAdFBEAgAyABKAI4IgQEfyAELwEEBUEAC0H//wNxEA0gAyABLwE8EA0gAyABLwFAEA0gAyABKAJEEBIgAyABKQNIIgxC/////w8gDEL/////D1QbpxASCyADLQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAMQCCAFEBwMAgsgACAGIAMtAAAEfiADKQMQBUIACxAbIQQgAxAIIARBf0wNACABKAIwIgMEQCAAIAMQYUF/TA0BCyAFBEAgACAFQYAGEGtBf0wNAQsgBRAcIAEoAjQiBQRAIAAgBSACEGtBAEgNAgsgBw0CIAEoAjgiAUUNAiAAIAEQYUEATg0CDAELIAUQHAtBfyEKCyAGQUBrJAAgCgtNAQJ/IAEtAAAhAgJAIAAtAAAiA0UNACACIANHDQADQCABLQABIQIgAC0AASIDRQ0BIAFBAWohASAAQQFqIQAgAiADRg0ACwsgAyACawvcAwICfgF/IAOtIQQgACkDmC4hBQJAIAACfyAAAn4gACgCoC4iBkEDaiIDQT9NBEAgBCAGrYYgBYQMAQsgBkHAAEYEQCAAKAIEIAAoAhBqIAU3AAAgACgCEEEIagwCCyAAKAIEIAAoAhBqIAQgBq2GIAWENwAAIAAgACgCEEEIajYCECAGQT1rIQMgBEHAACAGa62ICyIENwOYLiAAIAM2AqAuIANBOU4EQCAAKAIEIAAoAhBqIAQ3AAAgACAAKAIQQQhqNgIQDAILIANBGU4EQCAAKAIEIAAoAhBqIAQ+AAAgACAAKAIQQQRqNgIQIAAgACkDmC5CIIgiBDcDmC4gACAAKAKgLkEgayIDNgKgLgsgA0EJTgR/IAAoAgQgACgCEGogBD0AACAAIAAoAhBBAmo2AhAgACkDmC5CEIghBCAAKAKgLkEQawUgAwtBAUgNASAAKAIQCyIDQQFqNgIQIAAoAgQgA2ogBDwAAAsgAEEANgKgLiAAQgA3A5guIAAoAgQgACgCEGogAjsAACAAIAAoAhBBAmoiAzYCECAAKAIEIANqIAJBf3M7AAAgACAAKAIQQQJqIgM2AhAgAgRAIAAoAgQgA2ogASACEAcaIAAgACgCECACajYCEAsLrAQCAX8BfgJAIAANACABUA0AIAMEQCADQQA2AgQgA0ESNgIAC0EADwsCQAJAIAAgASACIAMQiQEiBEUNAEEYEAkiAkUEQCADBEAgA0EANgIEIANBDjYCAAsCQCAEKAIoIgBFBEAgBCkDGCEBDAELIABBADYCKCAEKAIoQgA3AyAgBCAEKQMYIgUgBCkDICIBIAEgBVQbIgE3AxgLIAQpAwggAVYEQANAIAQoAgAgAadBBHRqKAIAEAYgAUIBfCIBIAQpAwhUDQALCyAEKAIAEAYgBCgCBBAGIAQQBgwBCyACQQA2AhQgAiAENgIQIAJBABABNgIMIAJBADYCCCACQgA3AgACf0E4EAkiAEUEQCADBEAgA0EANgIEIANBDjYCAAtBAAwBCyAAQQA2AgggAEIANwMAIABCADcDICAAQoCAgIAQNwIsIABBADoAKCAAQQA2AhQgAEIANwIMIABBADsBNCAAIAI2AgggAEEkNgIEIABCPyACQQBCAEEOQSQRDAAiASABQgBTGzcDGCAACyIADQEgAigCECIDBEACQCADKAIoIgBFBEAgAykDGCEBDAELIABBADYCKCADKAIoQgA3AyAgAyADKQMYIgUgAykDICIBIAEgBVQbIgE3AxgLIAMpAwggAVYEQANAIAMoAgAgAadBBHRqKAIAEAYgAUIBfCIBIAMpAwhUDQALCyADKAIAEAYgAygCBBAGIAMQBgsgAhAGC0EAIQALIAALiwwBBn8gACABaiEFAkACQCAAKAIEIgJBAXENACACQQNxRQ0BIAAoAgAiAiABaiEBAkAgACACayIAQciEASgCAEcEQCACQf8BTQRAIAAoAggiBCACQQN2IgJBA3RB3IQBakYaIAAoAgwiAyAERw0CQbSEAUG0hAEoAgBBfiACd3E2AgAMAwsgACgCGCEGAkAgACAAKAIMIgNHBEAgACgCCCICQcSEASgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAAQRRqIgIoAgAiBA0AIABBEGoiAigCACIEDQBBACEDDAELA0AgAiEHIAQiA0EUaiICKAIAIgQNACADQRBqIQIgAygCECIEDQALIAdBADYCAAsgBkUNAgJAIAAgACgCHCIEQQJ0QeSGAWoiAigCAEYEQCACIAM2AgAgAw0BQbiEAUG4hAEoAgBBfiAEd3E2AgAMBAsgBkEQQRQgBigCECAARhtqIAM2AgAgA0UNAwsgAyAGNgIYIAAoAhAiAgRAIAMgAjYCECACIAM2AhgLIAAoAhQiAkUNAiADIAI2AhQgAiADNgIYDAILIAUoAgQiAkEDcUEDRw0BQbyEASABNgIAIAUgAkF+cTYCBCAAIAFBAXI2AgQgBSABNgIADwsgBCADNgIMIAMgBDYCCAsCQCAFKAIEIgJBAnFFBEAgBUHMhAEoAgBGBEBBzIQBIAA2AgBBwIQBQcCEASgCACABaiIBNgIAIAAgAUEBcjYCBCAAQciEASgCAEcNA0G8hAFBADYCAEHIhAFBADYCAA8LIAVByIQBKAIARgRAQciEASAANgIAQbyEAUG8hAEoAgAgAWoiATYCACAAIAFBAXI2AgQgACABaiABNgIADwsgAkF4cSABaiEBAkAgAkH/AU0EQCAFKAIIIgQgAkEDdiICQQN0QdyEAWpGGiAEIAUoAgwiA0YEQEG0hAFBtIQBKAIAQX4gAndxNgIADAILIAQgAzYCDCADIAQ2AggMAQsgBSgCGCEGAkAgBSAFKAIMIgNHBEAgBSgCCCICQcSEASgCAEkaIAIgAzYCDCADIAI2AggMAQsCQCAFQRRqIgQoAgAiAg0AIAVBEGoiBCgCACICDQBBACEDDAELA0AgBCEHIAIiA0EUaiIEKAIAIgINACADQRBqIQQgAygCECICDQALIAdBADYCAAsgBkUNAAJAIAUgBSgCHCIEQQJ0QeSGAWoiAigCAEYEQCACIAM2AgAgAw0BQbiEAUG4hAEoAgBBfiAEd3E2AgAMAgsgBkEQQRQgBigCECAFRhtqIAM2AgAgA0UNAQsgAyAGNgIYIAUoAhAiAgRAIAMgAjYCECACIAM2AhgLIAUoAhQiAkUNACADIAI2AhQgAiADNgIYCyAAIAFBAXI2AgQgACABaiABNgIAIABByIQBKAIARw0BQbyEASABNgIADwsgBSACQX5xNgIEIAAgAUEBcjYCBCAAIAFqIAE2AgALIAFB/wFNBEAgAUEDdiICQQN0QdyEAWohAQJ/QbSEASgCACIDQQEgAnQiAnFFBEBBtIQBIAIgA3I2AgAgAQwBCyABKAIICyECIAEgADYCCCACIAA2AgwgACABNgIMIAAgAjYCCA8LQR8hAiAAQgA3AhAgAUH///8HTQRAIAFBCHYiAiACQYD+P2pBEHZBCHEiBHQiAiACQYDgH2pBEHZBBHEiA3QiAiACQYCAD2pBEHZBAnEiAnRBD3YgAyAEciACcmsiAkEBdCABIAJBFWp2QQFxckEcaiECCyAAIAI2AhwgAkECdEHkhgFqIQcCQAJAQbiEASgCACIEQQEgAnQiA3FFBEBBuIQBIAMgBHI2AgAgByAANgIAIAAgBzYCGAwBCyABQQBBGSACQQF2ayACQR9GG3QhAiAHKAIAIQMDQCADIgQoAgRBeHEgAUYNAiACQR12IQMgAkEBdCECIAQgA0EEcWoiB0EQaigCACIDDQALIAcgADYCECAAIAQ2AhgLIAAgADYCDCAAIAA2AggPCyAEKAIIIgEgADYCDCAEIAA2AgggAEEANgIYIAAgBDYCDCAAIAE2AggLC1gCAX8BfgJAAn9BACAARQ0AGiAArUIChiICpyIBIABBBHJBgIAESQ0AGkF/IAEgAkIgiKcbCyIBEAkiAEUNACAAQQRrLQAAQQNxRQ0AIABBACABEBkLIAALQwEDfwJAIAJFDQADQCAALQAAIgQgAS0AACIFRgRAIAFBAWohASAAQQFqIQAgAkEBayICDQEMAgsLIAQgBWshAwsgAwsUACAAEEAgACgCABAgIAAoAgQQIAutBAIBfgV/IwBBEGsiBCQAIAAgAWshBgJAAkAgAUEBRgRAIAAgBi0AACACEBkMAQsgAUEJTwRAIAAgBikAADcAACAAIAJBAWtBB3FBAWoiBWohACACIAVrIgFFDQIgBSAGaiECA0AgACACKQAANwAAIAJBCGohAiAAQQhqIQAgAUEIayIBDQALDAILAkACQAJAAkAgAUEEaw4FAAICAgECCyAEIAYoAAAiATYCBCAEIAE2AgAMAgsgBCAGKQAANwMADAELQQghByAEQQhqIQgDQCAIIAYgByABIAEgB0sbIgUQByAFaiEIIAcgBWsiBw0ACyAEIAQpAwg3AwALAkAgBQ0AIAJBEEkNACAEKQMAIQMgAkEQayIGQQR2QQFqQQdxIgEEQANAIAAgAzcACCAAIAM3AAAgAkEQayECIABBEGohACABQQFrIgENAAsLIAZB8ABJDQADQCAAIAM3AHggACADNwBwIAAgAzcAaCAAIAM3AGAgACADNwBYIAAgAzcAUCAAIAM3AEggACADNwBAIAAgAzcAOCAAIAM3ADAgACADNwAoIAAgAzcAICAAIAM3ABggACADNwAQIAAgAzcACCAAIAM3AAAgAEGAAWohACACQYABayICQQ9LDQALCyACQQhPBEBBCCAFayEBA0AgACAEKQMANwAAIAAgAWohACACIAFrIgJBB0sNAAsLIAJFDQEgACAEIAIQBxoLIAAgAmohAAsgBEEQaiQAIAALXwECfyAAKAIIIgEEQCABEAsgAEEANgIICwJAIAAoAgQiAUUNACABKAIAIgJBAXFFDQAgASgCEEF+Rw0AIAEgAkF+cSICNgIAIAINACABECAgAEEANgIECyAAQQA6AAwL1wICBH8BfgJAAkAgACgCQCABp0EEdGooAgAiA0UEQCACBEAgAkEANgIEIAJBFDYCAAsMAQsgACgCACADKQNIIgdBABAUIQMgACgCACEAIANBf0wEQCACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAQtCACEBIwBBEGsiBiQAQX8hAwJAIABCGkEBEBRBf0wEQCACBEAgAiAAKAIMNgIAIAIgACgCEDYCBAsMAQsgAEIEIAZBCmogAhAtIgRFDQBBHiEAQQEhBQNAIAQQDCAAaiEAIAVBAkcEQCAFQQFqIQUMAQsLIAQtAAAEfyAEKQMQIAQpAwhRBUEAC0UEQCACBEAgAkEANgIEIAJBFDYCAAsgBBAIDAELIAQQCCAAIQMLIAZBEGokACADIgBBAEgNASAHIACtfCIBQn9VDQEgAgRAIAJBFjYCBCACQQQ2AgALC0IAIQELIAELYAIBfgF/AkAgAEUNACAAQQhqEF8iAEUNACABIAEoAjBBAWo2AjAgACADNgIIIAAgAjYCBCAAIAE2AgAgAEI/IAEgA0EAQgBBDiACEQoAIgQgBEIAUxs3AxggACEFCyAFCyIAIAAoAiRBAWtBAU0EQCAAQQBCAEEKEA4aIABBADYCJAsLbgACQAJAAkAgA0IQVA0AIAJFDQECfgJAAkACQCACKAIIDgMCAAEECyACKQMAIAB8DAILIAIpAwAgAXwMAQsgAikDAAsiA0IAUw0AIAEgA1oNAgsgBARAIARBADYCBCAEQRI2AgALC0J/IQMLIAMLggICAX8CfgJAQQEgAiADGwRAIAIgA2oQCSIFRQRAIAQEQCAEQQA2AgQgBEEONgIAC0EADwsgAq0hBgJAAkAgAARAIAAgBhATIgBFBEAgBARAIARBADYCBCAEQQ42AgALDAULIAUgACACEAcaIAMNAQwCCyABIAUgBhARIgdCf1cEQCAEBEAgBCABKAIMNgIAIAQgASgCEDYCBAsMBAsgBiAHVQRAIAQEQCAEQQA2AgQgBEERNgIACwwECyADRQ0BCyACIAVqIgBBADoAACACQQFIDQAgBSECA0AgAi0AAEUEQCACQSA6AAALIAJBAWoiAiAASQ0ACwsLIAUPCyAFEAZBAAuBAQEBfwJAIAAEQCADQYAGcSEFQQAhAwNAAkAgAC8BCCACRw0AIAUgACgCBHFFDQAgA0EATg0DIANBAWohAwsgACgCACIADQALCyAEBEAgBEEANgIEIARBCTYCAAtBAA8LIAEEQCABIAAvAQo7AQALIAAvAQpFBEBBwBQPCyAAKAIMC1cBAX9BEBAJIgNFBEBBAA8LIAMgATsBCiADIAA7AQggA0GABjYCBCADQQA2AgACQCABBEAgAyACIAEQYyIANgIMIAANASADEAZBAA8LIANBADYCDAsgAwvuBQIEfwV+IwBB4ABrIgQkACAEQQhqIgNCADcDICADQQA2AhggA0L/////DzcDECADQQA7AQwgA0G/hig2AgggA0EBOgAGIANBADsBBCADQQA2AgAgA0IANwNIIANBgIDYjXg2AkQgA0IANwMoIANCADcDMCADQgA3AzggA0FAa0EAOwEAIANCADcDUCABKQMIUCIDRQRAIAEoAgAoAgApA0ghBwsCfgJAIAMEQCAHIQkMAQsgByEJA0AgCqdBBHQiBSABKAIAaigCACIDKQNIIgggCSAIIAlUGyIJIAEpAyBWBEAgAgRAIAJBADYCBCACQRM2AgALQn8MAwsgAygCMCIGBH8gBi8BBAVBAAtB//8Dca0gCCADKQMgfHxCHnwiCCAHIAcgCFQbIgcgASkDIFYEQCACBEAgAkEANgIEIAJBEzYCAAtCfwwDCyAAKAIAIAEoAgAgBWooAgApA0hBABAUIQYgACgCACEDIAZBf0wEQCACBEAgAiADKAIMNgIAIAIgAygCEDYCBAtCfwwDCyAEQQhqIANBAEEBIAIQaEJ/UQRAIARBCGoQNkJ/DAMLAkACQCABKAIAIAVqKAIAIgMvAQogBC8BEkkNACADKAIQIAQoAhhHDQAgAygCFCAEKAIcRw0AIAMoAjAgBCgCOBBiRQ0AAkAgBCgCICIGIAMoAhhHBEAgBCkDKCEIDAELIAMpAyAiCyAEKQMoIghSDQAgCyEIIAMpAyggBCkDMFENAgsgBC0AFEEIcUUNACAGDQAgCEIAUg0AIAQpAzBQDQELIAIEQCACQQA2AgQgAkEVNgIACyAEQQhqEDZCfwwDCyABKAIAIAVqKAIAKAI0IAQoAjwQbyEDIAEoAgAgBWooAgAiBUEBOgAEIAUgAzYCNCAEQQA2AjwgBEEIahA2IApCAXwiCiABKQMIVA0ACwsgByAJfSIHQv///////////wAgB0L///////////8AVBsLIQcgBEHgAGokACAHC8YBAQJ/QdgAEAkiAUUEQCAABEAgAEEANgIEIABBDjYCAAtBAA8LIAECf0EYEAkiAkUEQCAABEAgAEEANgIEIABBDjYCAAtBAAwBCyACQQA2AhAgAkIANwMIIAJBADYCACACCyIANgJQIABFBEAgARAGQQAPCyABQgA3AwAgAUEANgIQIAFCADcCCCABQgA3AhQgAUEANgJUIAFCADcCHCABQgA3ACEgAUIANwMwIAFCADcDOCABQUBrQgA3AwAgAUIANwNIIAELgBMCD38CfiMAQdAAayIFJAAgBSABNgJMIAVBN2ohEyAFQThqIRBBACEBA0ACQCAOQQBIDQBB/////wcgDmsgAUgEQEGEhAFBPTYCAEF/IQ4MAQsgASAOaiEOCyAFKAJMIgchAQJAAkACQAJAAkACQAJAAkAgBQJ/AkAgBy0AACIGBEADQAJAAkAgBkH/AXEiBkUEQCABIQYMAQsgBkElRw0BIAEhBgNAIAEtAAFBJUcNASAFIAFBAmoiCDYCTCAGQQFqIQYgAS0AAiEMIAghASAMQSVGDQALCyAGIAdrIQEgAARAIAAgByABEC4LIAENDSAFKAJMIQEgBSgCTCwAAUEwa0EKTw0DIAEtAAJBJEcNAyABLAABQTBrIQ9BASERIAFBA2oMBAsgBSABQQFqIgg2AkwgAS0AASEGIAghAQwACwALIA4hDSAADQggEUUNAkEBIQEDQCAEIAFBAnRqKAIAIgAEQCADIAFBA3RqIAAgAhB4QQEhDSABQQFqIgFBCkcNAQwKCwtBASENIAFBCk8NCANAIAQgAUECdGooAgANCCABQQFqIgFBCkcNAAsMCAtBfyEPIAFBAWoLIgE2AkxBACEIAkAgASwAACIKQSBrIgZBH0sNAEEBIAZ0IgZBidEEcUUNAANAAkAgBSABQQFqIgg2AkwgASwAASIKQSBrIgFBIE8NAEEBIAF0IgFBidEEcUUNACABIAZyIQYgCCEBDAELCyAIIQEgBiEICwJAIApBKkYEQCAFAn8CQCABLAABQTBrQQpPDQAgBSgCTCIBLQACQSRHDQAgASwAAUECdCAEakHAAWtBCjYCACABLAABQQN0IANqQYADaygCACELQQEhESABQQNqDAELIBENCEEAIRFBACELIAAEQCACIAIoAgAiAUEEajYCACABKAIAIQsLIAUoAkxBAWoLIgE2AkwgC0F/Sg0BQQAgC2shCyAIQYDAAHIhCAwBCyAFQcwAahB3IgtBAEgNBiAFKAJMIQELQX8hCQJAIAEtAABBLkcNACABLQABQSpGBEACQCABLAACQTBrQQpPDQAgBSgCTCIBLQADQSRHDQAgASwAAkECdCAEakHAAWtBCjYCACABLAACQQN0IANqQYADaygCACEJIAUgAUEEaiIBNgJMDAILIBENByAABH8gAiACKAIAIgFBBGo2AgAgASgCAAVBAAshCSAFIAUoAkxBAmoiATYCTAwBCyAFIAFBAWo2AkwgBUHMAGoQdyEJIAUoAkwhAQtBACEGA0AgBiESQX8hDSABLAAAQcEAa0E5Sw0HIAUgAUEBaiIKNgJMIAEsAAAhBiAKIQEgBiASQTpsakGf7ABqLQAAIgZBAWtBCEkNAAsgBkETRg0CIAZFDQYgD0EATgRAIAQgD0ECdGogBjYCACAFIAMgD0EDdGopAwA3A0AMBAsgAA0BC0EAIQ0MBQsgBUFAayAGIAIQeCAFKAJMIQoMAgsgD0F/Sg0DC0EAIQEgAEUNBAsgCEH//3txIgwgCCAIQYDAAHEbIQZBACENQaQIIQ8gECEIAkACQAJAAn8CQAJAAkACQAJ/AkACQAJAAkACQAJAAkAgCkEBaywAACIBQV9xIAEgAUEPcUEDRhsgASASGyIBQdgAaw4hBBISEhISEhISDhIPBg4ODhIGEhISEgIFAxISCRIBEhIEAAsCQCABQcEAaw4HDhILEg4ODgALIAFB0wBGDQkMEQsgBSkDQCEUQaQIDAULQQAhAQJAAkACQAJAAkACQAJAIBJB/wFxDggAAQIDBBcFBhcLIAUoAkAgDjYCAAwWCyAFKAJAIA42AgAMFQsgBSgCQCAOrDcDAAwUCyAFKAJAIA47AQAMEwsgBSgCQCAOOgAADBILIAUoAkAgDjYCAAwRCyAFKAJAIA6sNwMADBALIAlBCCAJQQhLGyEJIAZBCHIhBkH4ACEBCyAQIQcgAUEgcSEMIAUpA0AiFFBFBEADQCAHQQFrIgcgFKdBD3FBsPAAai0AACAMcjoAACAUQg9WIQogFEIEiCEUIAoNAAsLIAUpA0BQDQMgBkEIcUUNAyABQQR2QaQIaiEPQQIhDQwDCyAQIQEgBSkDQCIUUEUEQANAIAFBAWsiASAUp0EHcUEwcjoAACAUQgdWIQcgFEIDiCEUIAcNAAsLIAEhByAGQQhxRQ0CIAkgECAHayIBQQFqIAEgCUgbIQkMAgsgBSkDQCIUQn9XBEAgBUIAIBR9IhQ3A0BBASENQaQIDAELIAZBgBBxBEBBASENQaUIDAELQaYIQaQIIAZBAXEiDRsLIQ8gECEBAkAgFEKAgICAEFQEQCAUIRUMAQsDQCABQQFrIgEgFCAUQgqAIhVCCn59p0EwcjoAACAUQv////+fAVYhByAVIRQgBw0ACwsgFaciBwRAA0AgAUEBayIBIAcgB0EKbiIMQQpsa0EwcjoAACAHQQlLIQogDCEHIAoNAAsLIAEhBwsgBkH//3txIAYgCUF/ShshBgJAIAUpA0AiFEIAUg0AIAkNAEEAIQkgECEHDAoLIAkgFFAgECAHa2oiASABIAlIGyEJDAkLIAUoAkAiAUGKEiABGyIHQQAgCRB6IgEgByAJaiABGyEIIAwhBiABIAdrIAkgARshCQwICyAJBEAgBSgCQAwCC0EAIQEgAEEgIAtBACAGECcMAgsgBUEANgIMIAUgBSkDQD4CCCAFIAVBCGo2AkBBfyEJIAVBCGoLIQhBACEBAkADQCAIKAIAIgdFDQECQCAFQQRqIAcQeSIHQQBIIgwNACAHIAkgAWtLDQAgCEEEaiEIIAkgASAHaiIBSw0BDAILC0F/IQ0gDA0FCyAAQSAgCyABIAYQJyABRQRAQQAhAQwBC0EAIQggBSgCQCEKA0AgCigCACIHRQ0BIAVBBGogBxB5IgcgCGoiCCABSg0BIAAgBUEEaiAHEC4gCkEEaiEKIAEgCEsNAAsLIABBICALIAEgBkGAwABzECcgCyABIAEgC0gbIQEMBQsgACAFKwNAIAsgCSAGIAFBABEdACEBDAQLIAUgBSkDQDwAN0EBIQkgEyEHIAwhBgwCC0F/IQ0LIAVB0ABqJAAgDQ8LIABBICANIAggB2siDCAJIAkgDEgbIgpqIgggCyAIIAtKGyIBIAggBhAnIAAgDyANEC4gAEEwIAEgCCAGQYCABHMQJyAAQTAgCiAMQQAQJyAAIAcgDBAuIABBICABIAggBkGAwABzECcMAAsAC54DAgR/AX4gAARAIAAoAgAiAQRAIAEQGhogACgCABALCyAAKAIcEAYgACgCIBAQIAAoAiQQECAAKAJQIgMEQCADKAIQIgIEQCADKAIAIgEEfwNAIAIgBEECdGooAgAiAgRAA0AgAigCGCEBIAIQBiABIgINAAsgAygCACEBCyABIARBAWoiBEsEQCADKAIQIQIMAQsLIAMoAhAFIAILEAYLIAMQBgsgACgCQCIBBEAgACkDMFAEfyABBSABED5CAiEFAkAgACkDMEICVA0AQQEhAgNAIAAoAkAgAkEEdGoQPiAFIAApAzBaDQEgBachAiAFQgF8IQUMAAsACyAAKAJACxAGCwJAIAAoAkRFDQBBACECQgEhBQNAIAAoAkwgAkECdGooAgAiAUEBOgAoIAFBDGoiASgCAEUEQCABBEAgAUEANgIEIAFBCDYCAAsLIAUgADUCRFoNASAFpyECIAVCAXwhBQwACwALIAAoAkwQBiAAKAJUIgIEQCACKAIIIgEEQCACKAIMIAERAwALIAIQBgsgAEEIahAxIAAQBgsL6gMCAX4EfwJAIAAEfiABRQRAIAMEQCADQQA2AgQgA0ESNgIAC0J/DwsgAkGDIHEEQAJAIAApAzBQDQBBPEE9IAJBAXEbIQcgAkECcUUEQANAIAAgBCACIAMQUyIFBEAgASAFIAcRAgBFDQYLIARCAXwiBCAAKQMwVA0ADAILAAsDQCAAIAQgAiADEFMiBQRAIAECfyAFECJBAWohBgNAQQAgBkUNARogBSAGQQFrIgZqIggtAABBL0cNAAsgCAsiBkEBaiAFIAYbIAcRAgBFDQULIARCAXwiBCAAKQMwVA0ACwsgAwRAIANBADYCBCADQQk2AgALQn8PC0ESIQYCQAJAIAAoAlAiBUUNACABRQ0AQQkhBiAFKQMIUA0AIAUoAhAgAS0AACIHBH9CpesKIQQgASEAA0AgBCAHrUL/AYN8IQQgAC0AASIHBEAgAEEBaiEAIARC/////w+DQiF+IQQMAQsLIASnBUGFKgsgBSgCAHBBAnRqKAIAIgBFDQADQCABIAAoAgAQOEUEQCACQQhxBEAgACkDCCIEQn9RDQMMBAsgACkDECIEQn9RDQIMAwsgACgCGCIADQALCyADBEAgA0EANgIEIAMgBjYCAAtCfyEECyAEBUJ/Cw8LIAMEQCADQgA3AgALIAQL3AQCB38BfgJAAkAgAEUNACABRQ0AIAJCf1UNAQsgBARAIARBADYCBCAEQRI2AgALQQAPCwJAIAAoAgAiB0UEQEGAAiEHQYACEDwiBkUNASAAKAIQEAYgAEGAAjYCACAAIAY2AhALAkACQCAAKAIQIAEtAAAiBQR/QqXrCiEMIAEhBgNAIAwgBa1C/wGDfCEMIAYtAAEiBQRAIAZBAWohBiAMQv////8Pg0IhfiEMDAELCyAMpwVBhSoLIgYgB3BBAnRqIggoAgAiBQRAA0ACQCAFKAIcIAZHDQAgASAFKAIAEDgNAAJAIANBCHEEQCAFKQMIQn9SDQELIAUpAxBCf1ENBAsgBARAIARBADYCBCAEQQo2AgALQQAPCyAFKAIYIgUNAAsLQSAQCSIFRQ0CIAUgATYCACAFIAgoAgA2AhggCCAFNgIAIAVCfzcDCCAFIAY2AhwgACAAKQMIQgF8Igw3AwggDLogB7hEAAAAAAAA6D+iZEUNACAHQQBIDQAgByAHQQF0IghGDQAgCBA8IgpFDQECQCAMQgAgBxtQBEAgACgCECEJDAELIAAoAhAhCUEAIQQDQCAJIARBAnRqKAIAIgYEQANAIAYoAhghASAGIAogBigCHCAIcEECdGoiCygCADYCGCALIAY2AgAgASIGDQALCyAEQQFqIgQgB0cNAAsLIAkQBiAAIAg2AgAgACAKNgIQCyADQQhxBEAgBSACNwMICyAFIAI3AxBBAQ8LIAQEQCAEQQA2AgQgBEEONgIAC0EADwsgBARAIARBADYCBCAEQQ42AgALQQAL3Q8BF38jAEFAaiIHQgA3AzAgB0IANwM4IAdCADcDICAHQgA3AygCQAJAAkACQAJAIAIEQCACQQNxIQggAkEBa0EDTwRAIAJBfHEhBgNAIAdBIGogASAJQQF0IgxqLwEAQQF0aiIKIAovAQBBAWo7AQAgB0EgaiABIAxBAnJqLwEAQQF0aiIKIAovAQBBAWo7AQAgB0EgaiABIAxBBHJqLwEAQQF0aiIKIAovAQBBAWo7AQAgB0EgaiABIAxBBnJqLwEAQQF0aiIKIAovAQBBAWo7AQAgCUEEaiEJIAZBBGsiBg0ACwsgCARAA0AgB0EgaiABIAlBAXRqLwEAQQF0aiIGIAYvAQBBAWo7AQAgCUEBaiEJIAhBAWsiCA0ACwsgBCgCACEJQQ8hCyAHLwE+IhENAgwBCyAEKAIAIQkLQQ4hC0EAIREgBy8BPA0AQQ0hCyAHLwE6DQBBDCELIAcvATgNAEELIQsgBy8BNg0AQQohCyAHLwE0DQBBCSELIAcvATINAEEIIQsgBy8BMA0AQQchCyAHLwEuDQBBBiELIAcvASwNAEEFIQsgBy8BKg0AQQQhCyAHLwEoDQBBAyELIAcvASYNAEECIQsgBy8BJA0AIAcvASJFBEAgAyADKAIAIgBBBGo2AgAgAEHAAjYBACADIAMoAgAiAEEEajYCACAAQcACNgEAQQEhDQwDCyAJQQBHIRtBASELQQEhCQwBCyALIAkgCSALSxshG0EBIQ5BASEJA0AgB0EgaiAJQQF0ai8BAA0BIAlBAWoiCSALRw0ACyALIQkLQX8hCCAHLwEiIg9BAksNAUEEIAcvASQiECAPQQF0amsiBkEASA0BIAZBAXQgBy8BJiISayIGQQBIDQEgBkEBdCAHLwEoIhNrIgZBAEgNASAGQQF0IAcvASoiFGsiBkEASA0BIAZBAXQgBy8BLCIVayIGQQBIDQEgBkEBdCAHLwEuIhZrIgZBAEgNASAGQQF0IAcvATAiF2siBkEASA0BIAZBAXQgBy8BMiIZayIGQQBIDQEgBkEBdCAHLwE0IhxrIgZBAEgNASAGQQF0IAcvATYiDWsiBkEASA0BIAZBAXQgBy8BOCIYayIGQQBIDQEgBkEBdCAHLwE6IgxrIgZBAEgNASAGQQF0IAcvATwiCmsiBkEASA0BIAZBAXQgEWsiBkEASA0BIAZBACAARSAOchsNASAJIBtLIRpBACEIIAdBADsBAiAHIA87AQQgByAPIBBqIgY7AQYgByAGIBJqIgY7AQggByAGIBNqIgY7AQogByAGIBRqIgY7AQwgByAGIBVqIgY7AQ4gByAGIBZqIgY7ARAgByAGIBdqIgY7ARIgByAGIBlqIgY7ARQgByAGIBxqIgY7ARYgByAGIA1qIgY7ARggByAGIBhqIgY7ARogByAGIAxqIgY7ARwgByAGIApqOwEeAkAgAkUNACACQQFHBEAgAkF+cSEGA0AgASAIQQF0ai8BACIKBEAgByAKQQF0aiIKIAovAQAiCkEBajsBACAFIApBAXRqIAg7AQALIAEgCEEBciIMQQF0ai8BACIKBEAgByAKQQF0aiIKIAovAQAiCkEBajsBACAFIApBAXRqIAw7AQALIAhBAmohCCAGQQJrIgYNAAsLIAJBAXFFDQAgASAIQQF0ai8BACICRQ0AIAcgAkEBdGoiAiACLwEAIgJBAWo7AQAgBSACQQF0aiAIOwEACyAJIBsgGhshDUEUIRBBACEWIAUiCiEYQQAhEgJAAkACQCAADgICAAELQQEhCCANQQpLDQNBgQIhEEHw2QAhGEGw2QAhCkEBIRIMAQsgAEECRiEWQQAhEEHw2gAhGEGw2gAhCiAAQQJHBEAMAQtBASEIIA1BCUsNAgtBASANdCITQQFrIRwgAygCACEUQQAhFSANIQZBACEPQQAhDkF/IQIDQEEBIAZ0IRoCQANAIAkgD2shFwJAIAUgFUEBdGovAQAiCCAQTwRAIAogCCAQa0EBdCIAai8BACERIAAgGGotAAAhAAwBC0EAQeAAIAhBAWogEEkiBhshACAIQQAgBhshEQsgDiAPdiEMQX8gF3QhBiAaIQgDQCAUIAYgCGoiCCAMakECdGoiGSAROwECIBkgFzoAASAZIAA6AAAgCA0AC0EBIAlBAWt0IQYDQCAGIgBBAXYhBiAAIA5xDQALIAdBIGogCUEBdGoiBiAGLwEAQQFrIgY7AQAgAEEBayAOcSAAakEAIAAbIQ4gFUEBaiEVIAZB//8DcUUEQCAJIAtGDQIgASAFIBVBAXRqLwEAQQF0ai8BACEJCyAJIA1NDQAgDiAccSIAIAJGDQALQQEgCSAPIA0gDxsiD2siBnQhAiAJIAtJBEAgCyAPayEMIAkhCAJAA0AgAiAHQSBqIAhBAXRqLwEAayICQQFIDQEgAkEBdCECIAZBAWoiBiAPaiIIIAtJDQALIAwhBgtBASAGdCECC0EBIQggEiACIBNqIhNBtApLcQ0DIBYgE0HQBEtxDQMgAygCACICIABBAnRqIgggDToAASAIIAY6AAAgCCAUIBpBAnRqIhQgAmtBAnY7AQIgACECDAELCyAOBEAgFCAOQQJ0aiIAQQA7AQIgACAXOgABIABBwAA6AAALIAMgAygCACATQQJ0ajYCAAsgBCANNgIAQQAhCAsgCAusAQICfgF/IAFBAmqtIQIgACkDmC4hAwJAIAAoAqAuIgFBA2oiBEE/TQRAIAIgAa2GIAOEIQIMAQsgAUHAAEYEQCAAKAIEIAAoAhBqIAM3AAAgACAAKAIQQQhqNgIQQQMhBAwBCyAAKAIEIAAoAhBqIAIgAa2GIAOENwAAIAAgACgCEEEIajYCECABQT1rIQQgAkHAACABa62IIQILIAAgAjcDmC4gACAENgKgLguXAwICfgN/QYDJADMBACECIAApA5guIQMCQCAAKAKgLiIFQYLJAC8BACIGaiIEQT9NBEAgAiAFrYYgA4QhAgwBCyAFQcAARgRAIAAoAgQgACgCEGogAzcAACAAIAAoAhBBCGo2AhAgBiEEDAELIAAoAgQgACgCEGogAiAFrYYgA4Q3AAAgACAAKAIQQQhqNgIQIARBQGohBCACQcAAIAVrrYghAgsgACACNwOYLiAAIAQ2AqAuIAEEQAJAIARBOU4EQCAAKAIEIAAoAhBqIAI3AAAgACAAKAIQQQhqNgIQDAELIARBGU4EQCAAKAIEIAAoAhBqIAI+AAAgACAAKAIQQQRqNgIQIAAgACkDmC5CIIgiAjcDmC4gACAAKAKgLkEgayIENgKgLgsgBEEJTgR/IAAoAgQgACgCEGogAj0AACAAIAAoAhBBAmo2AhAgACkDmC5CEIghAiAAKAKgLkEQawUgBAtBAUgNACAAIAAoAhAiAUEBajYCECABIAAoAgRqIAI8AAALIABBADYCoC4gAEIANwOYLgsL8hQBEn8gASgCCCICKAIAIQUgAigCDCEHIAEoAgAhCCAAQoCAgIDQxwA3A6ApQQAhAgJAAkAgB0EASgRAQX8hDANAAkAgCCACQQJ0aiIDLwEABEAgACAAKAKgKUEBaiIDNgKgKSAAIANBAnRqQawXaiACNgIAIAAgAmpBqClqQQA6AAAgAiEMDAELIANBADsBAgsgAkEBaiICIAdHDQALIABB/C1qIQ8gAEH4LWohESAAKAKgKSIEQQFKDQIMAQsgAEH8LWohDyAAQfgtaiERQX8hDAsDQCAAIARBAWoiAjYCoCkgACACQQJ0akGsF2ogDEEBaiIDQQAgDEECSCIGGyICNgIAIAggAkECdCIEakEBOwEAIAAgAmpBqClqQQA6AAAgACAAKAL4LUEBazYC+C0gBQRAIA8gDygCACAEIAVqLwECazYCAAsgAyAMIAYbIQwgACgCoCkiBEECSA0ACwsgASAMNgIEIARBAXYhBgNAIAAgBkECdGpBrBdqKAIAIQkCQCAGIgJBAXQiAyAESg0AIAggCUECdGohCiAAIAlqQagpaiENIAYhBQNAAkAgAyAETgRAIAMhAgwBCyAIIABBrBdqIgIgA0EBciIEQQJ0aigCACILQQJ0ai8BACIOIAggAiADQQJ0aigCACIQQQJ0ai8BACICTwRAIAIgDkcEQCADIQIMAgsgAyECIABBqClqIgMgC2otAAAgAyAQai0AAEsNAQsgBCECCyAKLwEAIgQgCCAAIAJBAnRqQawXaigCACIDQQJ0ai8BACILSQRAIAUhAgwCCwJAIAQgC0cNACANLQAAIAAgA2pBqClqLQAASw0AIAUhAgwCCyAAIAVBAnRqQawXaiADNgIAIAIhBSACQQF0IgMgACgCoCkiBEwNAAsLIAAgAkECdGpBrBdqIAk2AgAgBkECTgRAIAZBAWshBiAAKAKgKSEEDAELCyAAKAKgKSEDA0AgByEGIAAgA0EBayIENgKgKSAAKAKwFyEKIAAgACADQQJ0akGsF2ooAgAiCTYCsBdBASECAkAgA0EDSA0AIAggCUECdGohDSAAIAlqQagpaiELQQIhA0EBIQUDQAJAIAMgBE4EQCADIQIMAQsgCCAAQawXaiICIANBAXIiB0ECdGooAgAiBEECdGovAQAiDiAIIAIgA0ECdGooAgAiEEECdGovAQAiAk8EQCACIA5HBEAgAyECDAILIAMhAiAAQagpaiIDIARqLQAAIAMgEGotAABLDQELIAchAgsgDS8BACIHIAggACACQQJ0akGsF2ooAgAiA0ECdGovAQAiBEkEQCAFIQIMAgsCQCAEIAdHDQAgCy0AACAAIANqQagpai0AAEsNACAFIQIMAgsgACAFQQJ0akGsF2ogAzYCACACIQUgAkEBdCIDIAAoAqApIgRMDQALC0ECIQMgAEGsF2oiByACQQJ0aiAJNgIAIAAgACgCpClBAWsiBTYCpCkgACgCsBchAiAHIAVBAnRqIAo2AgAgACAAKAKkKUEBayIFNgKkKSAHIAVBAnRqIAI2AgAgCCAGQQJ0aiINIAggAkECdGoiBS8BACAIIApBAnRqIgQvAQBqOwEAIABBqClqIgkgBmoiCyACIAlqLQAAIgIgCSAKai0AACIKIAIgCksbQQFqOgAAIAUgBjsBAiAEIAY7AQIgACAGNgKwF0EBIQVBASECAkAgACgCoCkiBEECSA0AA0AgDS8BACIKIAggAAJ/IAMgAyAETg0AGiAIIAcgA0EBciICQQJ0aigCACIEQQJ0ai8BACIOIAggByADQQJ0aigCACIQQQJ0ai8BACISTwRAIAMgDiASRw0BGiADIAQgCWotAAAgCSAQai0AAEsNARoLIAILIgJBAnRqQawXaigCACIDQQJ0ai8BACIESQRAIAUhAgwCCwJAIAQgCkcNACALLQAAIAAgA2pBqClqLQAASw0AIAUhAgwCCyAAIAVBAnRqQawXaiADNgIAIAIhBSACQQF0IgMgACgCoCkiBEwNAAsLIAZBAWohByAAIAJBAnRqQawXaiAGNgIAIAAoAqApIgNBAUoNAAsgACAAKAKkKUEBayICNgKkKSAAQawXaiIDIAJBAnRqIAAoArAXNgIAIAEoAgQhCSABKAIIIgIoAhAhBiACKAIIIQogAigCBCEQIAIoAgAhDSABKAIAIQcgAEGkF2pCADcBACAAQZwXakIANwEAIABBlBdqQgA3AQAgAEGMF2oiAUIANwEAQQAhBSAHIAMgACgCpClBAnRqKAIAQQJ0akEAOwECAkAgACgCpCkiAkG7BEoNACACQQFqIQIDQCAHIAAgAkECdGpBrBdqKAIAIgRBAnQiEmoiCyAHIAsvAQJBAnRqLwECIgNBAWogBiADIAZJGyIOOwECIAMgBk8hEwJAIAQgCUoNACAAIA5BAXRqQYwXaiIDIAMvAQBBAWo7AQBBACEDIAQgCk4EQCAQIAQgCmtBAnRqKAIAIQMLIBEgESgCACALLwEAIgQgAyAOamxqNgIAIA1FDQAgDyAPKAIAIAMgDSASai8BAmogBGxqNgIACyAFIBNqIQUgAkEBaiICQb0ERw0ACyAFRQ0AIAAgBkEBdGpBjBdqIQQDQCAGIQIDQCAAIAIiA0EBayICQQF0akGMF2oiDy8BACIKRQ0ACyAPIApBAWs7AQAgACADQQF0akGMF2oiAiACLwEAQQJqOwEAIAQgBC8BAEEBayIDOwEAIAVBAkohAiAFQQJrIQUgAg0ACyAGRQ0AQb0EIQIDQCADQf//A3EiBQRAA0AgACACQQFrIgJBAnRqQawXaigCACIDIAlKDQAgByADQQJ0aiIDLwECIAZHBEAgESARKAIAIAYgAy8BAGxqIgQ2AgAgESAEIAMvAQAgAy8BAmxrNgIAIAMgBjsBAgsgBUEBayIFDQALCyAGQQFrIgZFDQEgACAGQQF0akGMF2ovAQAhAwwACwALIwBBIGsiAiABIgAvAQBBAXQiATsBAiACIAEgAC8BAmpBAXQiATsBBCACIAEgAC8BBGpBAXQiATsBBiACIAEgAC8BBmpBAXQiATsBCCACIAEgAC8BCGpBAXQiATsBCiACIAEgAC8BCmpBAXQiATsBDCACIAEgAC8BDGpBAXQiATsBDiACIAEgAC8BDmpBAXQiATsBECACIAEgAC8BEGpBAXQiATsBEiACIAEgAC8BEmpBAXQiATsBFCACIAEgAC8BFGpBAXQiATsBFiACIAEgAC8BFmpBAXQiATsBGCACIAEgAC8BGGpBAXQiATsBGiACIAEgAC8BGmpBAXQiATsBHCACIAAvARwgAWpBAXQ7AR5BACEAIAxBAE4EQANAIAggAEECdGoiAy8BAiIBBEAgAiABQQF0aiIFIAUvAQAiBUEBajsBACADIAWtQoD+A4NCCIhCgpCAgQh+QpDCiKKIAYNCgYKEiBB+QiCIp0H/AXEgBUH/AXGtQoKQgIEIfkKQwoiiiAGDQoGChIgQfkIYiKdBgP4DcXJBECABa3Y7AQALIAAgDEchASAAQQFqIQAgAQ0ACwsLcgEBfyMAQRBrIgQkAAJ/QQAgAEUNABogAEEIaiEAIAFFBEAgAlBFBEAgAARAIABBADYCBCAAQRI2AgALQQAMAgtBAEIAIAMgABA6DAELIAQgAjcDCCAEIAE2AgAgBEIBIAMgABA6CyEAIARBEGokACAACyIAIAAgASACIAMQJiIARQRAQQAPCyAAKAIwQQAgAiADECULAwABC8gFAQR/IABB//8DcSEDIABBEHYhBEEBIQAgAkEBRgRAIAMgAS0AAGpB8f8DcCIAIARqQfH/A3BBEHQgAHIPCwJAIAEEfyACQRBJDQECQCACQa8rSwRAA0AgAkGwK2shAkG1BSEFIAEhAANAIAMgAC0AAGoiAyAEaiADIAAtAAFqIgNqIAMgAC0AAmoiA2ogAyAALQADaiIDaiADIAAtAARqIgNqIAMgAC0ABWoiA2ogAyAALQAGaiIDaiADIAAtAAdqIgNqIQQgBQRAIABBCGohACAFQQFrIQUMAQsLIARB8f8DcCEEIANB8f8DcCEDIAFBsCtqIQEgAkGvK0sNAAsgAkEISQ0BCwNAIAMgAS0AAGoiACAEaiAAIAEtAAFqIgBqIAAgAS0AAmoiAGogACABLQADaiIAaiAAIAEtAARqIgBqIAAgAS0ABWoiAGogACABLQAGaiIAaiAAIAEtAAdqIgNqIQQgAUEIaiEBIAJBCGsiAkEHSw0ACwsCQCACRQ0AIAJBAWshBiACQQNxIgUEQCABIQADQCACQQFrIQIgAyAALQAAaiIDIARqIQQgAEEBaiIBIQAgBUEBayIFDQALCyAGQQNJDQADQCADIAEtAABqIgAgAS0AAWoiBSABLQACaiIGIAEtAANqIgMgBiAFIAAgBGpqamohBCABQQRqIQEgAkEEayICDQALCyADQfH/A3AgBEHx/wNwQRB0cgVBAQsPCwJAIAJFDQAgAkEBayEGIAJBA3EiBQRAIAEhAANAIAJBAWshAiADIAAtAABqIgMgBGohBCAAQQFqIgEhACAFQQFrIgUNAAsLIAZBA0kNAANAIAMgAS0AAGoiACABLQABaiIFIAEtAAJqIgYgAS0AA2oiAyAGIAUgACAEampqaiEEIAFBBGohASACQQRrIgINAAsLIANB8f8DcCAEQfH/A3BBEHRyCx8AIAAgAiADQcCAASgCABEAACEAIAEgAiADEAcaIAALIwAgACAAKAJAIAIgA0HUgAEoAgARAAA2AkAgASACIAMQBxoLzSoCGH8HfiAAKAIMIgIgACgCECIDaiEQIAMgAWshASAAKAIAIgUgACgCBGohA0F/IAAoAhwiBygCpAF0IQRBfyAHKAKgAXQhCyAHKAI4IQwCf0EAIAcoAiwiEUUNABpBACACIAxJDQAaIAJBhAJqIAwgEWpNCyEWIBBBgwJrIRMgASACaiEXIANBDmshFCAEQX9zIRggC0F/cyESIAcoApwBIRUgBygCmAEhDSAHKAKIASEIIAc1AoQBIR0gBygCNCEOIAcoAjAhGSAQQQFqIQ8DQCAIQThyIQYgBSAIQQN2QQdxayELAn8gAiANIAUpAAAgCK2GIB2EIh2nIBJxQQJ0IgFqIgMtAAAiBA0AGiACIAEgDWoiAS0AAjoAACAGIAEtAAEiAWshBiACQQFqIA0gHSABrYgiHacgEnFBAnQiAWoiAy0AACIEDQAaIAIgASANaiIDLQACOgABIAYgAy0AASIDayEGIA0gHSADrYgiHacgEnFBAnRqIgMtAAAhBCACQQJqCyEBIAtBB2ohBSAGIAMtAAEiAmshCCAdIAKtiCEdAkACQAJAIARB/wFxRQ0AAkACQAJAAkACQANAIARBEHEEQCAVIB0gBK1CD4OIIhqnIBhxQQJ0aiECAn8gCCAEQQ9xIgZrIgRBG0sEQCAEIQggBQwBCyAEQThyIQggBSkAACAErYYgGoQhGiAFIARBA3ZrQQdqCyELIAMzAQIhGyAIIAItAAEiA2shCCAaIAOtiCEaIAItAAAiBEEQcQ0CA0AgBEHAAHFFBEAgCCAVIAIvAQJBAnRqIBqnQX8gBHRBf3NxQQJ0aiICLQABIgNrIQggGiADrYghGiACLQAAIgRBEHFFDQEMBAsLIAdB0f4ANgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w==";Zs(bi)||(bi=b(bi));function Fs(Je){try{if(Je==bi&&ue)return new Uint8Array(ue);var st=ia(Je);if(st)return st;if(T)return T(Je);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(vt){Hi(vt)}}function $s(Je,st){var vt,ar,ee;try{ee=Fs(Je),ar=new WebAssembly.Module(ee),vt=new WebAssembly.Instance(ar,st)}catch(Ne){var ye=Ne.toString();throw te("failed to compile wasm module: "+ye),(ye.includes("imported Memory")||ye.includes("memory import"))&&te("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),Ne}return[vt,ar]}function PA(){var Je={a:dc};function st(ee,ye){var Ne=ee.exports;r.asm=Ne,De=r.asm.g,z(De.buffer),$=r.asm.W,cn(r.asm.h),Xs("wasm-instantiate")}if($n("wasm-instantiate"),r.instantiateWasm)try{var vt=r.instantiateWasm(Je,st);return vt}catch(ee){return te("Module.instantiateWasm callback failed with error: "+ee),!1}var ar=$s(bi,Je);return st(ar[0]),r.asm}function gu(Je){return R.getFloat32(Je,!0)}function op(Je){return R.getFloat64(Je,!0)}function ap(Je){return R.getInt16(Je,!0)}function Rs(Je){return R.getInt32(Je,!0)}function Nn(Je,st){R.setInt32(Je,st,!0)}function hs(Je){for(;Je.length>0;){var st=Je.shift();if(typeof st=="function"){st(r);continue}var vt=st.func;typeof vt=="number"?st.arg===void 0?$.get(vt)():$.get(vt)(st.arg):vt(st.arg===void 0?null:st.arg)}}function Ts(Je,st){var vt=new Date(Rs((Je>>2)*4)*1e3);Nn((st>>2)*4,vt.getUTCSeconds()),Nn((st+4>>2)*4,vt.getUTCMinutes()),Nn((st+8>>2)*4,vt.getUTCHours()),Nn((st+12>>2)*4,vt.getUTCDate()),Nn((st+16>>2)*4,vt.getUTCMonth()),Nn((st+20>>2)*4,vt.getUTCFullYear()-1900),Nn((st+24>>2)*4,vt.getUTCDay()),Nn((st+36>>2)*4,0),Nn((st+32>>2)*4,0);var ar=Date.UTC(vt.getUTCFullYear(),0,1,0,0,0,0),ee=(vt.getTime()-ar)/(1e3*60*60*24)|0;return Nn((st+28>>2)*4,ee),Ts.GMTString||(Ts.GMTString=nt("GMT")),Nn((st+40>>2)*4,Ts.GMTString),st}function pc(Je,st){return Ts(Je,st)}function hc(Je,st,vt){xe.copyWithin(Je,st,st+vt)}function gc(Je){try{return De.grow(Je-ke.byteLength+65535>>>16),z(De.buffer),1}catch{}}function xA(Je){var st=xe.length;Je=Je>>>0;var vt=2147483648;if(Je>vt)return!1;for(var ar=1;ar<=4;ar*=2){var ee=st*(1+.2/ar);ee=Math.min(ee,Je+100663296);var ye=Math.min(vt,Te(Math.max(Je,ee),65536)),Ne=gc(ye);if(Ne)return!0}return!1}function bA(Je){ce(Je)}function Ro(Je){var st=Date.now()/1e3|0;return Je&&Nn((Je>>2)*4,st),st}function To(){if(To.called)return;To.called=!0;var Je=new Date().getFullYear(),st=new Date(Je,0,1),vt=new Date(Je,6,1),ar=st.getTimezoneOffset(),ee=vt.getTimezoneOffset(),ye=Math.max(ar,ee);Nn((ja()>>2)*4,ye*60),Nn((rs()>>2)*4,+(ar!=ee));function Ne(sn){var ei=sn.toTimeString().match(/\(([A-Za-z ]+)\)$/);return ei?ei[1]:"GMT"}var gt=Ne(st),mt=Ne(vt),Dt=nt(gt),er=nt(mt);ee>2)*4,Dt),Nn((Di()+4>>2)*4,er)):(Nn((Di()>>2)*4,er),Nn((Di()+4>>2)*4,Dt))}function kA(Je){To();var st=Date.UTC(Rs((Je+20>>2)*4)+1900,Rs((Je+16>>2)*4),Rs((Je+12>>2)*4),Rs((Je+8>>2)*4),Rs((Je+4>>2)*4),Rs((Je>>2)*4),0),vt=new Date(st);Nn((Je+24>>2)*4,vt.getUTCDay());var ar=Date.UTC(vt.getUTCFullYear(),0,1,0,0,0,0),ee=(vt.getTime()-ar)/(1e3*60*60*24)|0;return Nn((Je+28>>2)*4,ee),vt.getTime()/1e3|0}var pr=typeof atob=="function"?atob:function(Je){var st="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",vt="",ar,ee,ye,Ne,gt,mt,Dt,er=0;Je=Je.replace(/[^A-Za-z0-9\+\/\=]/g,"");do Ne=st.indexOf(Je.charAt(er++)),gt=st.indexOf(Je.charAt(er++)),mt=st.indexOf(Je.charAt(er++)),Dt=st.indexOf(Je.charAt(er++)),ar=Ne<<2|gt>>4,ee=(gt&15)<<4|mt>>2,ye=(mt&3)<<6|Dt,vt=vt+String.fromCharCode(ar),mt!==64&&(vt=vt+String.fromCharCode(ee)),Dt!==64&&(vt=vt+String.fromCharCode(ye));while(er0||(Et(),yr>0))return;function st(){Dn||(Dn=!0,r.calledRun=!0,!Ee&&(qt(),o(r),r.onRuntimeInitialized&&r.onRuntimeInitialized(),nr()))}r.setStatus?(r.setStatus("Running..."),setTimeout(function(){setTimeout(function(){r.setStatus("")},1),st()},1)):st()}if(r.run=Pl,r.preInit)for(typeof r.preInit=="function"&&(r.preInit=[r.preInit]);r.preInit.length>0;)r.preInit.pop()();return Pl(),e}}();typeof ub=="object"&&typeof MU=="object"?MU.exports=OU:typeof define=="function"&&define.amd?define([],function(){return OU}):typeof ub=="object"&&(ub.createModule=OU)});var Lf,wce,Bce,vce=It(()=>{Lf=["number","number"],wce=(Z=>(Z[Z.ZIP_ER_OK=0]="ZIP_ER_OK",Z[Z.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",Z[Z.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",Z[Z.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",Z[Z.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",Z[Z.ZIP_ER_READ=5]="ZIP_ER_READ",Z[Z.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",Z[Z.ZIP_ER_CRC=7]="ZIP_ER_CRC",Z[Z.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",Z[Z.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",Z[Z.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",Z[Z.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",Z[Z.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",Z[Z.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",Z[Z.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",Z[Z.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",Z[Z.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",Z[Z.ZIP_ER_EOF=17]="ZIP_ER_EOF",Z[Z.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",Z[Z.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",Z[Z.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",Z[Z.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",Z[Z.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",Z[Z.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",Z[Z.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",Z[Z.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",Z[Z.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",Z[Z.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",Z[Z.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",Z[Z.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",Z[Z.ZIP_ER_TELL=30]="ZIP_ER_TELL",Z[Z.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA",Z))(wce||{}),Bce=t=>({get HEAPU8(){return t.HEAPU8},errors:wce,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_EXCL:2,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint32S:t._malloc(4),malloc:t._malloc,free:t._free,getValue:t.getValue,openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...Lf,"number","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...Lf,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...Lf,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...Lf,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...Lf,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...Lf,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number",...Lf,"number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...Lf,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...Lf,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"])},struct:{statS:t.cwrap("zipstruct_statS","number",[]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}})});function UU(t,e){let r=t.indexOf(e);if(r<=0)return null;let o=r;for(;r>=0&&(o=r+e.length,t[o]!==V.sep);){if(t[r-1]===V.sep)return null;r=t.indexOf(e,o)}return t.length>o&&t[o]!==V.sep?null:t.slice(0,o)}var iA,Dce=It(()=>{St();St();sA();iA=class t extends Gp{static async openPromise(e,r){let o=new t(r);try{return await e(o)}finally{o.saveAndClose()}}constructor(e={}){let r=e.fileExtensions,o=e.readOnlyArchives,a=typeof r>"u"?A=>UU(A,".zip"):A=>{for(let p of r){let h=UU(A,p);if(h)return h}return null},n=(A,p)=>new Zi(p,{baseFs:A,readOnly:o,stats:A.statSync(p)}),u=async(A,p)=>{let h={baseFs:A,readOnly:o,stats:await A.statPromise(p)};return()=>new Zi(p,h)};super({...e,factorySync:n,factoryPromise:u,getMountPoint:a})}}});function tot(t){if(typeof t=="string"&&String(+t)===t)return+t;if(typeof t=="number"&&Number.isFinite(t))return t<0?Date.now()/1e3:t;if(Sce.types.isDate(t))return t.getTime()/1e3;throw new Error("Invalid time")}function Ab(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var ta,_U,Sce,HU,Pce,fb,Zi,qU=It(()=>{St();St();St();St();St();St();ta=ve("fs"),_U=ve("stream"),Sce=ve("util"),HU=et(ve("zlib"));NU();Pce="mixed";fb=class extends Error{constructor(e,r){super(e),this.name="Libzip Error",this.code=r}},Zi=class extends qu{constructor(r,o={}){super();this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;let a=o;if(this.level=typeof a.level<"u"?a.level:Pce,r??=Ab(),typeof r=="string"){let{baseFs:A=new _n}=a;this.baseFs=A,this.path=r}else this.path=null,this.baseFs=null;if(o.stats)this.stats=o.stats;else if(typeof r=="string")try{this.stats=this.baseFs.statSync(r)}catch(A){if(A.code==="ENOENT"&&a.create)this.stats=wa.makeDefaultStats();else throw A}else this.stats=wa.makeDefaultStats();this.libzip=V1();let n=this.libzip.malloc(4);try{let A=0;o.readOnly&&(A|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof r=="string"&&(r=a.create?Ab():this.baseFs.readFileSync(r));let p=this.allocateUnattachedSource(r);try{this.zip=this.libzip.openFromSource(p,A,n),this.lzSource=p}catch(h){throw this.libzip.source.free(p),h}if(this.zip===0){let h=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(h,this.libzip.getValue(n,"i32")),this.makeLibzipError(h)}}finally{this.libzip.free(n)}this.listings.set(Bt.root,new Set);let u=this.libzip.getNumEntries(this.zip,0);for(let A=0;Ar)throw new Error("Overread");let n=Buffer.from(this.libzip.HEAPU8.subarray(o,o+r));return process.env.YARN_IS_TEST_ENV&&process.env.YARN_ZIP_DATA_EPILOGUE&&(n=Buffer.concat([n,Buffer.from(process.env.YARN_ZIP_DATA_EPILOGUE)])),n}finally{this.libzip.free(o)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.readOnly){this.discardAndClose();return}let r=this.baseFs.existsSync(this.path)||this.stats.mode===wa.DEFAULT_MODE?void 0:this.stats.mode;this.baseFs.writeFileSync(this.path,this.getBufferAndClose(),{mode:r}),this.ready=!1}resolve(r){return V.resolve(Bt.root,r)}async openPromise(r,o,a){return this.openSync(r,o,a)}openSync(r,o,a){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:r}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(r,o){return this.opendirSync(r,o)}opendirSync(r,o={}){let a=this.resolveFilename(`opendir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`opendir '${r}'`);let n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`opendir '${r}'`);let u=[...n],A=this.openSync(a,"r");return eS(this,a,u,{onClose:()=>{this.closeSync(A)}})}async readPromise(r,o,a,n,u){return this.readSync(r,o,a,n,u)}readSync(r,o,a=0,n=o.byteLength,u=-1){let A=this.fds.get(r);if(typeof A>"u")throw sr.EBADF("read");let p=u===-1||u===null?A.cursor:u,h=this.readFileSync(A.p);h.copy(o,a,p,p+n);let E=Math.max(0,Math.min(h.length-p,n));return(u===-1||u===null)&&(A.cursor+=E),E}async writePromise(r,o,a,n,u){return typeof o=="string"?this.writeSync(r,o,u):this.writeSync(r,o,a,n,u)}writeSync(r,o,a,n,u){throw typeof this.fds.get(r)>"u"?sr.EBADF("read"):new Error("Unimplemented")}async closePromise(r){return this.closeSync(r)}closeSync(r){if(typeof this.fds.get(r)>"u")throw sr.EBADF("read");this.fds.delete(r)}createReadStream(r,{encoding:o}={}){if(r===null)throw new Error("Unimplemented");let a=this.openSync(r,"r"),n=Object.assign(new _U.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(A,p)=>{clearImmediate(u),this.closeSync(a),p(A)}}),{close(){n.destroy()},bytesRead:0,path:r,pending:!1}),u=setImmediate(async()=>{try{let A=await this.readFilePromise(r,o);n.bytesRead=A.length,n.end(A)}catch(A){n.destroy(A)}});return n}createWriteStream(r,{encoding:o}={}){if(this.readOnly)throw sr.EROFS(`open '${r}'`);if(r===null)throw new Error("Unimplemented");let a=[],n=this.openSync(r,"w"),u=Object.assign(new _U.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(A,p)=>{try{A?p(A):(this.writeFileSync(r,Buffer.concat(a),o),p(null))}catch(h){p(h)}finally{this.closeSync(n)}}}),{close(){u.destroy()},bytesWritten:0,path:r,pending:!1});return u.on("data",A=>{let p=Buffer.from(A);u.bytesWritten+=p.length,a.push(p)}),u}async realpathPromise(r){return this.realpathSync(r)}realpathSync(r){let o=this.resolveFilename(`lstat '${r}'`,r);if(!this.entries.has(o)&&!this.listings.has(o))throw sr.ENOENT(`lstat '${r}'`);return o}async existsPromise(r){return this.existsSync(r)}existsSync(r){if(!this.ready)throw sr.EBUSY(`archive closed, existsSync '${r}'`);if(this.symlinkCount===0){let a=V.resolve(Bt.root,r);return this.entries.has(a)||this.listings.has(a)}let o;try{o=this.resolveFilename(`stat '${r}'`,r,void 0,!1)}catch{return!1}return o===void 0?!1:this.entries.has(o)||this.listings.has(o)}async accessPromise(r,o){return this.accessSync(r,o)}accessSync(r,o=ta.constants.F_OK){let a=this.resolveFilename(`access '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`access '${r}'`);if(this.readOnly&&o&ta.constants.W_OK)throw sr.EROFS(`access '${r}'`)}async statPromise(r,o={bigint:!1}){return o.bigint?this.statSync(r,{bigint:!0}):this.statSync(r)}statSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`stat '${r}'`,r,void 0,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw sr.ENOENT(`stat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`stat '${r}'`);return this.statImpl(`stat '${r}'`,a,o)}}async fstatPromise(r,o){return this.fstatSync(r,o)}fstatSync(r,o){let a=this.fds.get(r);if(typeof a>"u")throw sr.EBADF("fstatSync");let{p:n}=a,u=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(u)&&!this.listings.has(u))throw sr.ENOENT(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(u))throw sr.ENOTDIR(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,u,o)}async lstatPromise(r,o={bigint:!1}){return o.bigint?this.lstatSync(r,{bigint:!0}):this.lstatSync(r)}lstatSync(r,o={bigint:!1,throwIfNoEntry:!0}){let a=this.resolveFilename(`lstat '${r}'`,r,!1,o.throwIfNoEntry);if(a!==void 0){if(!this.entries.has(a)&&!this.listings.has(a)){if(o.throwIfNoEntry===!1)return;throw sr.ENOENT(`lstat '${r}'`)}if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`lstat '${r}'`);return this.statImpl(`lstat '${r}'`,a,o)}}statImpl(r,o,a={}){let n=this.entries.get(o);if(typeof n<"u"){let u=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,u)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let p=this.stats.uid,h=this.stats.gid,E=this.libzip.struct.statSize(u)>>>0,w=512,D=Math.ceil(E/w),b=(this.libzip.struct.statMtime(u)>>>0)*1e3,C=b,T=b,N=b,U=new Date(C),J=new Date(T),te=new Date(N),le=new Date(b),ce=this.listings.has(o)?ta.constants.S_IFDIR:this.isSymbolicLink(n)?ta.constants.S_IFLNK:ta.constants.S_IFREG,ue=ce===ta.constants.S_IFDIR?493:420,Ie=ce|this.getUnixMode(n,ue)&511,he=this.libzip.struct.statCrc(u),De=Object.assign(new wa.StatEntry,{uid:p,gid:h,size:E,blksize:w,blocks:D,atime:U,birthtime:J,ctime:te,mtime:le,atimeMs:C,birthtimeMs:T,ctimeMs:N,mtimeMs:b,mode:Ie,crc:he});return a.bigint===!0?wa.convertToBigIntStats(De):De}if(this.listings.has(o)){let u=this.stats.uid,A=this.stats.gid,p=0,h=512,E=0,w=this.stats.mtimeMs,D=this.stats.mtimeMs,b=this.stats.mtimeMs,C=this.stats.mtimeMs,T=new Date(w),N=new Date(D),U=new Date(b),J=new Date(C),te=ta.constants.S_IFDIR|493,ce=Object.assign(new wa.StatEntry,{uid:u,gid:A,size:p,blksize:h,blocks:E,atime:T,birthtime:N,ctime:U,mtime:J,atimeMs:w,birthtimeMs:D,ctimeMs:b,mtimeMs:C,mode:te,crc:0});return a.bigint===!0?wa.convertToBigIntStats(ce):ce}throw new Error("Unreachable")}getUnixMode(r,o){if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?o:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(r){let o=this.listings.get(r);if(o)return o;this.registerListing(V.dirname(r)).add(V.basename(r));let n=new Set;return this.listings.set(r,n),n}registerEntry(r,o){this.registerListing(V.dirname(r)).add(V.basename(r)),this.entries.set(r,o)}unregisterListing(r){this.listings.delete(r),this.listings.get(V.dirname(r))?.delete(V.basename(r))}unregisterEntry(r){this.unregisterListing(r);let o=this.entries.get(r);this.entries.delete(r),!(typeof o>"u")&&(this.fileSources.delete(o),this.isSymbolicLink(o)&&this.symlinkCount--)}deleteEntry(r,o){if(this.unregisterEntry(r),this.libzip.delete(this.zip,o)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(r,o,a=!0,n=!0){if(!this.ready)throw sr.EBUSY(`archive closed, ${r}`);let u=V.resolve(Bt.root,o);if(u==="/")return Bt.root;let A=this.entries.get(u);if(a&&A!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(A)){let p=this.getFileSource(A).toString();return this.resolveFilename(r,V.resolve(V.dirname(u),p),!0,n)}else return u;for(;;){let p=this.resolveFilename(r,V.dirname(u),!0,n);if(p===void 0)return p;let h=this.listings.has(p),E=this.entries.has(p);if(!h&&!E){if(n===!1)return;throw sr.ENOENT(r)}if(!h)throw sr.ENOTDIR(r);if(u=V.resolve(p,V.basename(u)),!a||this.symlinkCount===0)break;let w=this.libzip.name.locate(this.zip,u.slice(1),0);if(w===-1)break;if(this.isSymbolicLink(w)){let D=this.getFileSource(w).toString();u=V.resolve(V.dirname(u),D)}else break}return u}allocateBuffer(r){Buffer.isBuffer(r)||(r=Buffer.from(r));let o=this.libzip.malloc(r.byteLength);if(!o)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,o,r.byteLength).set(r),{buffer:o,byteLength:r.byteLength}}allocateUnattachedSource(r){let o=this.libzip.struct.errorS(),{buffer:a,byteLength:n}=this.allocateBuffer(r),u=this.libzip.source.fromUnattachedBuffer(a,n,0,1,o);if(u===0)throw this.libzip.free(o),this.makeLibzipError(o);return u}allocateSource(r){let{buffer:o,byteLength:a}=this.allocateBuffer(r),n=this.libzip.source.fromBuffer(this.zip,o,a,0,1);if(n===0)throw this.libzip.free(o),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(r,o){let a=Buffer.isBuffer(o)?o:Buffer.from(o),n=V.relative(Bt.root,r),u=this.allocateSource(o);try{let A=this.libzip.file.add(this.zip,n,u,this.libzip.ZIP_FL_OVERWRITE);if(A===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let p=this.level===0?this.libzip.ZIP_CM_STORE:this.libzip.ZIP_CM_DEFLATE;if(this.libzip.file.setCompression(this.zip,A,0,p,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(A,a),A}catch(A){throw this.libzip.source.free(u),A}}isSymbolicLink(r){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,r,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&ta.constants.S_IFMT)===ta.constants.S_IFLNK}getFileSource(r,o={asyncDecompress:!1}){let a=this.fileSources.get(r);if(typeof a<"u")return a;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,r,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let A=this.libzip.struct.statCompSize(n),p=this.libzip.struct.statCompMethod(n),h=this.libzip.malloc(A);try{let E=this.libzip.fopenIndex(this.zip,r,0,this.libzip.ZIP_FL_COMPRESSED);if(E===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let w=this.libzip.fread(E,h,A,0);if(w===-1)throw this.makeLibzipError(this.libzip.file.getError(E));if(wA)throw new Error("Overread");let D=this.libzip.HEAPU8.subarray(h,h+A),b=Buffer.from(D);if(p===0)return this.fileSources.set(r,b),b;if(o.asyncDecompress)return new Promise((C,T)=>{HU.default.inflateRaw(b,(N,U)=>{N?T(N):(this.fileSources.set(r,U),C(U))})});{let C=HU.default.inflateRawSync(b);return this.fileSources.set(r,C),C}}finally{this.libzip.fclose(E)}}finally{this.libzip.free(h)}}async fchmodPromise(r,o){return this.chmodPromise(this.fdToPath(r,"fchmod"),o)}fchmodSync(r,o){return this.chmodSync(this.fdToPath(r,"fchmodSync"),o)}async chmodPromise(r,o){return this.chmodSync(r,o)}chmodSync(r,o){if(this.readOnly)throw sr.EROFS(`chmod '${r}'`);o&=493;let a=this.resolveFilename(`chmod '${r}'`,r,!1),n=this.entries.get(a);if(typeof n>"u")throw new Error(`Assertion failed: The entry should have been registered (${a})`);let A=this.getUnixMode(n,ta.constants.S_IFREG|0)&-512|o;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,A<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async fchownPromise(r,o,a){return this.chownPromise(this.fdToPath(r,"fchown"),o,a)}fchownSync(r,o,a){return this.chownSync(this.fdToPath(r,"fchownSync"),o,a)}async chownPromise(r,o,a){return this.chownSync(r,o,a)}chownSync(r,o,a){throw new Error("Unimplemented")}async renamePromise(r,o){return this.renameSync(r,o)}renameSync(r,o){throw new Error("Unimplemented")}async copyFilePromise(r,o,a){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=await this.getFileSource(n,{asyncDecompress:!0}),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}copyFileSync(r,o,a=0){let{indexSource:n,indexDest:u,resolvedDestP:A}=this.prepareCopyFile(r,o,a),p=this.getFileSource(n),h=this.setFileSource(A,p);h!==u&&this.registerEntry(A,h)}prepareCopyFile(r,o,a=0){if(this.readOnly)throw sr.EROFS(`copyfile '${r} -> '${o}'`);if(a&ta.constants.COPYFILE_FICLONE_FORCE)throw sr.ENOSYS("unsupported clone operation",`copyfile '${r}' -> ${o}'`);let n=this.resolveFilename(`copyfile '${r} -> ${o}'`,r),u=this.entries.get(n);if(typeof u>"u")throw sr.EINVAL(`copyfile '${r}' -> '${o}'`);let A=this.resolveFilename(`copyfile '${r}' -> ${o}'`,o),p=this.entries.get(A);if(a&(ta.constants.COPYFILE_EXCL|ta.constants.COPYFILE_FICLONE_FORCE)&&typeof p<"u")throw sr.EEXIST(`copyfile '${r}' -> '${o}'`);return{indexSource:u,resolvedDestP:A,indexDest:p}}async appendFilePromise(r,o,a){if(this.readOnly)throw sr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFilePromise(r,o,a)}appendFileSync(r,o,a={}){if(this.readOnly)throw sr.EROFS(`open '${r}'`);return typeof a>"u"?a={flag:"a"}:typeof a=="string"?a={flag:"a",encoding:a}:typeof a.flag>"u"&&(a={flag:"a",...a}),this.writeFileSync(r,o,a)}fdToPath(r,o){let a=this.fds.get(r)?.p;if(typeof a>"u")throw sr.EBADF(o);return a}async writeFilePromise(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([await this.getFileSource(A,{asyncDecompress:!0}),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&await this.chmodPromise(p,u)}writeFileSync(r,o,a){let{encoding:n,mode:u,index:A,resolvedP:p}=this.prepareWriteFile(r,a);A!==void 0&&typeof a=="object"&&a.flag&&a.flag.includes("a")&&(o=Buffer.concat([this.getFileSource(A),Buffer.from(o)])),n!==null&&(o=o.toString(n));let h=this.setFileSource(p,o);h!==A&&this.registerEntry(p,h),u!==null&&this.chmodSync(p,u)}prepareWriteFile(r,o){if(typeof r=="number"&&(r=this.fdToPath(r,"read")),this.readOnly)throw sr.EROFS(`open '${r}'`);let a=this.resolveFilename(`open '${r}'`,r);if(this.listings.has(a))throw sr.EISDIR(`open '${r}'`);let n=null,u=null;typeof o=="string"?n=o:typeof o=="object"&&({encoding:n=null,mode:u=null}=o);let A=this.entries.get(a);return{encoding:n,mode:u,resolvedP:a,index:A}}async unlinkPromise(r){return this.unlinkSync(r)}unlinkSync(r){if(this.readOnly)throw sr.EROFS(`unlink '${r}'`);let o=this.resolveFilename(`unlink '${r}'`,r);if(this.listings.has(o))throw sr.EISDIR(`unlink '${r}'`);let a=this.entries.get(o);if(typeof a>"u")throw sr.EINVAL(`unlink '${r}'`);this.deleteEntry(o,a)}async utimesPromise(r,o,a){return this.utimesSync(r,o,a)}utimesSync(r,o,a){if(this.readOnly)throw sr.EROFS(`utimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r);this.utimesImpl(n,a)}async lutimesPromise(r,o,a){return this.lutimesSync(r,o,a)}lutimesSync(r,o,a){if(this.readOnly)throw sr.EROFS(`lutimes '${r}'`);let n=this.resolveFilename(`utimes '${r}'`,r,!1);this.utimesImpl(n,a)}utimesImpl(r,o){this.listings.has(r)&&(this.entries.has(r)||this.hydrateDirectory(r));let a=this.entries.get(r);if(a===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,a,0,tot(o),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(r,o){return this.mkdirSync(r,o)}mkdirSync(r,{mode:o=493,recursive:a=!1}={}){if(a)return this.mkdirpSync(r,{chmod:o});if(this.readOnly)throw sr.EROFS(`mkdir '${r}'`);let n=this.resolveFilename(`mkdir '${r}'`,r);if(this.entries.has(n)||this.listings.has(n))throw sr.EEXIST(`mkdir '${r}'`);this.hydrateDirectory(n),this.chmodSync(n,o)}async rmdirPromise(r,o){return this.rmdirSync(r,o)}rmdirSync(r,{recursive:o=!1}={}){if(this.readOnly)throw sr.EROFS(`rmdir '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rmdir '${r}'`,r),n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`rmdir '${r}'`);if(n.size>0)throw sr.ENOTEMPTY(`rmdir '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw sr.EINVAL(`rmdir '${r}'`);this.deleteEntry(r,u)}async rmPromise(r,o){return this.rmSync(r,o)}rmSync(r,{recursive:o=!1}={}){if(this.readOnly)throw sr.EROFS(`rm '${r}'`);if(o){this.removeSync(r);return}let a=this.resolveFilename(`rm '${r}'`,r),n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`rm '${r}'`);if(n.size>0)throw sr.ENOTEMPTY(`rm '${r}'`);let u=this.entries.get(a);if(typeof u>"u")throw sr.EINVAL(`rm '${r}'`);this.deleteEntry(r,u)}hydrateDirectory(r){let o=this.libzip.dir.add(this.zip,V.relative(Bt.root,r));if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(r),this.registerEntry(r,o),o}async linkPromise(r,o){return this.linkSync(r,o)}linkSync(r,o){throw sr.EOPNOTSUPP(`link '${r}' -> '${o}'`)}async symlinkPromise(r,o){return this.symlinkSync(r,o)}symlinkSync(r,o){if(this.readOnly)throw sr.EROFS(`symlink '${r}' -> '${o}'`);let a=this.resolveFilename(`symlink '${r}' -> '${o}'`,o);if(this.listings.has(a))throw sr.EISDIR(`symlink '${r}' -> '${o}'`);if(this.entries.has(a))throw sr.EEXIST(`symlink '${r}' -> '${o}'`);let n=this.setFileSource(a,r);if(this.registerEntry(a,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(ta.constants.S_IFLNK|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=await this.readFileBuffer(r,{asyncDecompress:!0});return o?a.toString(o):a}readFileSync(r,o){typeof o=="object"&&(o=o?o.encoding:void 0);let a=this.readFileBuffer(r);return o?a.toString(o):a}readFileBuffer(r,o={asyncDecompress:!1}){typeof r=="number"&&(r=this.fdToPath(r,"read"));let a=this.resolveFilename(`open '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`open '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(a))throw sr.ENOTDIR(`open '${r}'`);if(this.listings.has(a))throw sr.EISDIR("read");let n=this.entries.get(a);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,o)}async readdirPromise(r,o){return this.readdirSync(r,o)}readdirSync(r,o){let a=this.resolveFilename(`scandir '${r}'`,r);if(!this.entries.has(a)&&!this.listings.has(a))throw sr.ENOENT(`scandir '${r}'`);let n=this.listings.get(a);if(!n)throw sr.ENOTDIR(`scandir '${r}'`);if(o?.recursive)if(o?.withFileTypes){let u=Array.from(n,A=>Object.assign(this.statImpl("lstat",V.join(r,A)),{name:A,path:Bt.dot}));for(let A of u){if(!A.isDirectory())continue;let p=V.join(A.path,A.name),h=this.listings.get(V.join(a,p));for(let E of h)u.push(Object.assign(this.statImpl("lstat",V.join(r,p,E)),{name:E,path:p}))}return u}else{let u=[...n];for(let A of u){let p=this.listings.get(V.join(a,A));if(!(typeof p>"u"))for(let h of p)u.push(V.join(A,h))}return u}else return o?.withFileTypes?Array.from(n,u=>Object.assign(this.statImpl("lstat",V.join(r,u)),{name:u,path:void 0})):[...n]}async readlinkPromise(r){let o=this.prepareReadlink(r);return(await this.getFileSource(o,{asyncDecompress:!0})).toString()}readlinkSync(r){let o=this.prepareReadlink(r);return this.getFileSource(o).toString()}prepareReadlink(r){let o=this.resolveFilename(`readlink '${r}'`,r,!1);if(!this.entries.has(o)&&!this.listings.has(o))throw sr.ENOENT(`readlink '${r}'`);if(r[r.length-1]==="/"&&!this.listings.has(o))throw sr.ENOTDIR(`open '${r}'`);if(this.listings.has(o))throw sr.EINVAL(`readlink '${r}'`);let a=this.entries.get(o);if(a===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(a))throw sr.EINVAL(`readlink '${r}'`);return a}async truncatePromise(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw sr.EINVAL(`open '${r}'`);let u=await this.getFileSource(n,{asyncDecompress:!0}),A=Buffer.alloc(o,0);return u.copy(A),await this.writeFilePromise(r,A)}truncateSync(r,o=0){let a=this.resolveFilename(`open '${r}'`,r),n=this.entries.get(a);if(typeof n>"u")throw sr.EINVAL(`open '${r}'`);let u=this.getFileSource(n),A=Buffer.alloc(o,0);return u.copy(A),this.writeFileSync(r,A)}async ftruncatePromise(r,o){return this.truncatePromise(this.fdToPath(r,"ftruncate"),o)}ftruncateSync(r,o){return this.truncateSync(this.fdToPath(r,"ftruncateSync"),o)}watch(r,o,a){let n;switch(typeof o){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=o);break}if(!n)return{on:()=>{},close:()=>{}};let u=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(u)}}}watchFile(r,o,a){let n=V.resolve(Bt.root,r);return um(this,n,o,a)}unwatchFile(r,o){let a=V.resolve(Bt.root,r);return q0(this,a,o)}}});function bce(t,e,r=Buffer.alloc(0),o){let a=new Zi(r),n=w=>w===e||w.startsWith(`${e}/`)?w.slice(0,e.length):null,u=async(w,D)=>()=>a,A=(w,D)=>a,p={...t},h=new _n(p),E=new Gp({baseFs:h,getMountPoint:n,factoryPromise:u,factorySync:A,magicByte:21,maxAge:1/0,typeCheck:o?.typeCheck});return uw(xce.default,new Wp(E)),a}var xce,kce=It(()=>{St();xce=et(ve("fs"));qU()});var Qce=It(()=>{Dce();qU();kce()});var K1={};Vt(K1,{DEFAULT_COMPRESSION_LEVEL:()=>Pce,LibzipError:()=>fb,ZipFS:()=>Zi,ZipOpenFS:()=>iA,getArchivePart:()=>UU,getLibzipPromise:()=>not,getLibzipSync:()=>rot,makeEmptyArchive:()=>Ab,mountMemoryDrive:()=>bce});function rot(){return V1()}async function not(){return V1()}var Fce,sA=It(()=>{NU();Fce=et(Ice());vce();Qce();Cce(()=>{let t=(0,Fce.default)();return Bce(t)})});var J1,Rce=It(()=>{St();Gt();z1();J1=class extends ot{constructor(){super(...arguments);this.cwd=de.String("--cwd",process.cwd(),{description:"The directory to run the command in"});this.commandName=de.String();this.args=de.Proxy()}static{this.usage={description:"run a command using yarn's portable shell",details:` - This command will run a command using Yarn's portable shell. - - Make sure to escape glob patterns, redirections, and other features that might be expanded by your own shell. - - Note: To escape something from Yarn's shell, you might have to escape it twice, the first time from your own shell. - - Note: Don't use this command in Yarn scripts, as Yarn's shell is automatically used. - - For a list of features, visit: https://github.com/yarnpkg/berry/blob/master/packages/yarnpkg-shell/README.md. - `,examples:[["Run a simple command","$0 echo Hello"],["Run a command with a glob pattern","$0 echo '*.js'"],["Run a command with a redirection","$0 echo Hello World '>' hello.txt"],["Run a command with an escaped glob pattern (The double escape is needed in Unix shells)",`$0 echo '"*.js"'`],["Run a command with a variable (Double quotes are needed in Unix shells, to prevent them from expanding the variable)",'$0 "GREETING=Hello echo $GREETING World"']]}}async execute(){let r=this.args.length>0?`${this.commandName} ${this.args.join(" ")}`:this.commandName;return await ky(r,[],{cwd:Ae.toPortablePath(this.cwd),stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}}});var fl,Tce=It(()=>{fl=class extends Error{constructor(e){super(e),this.name="ShellError"}}});var gb={};Vt(gb,{fastGlobOptions:()=>Oce,isBraceExpansion:()=>jU,isGlobPattern:()=>iot,match:()=>sot,micromatchOptions:()=>hb});function iot(t){if(!pb.default.scan(t,hb).isGlob)return!1;try{pb.default.parse(t,hb)}catch{return!1}return!0}function sot(t,{cwd:e,baseFs:r}){return(0,Lce.default)(t,{...Oce,cwd:Ae.fromPortablePath(e),fs:aS(Nce.default,new Wp(r))})}function jU(t){return pb.default.scan(t,hb).isBrace}var Lce,Nce,pb,hb,Oce,Mce=It(()=>{St();Lce=et(ux()),Nce=et(ve("fs")),pb=et(Xo()),hb={strictBrackets:!0},Oce={onlyDirectories:!1,onlyFiles:!1}});function GU(){}function WU(){for(let t of Fg)t.kill()}function qce(t,e,r,o){return a=>{let n=a[0]instanceof oA.Transform?"pipe":a[0],u=a[1]instanceof oA.Transform?"pipe":a[1],A=a[2]instanceof oA.Transform?"pipe":a[2],p=(0,_ce.default)(t,e,{...o,stdio:[n,u,A]});return Fg.add(p),Fg.size===1&&(process.on("SIGINT",GU),process.on("SIGTERM",WU)),a[0]instanceof oA.Transform&&a[0].pipe(p.stdin),a[1]instanceof oA.Transform&&p.stdout.pipe(a[1],{end:!1}),a[2]instanceof oA.Transform&&p.stderr.pipe(a[2],{end:!1}),{stdin:p.stdin,promise:new Promise(h=>{p.on("error",E=>{switch(Fg.delete(p),Fg.size===0&&(process.off("SIGINT",GU),process.off("SIGTERM",WU)),E.code){case"ENOENT":a[2].write(`command not found: ${t} -`),h(127);break;case"EACCES":a[2].write(`permission denied: ${t} -`),h(128);break;default:a[2].write(`uncaught error: ${E.message} -`),h(1);break}}),p.on("close",E=>{Fg.delete(p),Fg.size===0&&(process.off("SIGINT",GU),process.off("SIGTERM",WU)),h(E!==null?E:129)})})}}}function jce(t){return e=>{let r=e[0]==="pipe"?new oA.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}function db(t,e){return VU.start(t,e)}function Uce(t,e=null){let r=new oA.PassThrough,o=new Hce.StringDecoder,a="";return r.on("data",n=>{let u=o.write(n),A;do if(A=u.indexOf(` -`),A!==-1){let p=a+u.substring(0,A);u=u.substring(A+1),a="",t(e!==null?`${e} ${p}`:p)}while(A!==-1);a+=u}),r.on("end",()=>{let n=o.end();n!==""&&t(e!==null?`${e} ${n}`:n)}),r}function Gce(t,{prefix:e}){return{stdout:Uce(r=>t.stdout.write(`${r} -`),t.stdout.isTTY?e:null),stderr:Uce(r=>t.stderr.write(`${r} -`),t.stderr.isTTY?e:null)}}var _ce,oA,Hce,Fg,Zl,YU,VU,KU=It(()=>{_ce=et(MT()),oA=ve("stream"),Hce=ve("string_decoder"),Fg=new Set;Zl=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},YU=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},VU=class t{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:o,stderr:a}){let n=new t(null,e);return n.stdin=r,n.stdout=o,n.stderr=a,n}pipeTo(e,r=1){let o=new t(this,e),a=new YU;return o.pipe=a,o.stdout=this.stdout,o.stderr=this.stderr,(r&1)===1?this.stdout=a:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)===2?this.stderr=a:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),o}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let o;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");o=this.stderr,e[2]=o.get();let a=this.implementation(e);return this.pipe&&this.pipe.attach(a.stdin),await a.promise.then(n=>(r.close(),o.close(),n))}async run(){let e=[];for(let o=this;o;o=o.ancestor)e.push(o.exec());return(await Promise.all(e))[0]}}});var e2={};Vt(e2,{EntryCommand:()=>J1,ShellError:()=>fl,execute:()=>ky,globUtils:()=>gb});function Wce(t,e,r){let o=new pl.PassThrough({autoDestroy:!0});switch(t){case 0:(e&1)===1&&r.stdin.pipe(o,{end:!1}),(e&2)===2&&r.stdin instanceof pl.Writable&&o.pipe(r.stdin,{end:!1});break;case 1:(e&1)===1&&r.stdout.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stdout,{end:!1});break;case 2:(e&1)===1&&r.stderr.pipe(o,{end:!1}),(e&2)===2&&o.pipe(r.stderr,{end:!1});break;default:throw new fl(`Bad file descriptor: "${t}"`)}return o}function yb(t,e={}){let r={...t,...e};return r.environment={...t.environment,...e.environment},r.variables={...t.variables,...e.variables},r}async function aot(t,e,r){let o=[],a=new pl.PassThrough;return a.on("data",n=>o.push(n)),await Eb(t,e,yb(r,{stdout:a})),Buffer.concat(o).toString().replace(/[\r\n]+$/,"")}async function Yce(t,e,r){let o=t.map(async n=>{let u=await Rg(n.args,e,r);return{name:n.name,value:u.join(" ")}});return(await Promise.all(o)).reduce((n,u)=>(n[u.name]=u.value,n),{})}function mb(t){return t.match(/[^ \r\n\t]+/g)||[]}async function Zce(t,e,r,o,a=o){switch(t.name){case"$":o(String(process.pid));break;case"#":o(String(e.args.length));break;case"@":if(t.quoted)for(let n of e.args)a(n);else for(let n of e.args){let u=mb(n);for(let A=0;A=0&&n"u"&&(t.defaultValue?u=(await Rg(t.defaultValue,e,r)).join(" "):t.alternativeValue&&(u="")),typeof u>"u")throw A?new fl(`Unbound argument #${n}`):new fl(`Unbound variable "${t.name}"`);if(t.quoted)o(u);else{let p=mb(u);for(let E=0;Eo.push(n));let a=Number(o.join(" "));return Number.isNaN(a)?X1({type:"variable",name:o.join(" ")},e,r):X1({type:"number",value:a},e,r)}else return lot[t.type](await X1(t.left,e,r),await X1(t.right,e,r))}async function Rg(t,e,r){let o=new Map,a=[],n=[],u=E=>{n.push(E)},A=()=>{n.length>0&&a.push(n.join("")),n=[]},p=E=>{u(E),A()},h=(E,w,D)=>{let b=JSON.stringify({type:E,fd:w}),C=o.get(b);typeof C>"u"&&o.set(b,C=[]),C.push(D)};for(let E of t){let w=!1;switch(E.type){case"redirection":{let D=await Rg(E.args,e,r);for(let b of D)h(E.subtype,E.fd,b)}break;case"argument":for(let D of E.segments)switch(D.type){case"text":u(D.text);break;case"glob":u(D.pattern),w=!0;break;case"shell":{let b=await aot(D.shell,e,r);if(D.quoted)u(b);else{let C=mb(b);for(let T=0;T"u")throw new Error("Assertion failed: Expected a glob pattern to have been set");let b=await e.glob.match(D,{cwd:r.cwd,baseFs:e.baseFs});if(b.length===0){let C=jU(D)?". Note: Brace expansion of arbitrary strings isn't currently supported. For more details, please read this issue: https://github.com/yarnpkg/berry/issues/22":"";throw new fl(`No matches found: "${D}"${C}`)}for(let C of b.sort())p(C)}}if(o.size>0){let E=[];for(let[w,D]of o.entries())E.splice(E.length,0,w,String(D.length),...D);a.splice(0,0,"__ysh_set_redirects",...E,"--")}return a}function Z1(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let o=Ae.fromPortablePath(r.cwd),a=r.environment;typeof a.PWD<"u"&&(a={...a,PWD:o});let[n,...u]=t;if(n==="command")return qce(u[0],u.slice(1),e,{cwd:o,env:a});let A=e.builtins.get(n);if(typeof A>"u")throw new Error(`Assertion failed: A builtin should exist for "${n}"`);return jce(async({stdin:p,stdout:h,stderr:E})=>{let{stdin:w,stdout:D,stderr:b}=r;r.stdin=p,r.stdout=h,r.stderr=E;try{return await A(u,e,r)}finally{r.stdin=w,r.stdout=D,r.stderr=b}})}function cot(t,e,r){return o=>{let a=new pl.PassThrough,n=Eb(t,e,yb(r,{stdin:a}));return{stdin:a,promise:n}}}function uot(t,e,r){return o=>{let a=new pl.PassThrough,n=Eb(t,e,r);return{stdin:a,promise:n}}}function Vce(t,e,r,o){if(e.length===0)return t;{let a;do a=String(Math.random());while(Object.hasOwn(o.procedures,a));return o.procedures={...o.procedures},o.procedures[a]=t,Z1([...e,"__ysh_run_procedure",a],r,o)}}async function Kce(t,e,r){let o=t,a=null,n=null;for(;o;){let u=o.then?{...r}:r,A;switch(o.type){case"command":{let p=await Rg(o.args,e,r),h=await Yce(o.envs,e,r);A=o.envs.length?Z1(p,e,yb(u,{environment:h})):Z1(p,e,u)}break;case"subshell":{let p=await Rg(o.args,e,r),h=cot(o.subshell,e,u);A=Vce(h,p,e,u)}break;case"group":{let p=await Rg(o.args,e,r),h=uot(o.group,e,u);A=Vce(h,p,e,u)}break;case"envs":{let p=await Yce(o.envs,e,r);u.environment={...u.environment,...p},A=Z1(["true"],e,u)}break}if(typeof A>"u")throw new Error("Assertion failed: An action should have been generated");if(a===null)n=db(A,{stdin:new Zl(u.stdin),stdout:new Zl(u.stdout),stderr:new Zl(u.stderr)});else{if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(a){case"|":n=n.pipeTo(A,1);break;case"|&":n=n.pipeTo(A,3);break}}o.then?(a=o.then.type,o=o.then.chain):o=null}if(n===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await n.run()}async function Aot(t,e,r,{background:o=!1}={}){function a(n){let u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[n%u.length];return Jce.default.hex(A)}if(o){let n=r.nextBackgroundJobIndex++,u=a(n),A=`[${n}]`,p=u(A),{stdout:h,stderr:E}=Gce(r,{prefix:p});return r.backgroundJobs.push(Kce(t,e,yb(r,{stdout:h,stderr:E})).catch(w=>E.write(`${w.message} -`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${p}, '${u(mm(t))}' has ended -`)})),0}return await Kce(t,e,r)}async function fot(t,e,r,{background:o=!1}={}){let a,n=A=>{a=A,r.variables["?"]=String(A)},u=async A=>{try{return await Aot(A.chain,e,r,{background:o&&typeof A.then>"u"})}catch(p){if(!(p instanceof fl))throw p;return r.stderr.write(`${p.message} -`),1}};for(n(await u(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":a===0&&n(await u(t.then.line));break;case"||":a!==0&&n(await u(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return a}async function Eb(t,e,r){let o=r.backgroundJobs;r.backgroundJobs=[];let a=0;for(let{command:n,type:u}of t){if(a=await fot(n,e,r,{background:u==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(a)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=o,a}function $ce(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>$1(e))||"alternativeValue"in t&&!!t.alternativeValue&&t.alternativeValue.some(e=>$1(e));case"arithmetic":return JU(t.arithmetic);case"shell":return zU(t.shell);default:return!1}}function $1(t){switch(t.type){case"redirection":return t.args.some(e=>$1(e));case"argument":return t.segments.some(e=>$ce(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function JU(t){switch(t.type){case"variable":return $ce(t);case"number":return!1;default:return JU(t.left)||JU(t.right)}}function zU(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let o;switch(r.type){case"subshell":o=zU(r.subshell);break;case"command":o=r.envs.some(a=>a.args.some(n=>$1(n)))||r.args.some(a=>$1(a));break}if(o)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function ky(t,e=[],{baseFs:r=new _n,builtins:o={},cwd:a=Ae.toPortablePath(process.cwd()),env:n=process.env,stdin:u=process.stdin,stdout:A=process.stdout,stderr:p=process.stderr,variables:h={},glob:E=gb}={}){let w={};for(let[C,T]of Object.entries(n))typeof T<"u"&&(w[C]=T);let D=new Map(oot);for(let[C,T]of Object.entries(o))D.set(C,T);u===null&&(u=new pl.PassThrough,u.end());let b=uS(t,E);if(!zU(b)&&b.length>0&&e.length>0){let{command:C}=b[b.length-1];for(;C.then;)C=C.then.line;let T=C.chain;for(;T.then;)T=T.then.chain;T.type==="command"&&(T.args=T.args.concat(e.map(N=>({type:"argument",segments:[{type:"text",text:N}]}))))}return await Eb(b,{args:e,baseFs:r,builtins:D,initialStdin:u,initialStdout:A,initialStderr:p,glob:E},{cwd:a,environment:w,exitCode:null,procedures:{},stdin:u,stdout:A,stderr:p,variables:Object.assign({},h,{"?":0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var Jce,zce,pl,Xce,oot,lot,z1=It(()=>{St();Ol();Jce=et(sN()),zce=ve("os"),pl=ve("stream"),Xce=ve("timers/promises");Rce();Tce();Mce();KU();KU();oot=new Map([["cd",async([t=(0,zce.homedir)(),...e],r,o)=>{let a=V.resolve(o.cwd,Ae.toPortablePath(t));if(!(await r.baseFs.statPromise(a).catch(u=>{throw u.code==="ENOENT"?new fl(`cd: no such file or directory: ${t}`):u})).isDirectory())throw new fl(`cd: not a directory: ${t}`);return o.cwd=a,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${Ae.fromPortablePath(r.cwd)} -`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,o)=>o.exitCode=parseInt(t??o.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} -`),0)],["sleep",async([t],e,r)=>{if(typeof t>"u")throw new fl("sleep: missing operand");let o=Number(t);if(Number.isNaN(o))throw new fl(`sleep: invalid time interval '${t}'`);return await(0,Xce.setTimeout)(1e3*o,0)}],["unset",async(t,e,r)=>{for(let o of t)delete r.environment[o],delete r.variables[o];return 0}],["__ysh_run_procedure",async(t,e,r)=>{let o=r.procedures[t[0]];return await db(o,{stdin:new Zl(r.stdin),stdout:new Zl(r.stdout),stderr:new Zl(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let o=r.stdin,a=r.stdout,n=r.stderr,u=[],A=[],p=[],h=0;for(;t[h]!=="--";){let w=t[h++],{type:D,fd:b}=JSON.parse(w),C=J=>{switch(b){case null:case 0:u.push(J);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},T=J=>{switch(b){case null:case 1:A.push(J);break;case 2:p.push(J);break;default:throw new Error(`Unsupported file descriptor: "${b}"`)}},N=Number(t[h++]),U=h+N;for(let J=h;Je.baseFs.createReadStream(V.resolve(r.cwd,Ae.toPortablePath(t[J]))));break;case"<<<":C(()=>{let te=new pl.PassThrough;return process.nextTick(()=>{te.write(`${t[J]} -`),te.end()}),te});break;case"<&":C(()=>Wce(Number(t[J]),1,r));break;case">":case">>":{let te=V.resolve(r.cwd,Ae.toPortablePath(t[J]));T(te==="/dev/null"?new pl.Writable({autoDestroy:!0,emitClose:!0,write(le,ce,ue){setImmediate(ue)}}):e.baseFs.createWriteStream(te,D===">>"?{flags:"a"}:void 0))}break;case">&":T(Wce(Number(t[J]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${D}"`)}}if(u.length>0){let w=new pl.PassThrough;o=w;let D=b=>{if(b===u.length)w.end();else{let C=u[b]();C.pipe(w,{end:!1}),C.on("end",()=>{D(b+1)})}};D(0)}if(A.length>0){let w=new pl.PassThrough;a=w;for(let D of A)w.pipe(D)}if(p.length>0){let w=new pl.PassThrough;n=w;for(let D of p)w.pipe(D)}let E=await db(Z1(t.slice(h+1),e,r),{stdin:new Zl(o),stdout:new Zl(a),stderr:new Zl(n)}).run();return await Promise.all(A.map(w=>new Promise((D,b)=>{w.on("error",C=>{b(C)}),w.on("close",()=>{D()}),w.end()}))),await Promise.all(p.map(w=>new Promise((D,b)=>{w.on("error",C=>{b(C)}),w.on("close",()=>{D()}),w.end()}))),E}]]);lot={addition:(t,e)=>t+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)}});var Cb=_((MMt,eue)=>{function pot(t,e){for(var r=-1,o=t==null?0:t.length,a=Array(o);++r{var tue=dg(),hot=Cb(),got=jl(),dot=fy(),mot=1/0,rue=tue?tue.prototype:void 0,nue=rue?rue.toString:void 0;function iue(t){if(typeof t=="string")return t;if(got(t))return hot(t,iue)+"";if(dot(t))return nue?nue.call(t):"";var e=t+"";return e=="0"&&1/t==-mot?"-0":e}sue.exports=iue});var t2=_((_Mt,aue)=>{var yot=oue();function Eot(t){return t==null?"":yot(t)}aue.exports=Eot});var XU=_((HMt,lue)=>{function Cot(t,e,r){var o=-1,a=t.length;e<0&&(e=-e>a?0:a+e),r=r>a?a:r,r<0&&(r+=a),a=e>r?0:r-e>>>0,e>>>=0;for(var n=Array(a);++o{var Iot=XU();function wot(t,e,r){var o=t.length;return r=r===void 0?o:r,!e&&r>=o?t:Iot(t,e,r)}cue.exports=wot});var ZU=_((jMt,Aue)=>{var Bot="\\ud800-\\udfff",vot="\\u0300-\\u036f",Dot="\\ufe20-\\ufe2f",Sot="\\u20d0-\\u20ff",Pot=vot+Dot+Sot,xot="\\ufe0e\\ufe0f",bot="\\u200d",kot=RegExp("["+bot+Bot+Pot+xot+"]");function Qot(t){return kot.test(t)}Aue.exports=Qot});var pue=_((GMt,fue)=>{function Fot(t){return t.split("")}fue.exports=Fot});var Iue=_((WMt,Cue)=>{var hue="\\ud800-\\udfff",Rot="\\u0300-\\u036f",Tot="\\ufe20-\\ufe2f",Lot="\\u20d0-\\u20ff",Not=Rot+Tot+Lot,Oot="\\ufe0e\\ufe0f",Mot="["+hue+"]",$U="["+Not+"]",e3="\\ud83c[\\udffb-\\udfff]",Uot="(?:"+$U+"|"+e3+")",gue="[^"+hue+"]",due="(?:\\ud83c[\\udde6-\\uddff]){2}",mue="[\\ud800-\\udbff][\\udc00-\\udfff]",_ot="\\u200d",yue=Uot+"?",Eue="["+Oot+"]?",Hot="(?:"+_ot+"(?:"+[gue,due,mue].join("|")+")"+Eue+yue+")*",qot=Eue+yue+Hot,jot="(?:"+[gue+$U+"?",$U,due,mue,Mot].join("|")+")",Got=RegExp(e3+"(?="+e3+")|"+jot+qot,"g");function Wot(t){return t.match(Got)||[]}Cue.exports=Wot});var Bue=_((YMt,wue)=>{var Yot=pue(),Vot=ZU(),Kot=Iue();function Jot(t){return Vot(t)?Kot(t):Yot(t)}wue.exports=Jot});var Due=_((VMt,vue)=>{var zot=uue(),Xot=ZU(),Zot=Bue(),$ot=t2();function eat(t){return function(e){e=$ot(e);var r=Xot(e)?Zot(e):void 0,o=r?r[0]:e.charAt(0),a=r?zot(r,1).join(""):e.slice(1);return o[t]()+a}}vue.exports=eat});var Pue=_((KMt,Sue)=>{var tat=Due(),rat=tat("toUpperCase");Sue.exports=rat});var t3=_((JMt,xue)=>{var nat=t2(),iat=Pue();function sat(t){return iat(nat(t).toLowerCase())}xue.exports=sat});var bue=_((zMt,Ib)=>{function oat(){var t=0,e=1,r=2,o=3,a=4,n=5,u=6,A=7,p=8,h=9,E=10,w=11,D=12,b=13,C=14,T=15,N=16,U=17,J=0,te=1,le=2,ce=3,ue=4;function Ie(g,me){return 55296<=g.charCodeAt(me)&&g.charCodeAt(me)<=56319&&56320<=g.charCodeAt(me+1)&&g.charCodeAt(me+1)<=57343}function he(g,me){me===void 0&&(me=0);var Ce=g.charCodeAt(me);if(55296<=Ce&&Ce<=56319&&me=1){var fe=g.charCodeAt(me-1),ie=Ce;return 55296<=fe&&fe<=56319?(fe-55296)*1024+(ie-56320)+65536:ie}return Ce}function De(g,me,Ce){var fe=[g].concat(me).concat([Ce]),ie=fe[fe.length-2],Z=Ce,Se=fe.lastIndexOf(C);if(Se>1&&fe.slice(1,Se).every(function(q){return q==o})&&[o,b,U].indexOf(g)==-1)return le;var Re=fe.lastIndexOf(a);if(Re>0&&fe.slice(1,Re).every(function(q){return q==a})&&[D,a].indexOf(ie)==-1)return fe.filter(function(q){return q==a}).length%2==1?ce:ue;if(ie==t&&Z==e)return J;if(ie==r||ie==t||ie==e)return Z==C&&me.every(function(q){return q==o})?le:te;if(Z==r||Z==t||Z==e)return te;if(ie==u&&(Z==u||Z==A||Z==h||Z==E))return J;if((ie==h||ie==A)&&(Z==A||Z==p))return J;if((ie==E||ie==p)&&Z==p)return J;if(Z==o||Z==T)return J;if(Z==n)return J;if(ie==D)return J;var ht=fe.indexOf(o)!=-1?fe.lastIndexOf(o)-1:fe.length-2;return[b,U].indexOf(fe[ht])!=-1&&fe.slice(ht+1,-1).every(function(q){return q==o})&&Z==C||ie==T&&[N,U].indexOf(Z)!=-1?J:me.indexOf(a)!=-1?le:ie==a&&Z==a?J:te}this.nextBreak=function(g,me){if(me===void 0&&(me=0),me<0)return 0;if(me>=g.length-1)return g.length;for(var Ce=Ee(he(g,me)),fe=[],ie=me+1;ie{var aat=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,wb;function lat(){if(wb)return wb;if(typeof Intl.Segmenter<"u"){let t=new Intl.Segmenter("en",{granularity:"grapheme"});return wb=e=>Array.from(t.segment(e),({segment:r})=>r)}else{let t=bue(),e=new t;return wb=r=>e.splitGraphemes(r)}}kue.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let o=r-e,a="",n=0,u=0;for(;t.length>0;){let A=t.match(aat)||[t,t,void 0],p=lat()(A[1]),h=Math.min(e-n,p.length);p=p.slice(h);let E=Math.min(o-u,p.length);a+=p.slice(0,E).join(""),n+=h,u+=E,typeof A[2]<"u"&&(a+=A[2]),t=t.slice(A[0].length)}return a}});var nn,r2=It(()=>{nn=process.env.YARN_IS_TEST_ENV?"0.0.0":"4.7.0"});function Oue(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let a=Ju(t===null?0:t);return!r&&t===null?Ut(e,a,"grey"):a}function r3(t,{configuration:e,json:r}){let o=Oue(t,{configuration:e,json:r});if(!o||t===null||t===0)return o;let a=vr[t],n=`https://yarnpkg.com/advanced/error-codes#${o}---${a}`.toLowerCase();return ty(e,o,n)}async function Qy({configuration:t,stdout:e,forceError:r},o){let a=await Lt.start({configuration:t,stdout:e,includeFooter:!1},async n=>{let u=!1,A=!1;for(let p of o)typeof p.option<"u"&&(p.error||r?(A=!0,n.reportError(50,p.message)):(u=!0,n.reportWarning(50,p.message)),p.callback?.());u&&!A&&n.reportSeparator()});return a.hasErrors()?a.exitCode():null}var Lue,Bb,cat,Fue,Rue,hh,Nue,Tue,uat,Aat,vb,fat,Lt,n2=It(()=>{Lue=et(Que()),Bb=et(sg());GS();Kl();r2();Wl();cat="\xB7",Fue=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],Rue=80,hh=Bb.default.GITHUB_ACTIONS?{start:t=>`::group::${t} -`,end:t=>`::endgroup:: -`}:Bb.default.TRAVIS?{start:t=>`travis_fold:start:${t} -`,end:t=>`travis_fold:end:${t} -`}:Bb.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r\x1B[0K${t} -`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r\x1B[0K`}:null,Nue=hh!==null,Tue=new Date,uat=["iTerm.app","Apple_Terminal","WarpTerminal","vscode"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,Aat=t=>t,vb=Aat({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),fat=uat&&Object.keys(vb).find(t=>{let e=vb[t];return!(e.date&&(e.date[0]!==Tue.getDate()||e.date[1]!==Tue.getMonth()+1))})||"default";Lt=class extends Ws{constructor({configuration:r,stdout:o,json:a=!1,forceSectionAlignment:n=!1,includeNames:u=!0,includePrefix:A=!0,includeFooter:p=!0,includeLogs:h=!a,includeInfos:E=h,includeWarnings:w=h}){super();this.uncommitted=new Set;this.warningCount=0;this.errorCount=0;this.timerFooter=[];this.startTime=Date.now();this.indent=0;this.level=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.progressStyle=null;this.progressMaxScaledSize=null;if(g1(this,{configuration:r}),this.configuration=r,this.forceSectionAlignment=n,this.includeNames=u,this.includePrefix=A,this.includeFooter=p,this.includeInfos=E,this.includeWarnings=w,this.json=a,this.stdout=o,r.get("enableProgressBars")&&!a&&o.isTTY&&o.columns>22){let D=r.get("progressBarStyle")||fat;if(!Object.hasOwn(vb,D))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=vb[D];let b=Math.min(this.getRecommendedLength(),80);this.progressMaxScaledSize=Math.floor(this.progressStyle.size*b/80)}}static async start(r,o){let a=new this(r),n=process.emitWarning;process.emitWarning=(u,A)=>{if(typeof u!="string"){let h=u;u=h.message,A=A??h.name}let p=typeof A<"u"?`${A}: ${u}`:u;a.reportWarning(0,p)},r.includeVersion&&a.reportInfo(0,Cg(r.configuration,`Yarn ${nn}`,2));try{await o(a)}catch(u){a.reportExceptionOnce(u)}finally{await a.finalize(),process.emitWarning=n}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}getRecommendedLength(){let o=this.progressStyle!==null?this.stdout.columns-1:super.getRecommendedLength();return Math.max(40,o-12-this.indent*2)}startSectionSync({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}async startSectionPromise({reportHeader:r,reportFooter:o,skipIfEmpty:a},n){let u={committed:!1,action:()=>{r?.()}};a?this.uncommitted.add(u):(u.action(),u.committed=!0);let A=Date.now();try{return await n()}catch(p){throw this.reportExceptionOnce(p),p}finally{let p=Date.now();this.uncommitted.delete(u),u.committed&&o?.(p-A)}}startTimerImpl(r,o,a){return{cb:typeof o=="function"?o:a,reportHeader:()=>{this.level+=1,this.reportInfo(null,`\u250C ${r}`),this.indent+=1,hh!==null&&!this.json&&this.includeInfos&&this.stdout.write(hh.start(r))},reportFooter:A=>{if(this.indent-=1,hh!==null&&!this.json&&this.includeInfos){this.stdout.write(hh.end(r));for(let p of this.timerFooter)p()}this.configuration.get("enableTimers")&&A>200?this.reportInfo(null,`\u2514 Completed in ${Ut(this.configuration,A,Ct.DURATION)}`):this.reportInfo(null,"\u2514 Completed"),this.level-=1},skipIfEmpty:(typeof o=="function"?{}:o).skipIfEmpty}}startTimerSync(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionSync(u,n)}async startTimerPromise(r,o,a){let{cb:n,...u}=this.startTimerImpl(r,o,a);return this.startSectionPromise(u,n)}reportSeparator(){this.indent===0?this.writeLine(""):this.reportInfo(null,"")}reportInfo(r,o){if(!this.includeInfos)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"",u=`${this.formatPrefix(n,"blueBright")}${o}`;this.json?this.reportJson({type:"info",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(u)}reportWarning(r,o){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"warning",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"yellowBright")}${o}`)}reportError(r,o){this.errorCount+=1,this.timerFooter.push(()=>this.reportErrorImpl(r,o)),this.reportErrorImpl(r,o)}reportErrorImpl(r,o){this.commit();let a=this.formatNameWithHyperlink(r),n=a?`${a}: `:"";this.json?this.reportJson({type:"error",name:r,displayName:this.formatName(r),indent:this.formatIndent(),data:o}):this.writeLine(`${this.formatPrefix(n,"redBright")}${o}`,{truncate:!1})}reportFold(r,o){if(!hh)return;let a=`${hh.start(r)}${o}${hh.end(r)}`;this.timerFooter.push(()=>this.stdout.write(a))}reportProgress(r){if(this.progressStyle===null)return{...Promise.resolve(),stop:()=>{}};if(r.hasProgress&&r.hasTitle)throw new Error("Unimplemented: Progress bars can't have both progress and titles.");let o=!1,a=Promise.resolve().then(async()=>{let u={progress:r.hasProgress?0:void 0,title:r.hasTitle?"":void 0};this.progress.set(r,{definition:u,lastScaledSize:r.hasProgress?-1:void 0,lastTitle:void 0}),this.refreshProgress({delta:-1});for await(let{progress:A,title:p}of r)o||u.progress===A&&u.title===p||(u.progress=A,u.title=p,this.refreshProgress());n()}),n=()=>{o||(o=!0,this.progress.delete(r),this.refreshProgress({delta:1}))};return{...a,stop:n}}reportJson(r){this.json&&this.writeLine(`${JSON.stringify(r)}`)}async finalize(){if(!this.includeFooter)return;let r="";this.errorCount>0?r="Failed with errors":this.warningCount>0?r="Done with warnings":r="Done";let o=Ut(this.configuration,Date.now()-this.startTime,Ct.DURATION),a=this.configuration.get("enableTimers")?`${r} in ${o}`:r;this.errorCount>0?this.reportError(0,a):this.warningCount>0?this.reportWarning(0,a):this.reportInfo(0,a)}writeLine(r,{truncate:o}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(r,{truncate:o})} -`),this.writeProgress()}writeLines(r,{truncate:o}={}){this.clearProgress({delta:r.length});for(let a of r)this.stdout.write(`${this.truncate(a,{truncate:o})} -`);this.writeProgress()}commit(){let r=this.uncommitted;this.uncommitted=new Set;for(let o of r)o.committed=!0,o.action()}clearProgress({delta:r=0,clear:o=!1}){this.progressStyle!==null&&this.progress.size+r>0&&(this.stdout.write(`\x1B[${this.progress.size+r}A`),(r>0||o)&&this.stdout.write("\x1B[0J"))}writeProgress(){if(this.progressStyle===null||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let r=Date.now();r-this.progressTime>Rue&&(this.progressFrame=(this.progressFrame+1)%Fue.length,this.progressTime=r);let o=Fue[this.progressFrame];for(let a of this.progress.values()){let n="";if(typeof a.lastScaledSize<"u"){let h=this.progressStyle.chars[0].repeat(a.lastScaledSize),E=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-a.lastScaledSize);n=` ${h}${E}`}let u=this.formatName(null),A=u?`${u}: `:"",p=a.definition.title?` ${a.definition.title}`:"";this.stdout.write(`${Ut(this.configuration,"\u27A4","blueBright")} ${A}${o}${n}${p} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress({force:!0})},Rue)}refreshProgress({delta:r=0,force:o=!1}={}){let a=!1,n=!1;if(o||this.progress.size===0)a=!0;else for(let u of this.progress.values()){let A=typeof u.definition.progress<"u"?Math.trunc(this.progressMaxScaledSize*u.definition.progress):void 0,p=u.lastScaledSize;u.lastScaledSize=A;let h=u.lastTitle;if(u.lastTitle=u.definition.title,A!==p||(n=h!==u.definition.title)){a=!0;break}}a&&(this.clearProgress({delta:r,clear:n}),this.writeProgress())}truncate(r,{truncate:o}={}){return this.progressStyle===null&&(o=!1),typeof o>"u"&&(o=this.configuration.get("preferTruncatedLines")),o&&(r=(0,Lue.default)(r,0,this.stdout.columns-1)),r}formatName(r){return this.includeNames?Oue(r,{configuration:this.configuration,json:this.json}):""}formatPrefix(r,o){return this.includePrefix?`${Ut(this.configuration,"\u27A4",o)} ${r}${this.formatIndent()}`:""}formatNameWithHyperlink(r){return this.includeNames?r3(r,{configuration:this.configuration,json:this.json}):""}formatIndent(){return this.level>0||!this.forceSectionAlignment?"\u2502 ".repeat(this.indent):`${cat} `}}});var hn={};Vt(hn,{PackageManager:()=>_ue,detectPackageManager:()=>Hue,executePackageAccessibleBinary:()=>Yue,executePackageScript:()=>Db,executePackageShellcode:()=>n3,executeWorkspaceAccessibleBinary:()=>Eat,executeWorkspaceLifecycleScript:()=>Gue,executeWorkspaceScript:()=>jue,getPackageAccessibleBinaries:()=>Sb,getWorkspaceAccessibleBinaries:()=>Wue,hasPackageScript:()=>dat,hasWorkspaceScript:()=>i3,isNodeScript:()=>s3,makeScriptEnv:()=>i2,maybeExecuteWorkspaceLifecycleScript:()=>yat,prepareExternalProject:()=>gat});async function gh(t,e,r,o=[]){if(process.platform==="win32"){let a=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${o.map(n=>`"${n.replace('"','""')}"`).join(" ")} %*`;await ae.writeFilePromise(V.format({dir:t,name:e,ext:".cmd"}),a)}await ae.writeFilePromise(V.join(t,e),`#!/bin/sh -exec "${r}" ${o.map(a=>`'${a.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function Hue(t){let e=await _t.tryFind(t);if(e?.packageManager){let o=dx(e.packageManager);if(o?.name){let a=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[n]=o.reference.split(".");switch(o.name){case"yarn":return{packageManagerField:!0,packageManager:Number(n)===1?"Yarn Classic":"Yarn",reason:a};case"npm":return{packageManagerField:!0,packageManager:"npm",reason:a};case"pnpm":return{packageManagerField:!0,packageManager:"pnpm",reason:a}}}}let r;try{r=await ae.readFilePromise(V.join(t,mr.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:"Yarn",reason:'"__metadata" key found in yarn.lock'}:{packageManager:"Yarn Classic",reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:ae.existsSync(V.join(t,"package-lock.json"))?{packageManager:"npm",reason:`found npm's "package-lock.json" lockfile`}:ae.existsSync(V.join(t,"pnpm-lock.yaml"))?{packageManager:"pnpm",reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function i2({project:t,locator:e,binFolder:r,ignoreCorepack:o,lifecycleScript:a,baseEnv:n=t?.configuration.env??process.env}){let u={};for(let[E,w]of Object.entries(n))typeof w<"u"&&(u[E.toLowerCase()!=="path"?E:"PATH"]=w);let A=Ae.fromPortablePath(r);u.BERRY_BIN_FOLDER=Ae.fromPortablePath(A);let p=process.env.COREPACK_ROOT&&!o?Ae.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([gh(r,"node",process.execPath),...nn!==null?[gh(r,"run",process.execPath,[p,"run"]),gh(r,"yarn",process.execPath,[p]),gh(r,"yarnpkg",process.execPath,[p]),gh(r,"node-gyp",process.execPath,[p,"run","--top-level","node-gyp"])]:[]]),t&&(u.INIT_CWD=Ae.fromPortablePath(t.configuration.startingCwd),u.PROJECT_CWD=Ae.fromPortablePath(t.cwd)),u.PATH=u.PATH?`${A}${Ae.delimiter}${u.PATH}`:`${A}`,u.npm_execpath=`${A}${Ae.sep}yarn`,u.npm_node_execpath=`${A}${Ae.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let E=t.tryWorkspaceByLocator(e),w=E?E.manifest.version??"":t.storedPackages.get(e.locatorHash).version??"";u.npm_package_name=rn(e),u.npm_package_version=w;let D;if(E)D=E.cwd;else{let b=t.storedPackages.get(e.locatorHash);if(!b)throw new Error(`Package for ${jr(t.configuration,e)} not found in the project`);let C=t.configuration.getLinkers(),T={project:t,report:new Lt({stdout:new dh.PassThrough,configuration:t.configuration})},N=C.find(U=>U.supportsPackage(b,T));if(!N)throw new Error(`The package ${jr(t.configuration,b)} isn't supported by any of the available linkers`);D=await N.findPackageLocation(b,T)}u.npm_package_json=Ae.fromPortablePath(V.join(D,mr.manifest))}let h=nn!==null?`yarn/${nn}`:`yarn/${vf("@yarnpkg/core").version}-core`;return u.npm_config_user_agent=`${h} npm/? node/${process.version} ${process.platform} ${process.arch}`,a&&(u.npm_lifecycle_event=a),t&&await t.configuration.triggerHook(E=>E.setupScriptEnvironment,t,u,async(E,w,D)=>await gh(r,E,w,D)),u}async function gat(t,e,{configuration:r,report:o,workspace:a=null,locator:n=null}){await hat(async()=>{await ae.mktempPromise(async u=>{let A=V.join(u,"pack.log"),p=null,{stdout:h,stderr:E}=r.getSubprocessStreams(A,{prefix:Ae.fromPortablePath(t),report:o}),w=n&&Jc(n)?I1(n):n,D=w?Qa(w):"an external project";h.write(`Packing ${D} from sources -`);let b=await Hue(t),C;b!==null?(h.write(`Using ${b.packageManager} for bootstrap. Reason: ${b.reason} - -`),C=b.packageManager):(h.write(`No package manager configuration detected; defaulting to Yarn - -`),C="Yarn");let T=C==="Yarn"&&!b?.packageManagerField;await ae.mktempPromise(async N=>{let U=await i2({binFolder:N,ignoreCorepack:T,baseEnv:{...process.env,COREPACK_ENABLE_AUTO_PIN:"0"}}),te=new Map([["Yarn Classic",async()=>{let ce=a!==null?["workspace",a]:[],ue=V.join(t,mr.manifest),Ie=await ae.readFilePromise(ue),he=await Xc(process.execPath,[process.argv[1],"set","version","classic","--only-if-needed","--yarn-path"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(he.code!==0)return he.code;await ae.writeFilePromise(ue,Ie),await ae.appendFilePromise(V.join(t,".npmignore"),`/.yarn -`),h.write(` -`),delete U.NODE_ENV;let De=await Xc("yarn",["install"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(De.code!==0)return De.code;h.write(` -`);let Ee=await Xc("yarn",[...ce,"pack","--filename",Ae.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ee.code!==0?Ee.code:0}],["Yarn",async()=>{let ce=a!==null?["workspace",a]:[];U.YARN_ENABLE_INLINE_BUILDS="1";let ue=V.join(t,mr.lockfile);await ae.existsPromise(ue)||await ae.writeFilePromise(ue,"");let Ie=await Xc("yarn",[...ce,"pack","--install-if-needed","--filename",Ae.fromPortablePath(e)],{cwd:t,env:U,stdin:p,stdout:h,stderr:E});return Ie.code!==0?Ie.code:0}],["npm",async()=>{if(a!==null){let me=new dh.PassThrough,Ce=Xm(me);me.pipe(h,{end:!1});let fe=await Xc("npm",["--version"],{cwd:t,env:U,stdin:p,stdout:me,stderr:E,end:0});if(me.end(),fe.code!==0)return h.end(),E.end(),fe.code;let ie=(await Ce).toString().trim();if(!nA(ie,">=7.x")){let Z=rA(null,"npm"),Se=kn(Z,ie),Re=kn(Z,">=7.x");throw new Error(`Workspaces aren't supported by ${Jn(r,Se)}; please upgrade to ${Jn(r,Re)} (npm has been detected as the primary package manager for ${Ut(r,t,Ct.PATH)})`)}}let ce=a!==null?["--workspace",a]:[];delete U.npm_config_user_agent,delete U.npm_config_production,delete U.NPM_CONFIG_PRODUCTION,delete U.NODE_ENV;let ue=await Xc("npm",["install","--legacy-peer-deps"],{cwd:t,env:U,stdin:p,stdout:h,stderr:E,end:1});if(ue.code!==0)return ue.code;let Ie=new dh.PassThrough,he=Xm(Ie);Ie.pipe(h);let De=await Xc("npm",["pack","--silent",...ce],{cwd:t,env:U,stdin:p,stdout:Ie,stderr:E});if(De.code!==0)return De.code;let Ee=(await he).toString().trim().replace(/^.*\n/s,""),g=V.resolve(t,Ae.toPortablePath(Ee));return await ae.renamePromise(g,e),0}]]).get(C);if(typeof te>"u")throw new Error("Assertion failed: Unsupported workflow");let le=await te();if(!(le===0||typeof le>"u"))throw ae.detachTemp(u),new Jt(58,`Packing the package failed (exit code ${le}, logs can be found here: ${Ut(r,A,Ct.PATH)})`)})})})}async function dat(t,e,{project:r}){let o=r.tryWorkspaceByLocator(t);if(o!==null)return i3(o,e);let a=r.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${jr(r.configuration,t)} not found in the project`);return await iA.openPromise(async n=>{let u=r.configuration,A=r.configuration.getLinkers(),p={project:r,report:new Lt({stdout:new dh.PassThrough,configuration:u})},h=A.find(b=>b.supportsPackage(a,p));if(!h)throw new Error(`The package ${jr(r.configuration,a)} isn't supported by any of the available linkers`);let E=await h.findPackageLocation(a,p),w=new En(E,{baseFs:n});return(await _t.find(Bt.dot,{baseFs:w})).scripts.has(e)})}async function Db(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await ae.mktempPromise(async p=>{let{manifest:h,env:E,cwd:w}=await que(t,{project:a,binFolder:p,cwd:o,lifecycleScript:e}),D=h.scripts.get(e);if(typeof D>"u")return 1;let b=async()=>await ky(D,r,{cwd:w,env:E,stdin:n,stdout:u,stderr:A});return await(await a.configuration.reduceHook(T=>T.wrapScriptExecution,b,a,t,e,{script:D,args:r,cwd:w,env:E,stdin:n,stdout:u,stderr:A}))()})}async function n3(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A}){return await ae.mktempPromise(async p=>{let{env:h,cwd:E}=await que(t,{project:a,binFolder:p,cwd:o});return await ky(e,r,{cwd:E,env:h,stdin:n,stdout:u,stderr:A})})}async function mat(t,{binFolder:e,cwd:r,lifecycleScript:o}){let a=await i2({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:o});return await o3(e,await Wue(t)),typeof r>"u"&&(r=V.dirname(await ae.realpathPromise(V.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:a,cwd:r}}async function que(t,{project:e,binFolder:r,cwd:o,lifecycleScript:a}){let n=e.tryWorkspaceByLocator(t);if(n!==null)return mat(n,{binFolder:r,cwd:o,lifecycleScript:a});let u=e.storedPackages.get(t.locatorHash);if(!u)throw new Error(`Package for ${jr(e.configuration,t)} not found in the project`);return await iA.openPromise(async A=>{let p=e.configuration,h=e.configuration.getLinkers(),E={project:e,report:new Lt({stdout:new dh.PassThrough,configuration:p})},w=h.find(N=>N.supportsPackage(u,E));if(!w)throw new Error(`The package ${jr(e.configuration,u)} isn't supported by any of the available linkers`);let D=await i2({project:e,locator:t,binFolder:r,lifecycleScript:a});await o3(r,await Sb(t,{project:e}));let b=await w.findPackageLocation(u,E),C=new En(b,{baseFs:A}),T=await _t.find(Bt.dot,{baseFs:C});return typeof o>"u"&&(o=b),{manifest:T,binFolder:r,env:D,cwd:o}})}async function jue(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u}){return await Db(t.anchoredLocator,e,r,{cwd:o,project:t.project,stdin:a,stdout:n,stderr:u})}function i3(t,e){return t.manifest.scripts.has(e)}async function Gue(t,e,{cwd:r,report:o}){let{configuration:a}=t.project,n=null;await ae.mktempPromise(async u=>{let A=V.join(u,`${e}.log`),p=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${Ae.fromPortablePath(t.cwd)}") -`,{stdout:h,stderr:E}=a.getSubprocessStreams(A,{report:o,prefix:jr(a,t.anchoredLocator),header:p});o.reportInfo(36,`Calling the "${e}" lifecycle script`);let w=await jue(t,e,[],{cwd:r,stdin:n,stdout:h,stderr:E});if(h.end(),E.end(),w!==0)throw ae.detachTemp(u),new Jt(36,`${(0,Mue.default)(e)} script failed (exit code ${Ut(a,w,Ct.NUMBER)}, logs can be found here: ${Ut(a,A,Ct.PATH)}); run ${Ut(a,`yarn ${e}`,Ct.CODE)} to investigate`)})}async function yat(t,e,r){i3(t,e)&&await Gue(t,e,r)}function s3(t){let e=V.extname(t);if(e.match(/\.[cm]?[jt]sx?$/))return!0;if(e===".exe"||e===".bin")return!1;let r=Buffer.alloc(4),o;try{o=ae.openSync(t,"r")}catch{return!0}try{ae.readSync(o,r,0,r.length,0)}finally{ae.closeSync(o)}let a=r.readUint32BE();return!(a===3405691582||a===3489328638||a===2135247942||(a&4294901760)===1297743872)}async function Sb(t,{project:e}){let r=e.configuration,o=new Map,a=e.storedPackages.get(t.locatorHash);if(!a)throw new Error(`Package for ${jr(r,t)} not found in the project`);let n=new dh.Writable,u=r.getLinkers(),A={project:e,report:new Lt({configuration:r,stdout:n})},p=new Set([t.locatorHash]);for(let E of a.dependencies.values()){let w=e.storedResolutions.get(E.descriptorHash);if(!w)throw new Error(`Assertion failed: The resolution (${Jn(r,E)}) should have been registered`);p.add(w)}let h=await Promise.all(Array.from(p,async E=>{let w=e.storedPackages.get(E);if(!w)throw new Error(`Assertion failed: The package (${E}) should have been registered`);if(w.bin.size===0)return ul.skip;let D=u.find(C=>C.supportsPackage(w,A));if(!D)return ul.skip;let b=null;try{b=await D.findPackageLocation(w,A)}catch(C){if(C.code==="LOCATOR_NOT_INSTALLED")return ul.skip;throw C}return{dependency:w,packageLocation:b}}));for(let E of h){if(E===ul.skip)continue;let{dependency:w,packageLocation:D}=E;for(let[b,C]of w.bin){let T=V.resolve(D,C);o.set(b,[w,Ae.fromPortablePath(T),s3(T)])}}return o}async function Wue(t){return await Sb(t.anchoredLocator,{project:t.project})}async function o3(t,e){await Promise.all(Array.from(e,([r,[,o,a]])=>a?gh(t,r,process.execPath,[o]):gh(t,r,o,[])))}async function Yue(t,e,r,{cwd:o,project:a,stdin:n,stdout:u,stderr:A,nodeArgs:p=[],packageAccessibleBinaries:h}){h??=await Sb(t,{project:a});let E=h.get(e);if(!E)throw new Error(`Binary not found (${e}) for ${jr(a.configuration,t)}`);return await ae.mktempPromise(async w=>{let[,D]=E,b=await i2({project:a,locator:t,binFolder:w});await o3(b.BERRY_BIN_FOLDER,h);let C=s3(Ae.toPortablePath(D))?Xc(process.execPath,[...p,D,...r],{cwd:o,env:b,stdin:n,stdout:u,stderr:A}):Xc(D,r,{cwd:o,env:b,stdin:n,stdout:u,stderr:A}),T;try{T=await C}finally{await ae.removePromise(b.BERRY_BIN_FOLDER)}return T.code})}async function Eat(t,e,r,{cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A}){return await Yue(t.anchoredLocator,e,r,{project:t.project,cwd:o,stdin:a,stdout:n,stderr:u,packageAccessibleBinaries:A})}var Mue,Uue,dh,_ue,pat,hat,a3=It(()=>{St();St();sA();z1();Mue=et(t3()),Uue=et(lg()),dh=ve("stream");Ay();Kl();n2();r2();nb();Wl();Gl();bf();Io();_ue=(a=>(a.Yarn1="Yarn Classic",a.Yarn2="Yarn",a.Npm="npm",a.Pnpm="pnpm",a))(_ue||{});pat=2,hat=(0,Uue.default)(pat)});var Fy=_((y4t,Kue)=>{"use strict";var Vue=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]);Kue.exports=t=>t?Object.keys(t).map(e=>[Vue.has(e)?Vue.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var Ty=_((E4t,nAe)=>{"use strict";var Jue=typeof process=="object"&&process?process:{stdout:null,stderr:null},Cat=ve("events"),zue=ve("stream"),Xue=ve("string_decoder").StringDecoder,Nf=Symbol("EOF"),Of=Symbol("maybeEmitEnd"),mh=Symbol("emittedEnd"),Pb=Symbol("emittingEnd"),s2=Symbol("emittedError"),xb=Symbol("closed"),Zue=Symbol("read"),bb=Symbol("flush"),$ue=Symbol("flushChunk"),Ra=Symbol("encoding"),Mf=Symbol("decoder"),kb=Symbol("flowing"),o2=Symbol("paused"),Ry=Symbol("resume"),xs=Symbol("bufferLength"),l3=Symbol("bufferPush"),c3=Symbol("bufferShift"),Do=Symbol("objectMode"),So=Symbol("destroyed"),u3=Symbol("emitData"),eAe=Symbol("emitEnd"),A3=Symbol("emitEnd2"),Uf=Symbol("async"),a2=t=>Promise.resolve().then(t),tAe=global._MP_NO_ITERATOR_SYMBOLS_!=="1",Iat=tAe&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),wat=tAe&&Symbol.iterator||Symbol("iterator not implemented"),Bat=t=>t==="end"||t==="finish"||t==="prefinish",vat=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,Dat=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t),Qb=class{constructor(e,r,o){this.src=e,this.dest=r,this.opts=o,this.ondrain=()=>e[Ry](),r.on("drain",this.ondrain)}unpipe(){this.dest.removeListener("drain",this.ondrain)}proxyErrors(){}end(){this.unpipe(),this.opts.end&&this.dest.end()}},f3=class extends Qb{unpipe(){this.src.removeListener("error",this.proxyErrors),super.unpipe()}constructor(e,r,o){super(e,r,o),this.proxyErrors=a=>r.emit("error",a),e.on("error",this.proxyErrors)}};nAe.exports=class rAe extends zue{constructor(e){super(),this[kb]=!1,this[o2]=!1,this.pipes=[],this.buffer=[],this[Do]=e&&e.objectMode||!1,this[Do]?this[Ra]=null:this[Ra]=e&&e.encoding||null,this[Ra]==="buffer"&&(this[Ra]=null),this[Uf]=e&&!!e.async||!1,this[Mf]=this[Ra]?new Xue(this[Ra]):null,this[Nf]=!1,this[mh]=!1,this[Pb]=!1,this[xb]=!1,this[s2]=null,this.writable=!0,this.readable=!0,this[xs]=0,this[So]=!1}get bufferLength(){return this[xs]}get encoding(){return this[Ra]}set encoding(e){if(this[Do])throw new Error("cannot set encoding in objectMode");if(this[Ra]&&e!==this[Ra]&&(this[Mf]&&this[Mf].lastNeed||this[xs]))throw new Error("cannot change encoding");this[Ra]!==e&&(this[Mf]=e?new Xue(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Mf].write(r)))),this[Ra]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Do]}set objectMode(e){this[Do]=this[Do]||!!e}get async(){return this[Uf]}set async(e){this[Uf]=this[Uf]||!!e}write(e,r,o){if(this[Nf])throw new Error("write after end");if(this[So])return this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0;typeof r=="function"&&(o=r,r="utf8"),r||(r="utf8");let a=this[Uf]?a2:n=>n();return!this[Do]&&!Buffer.isBuffer(e)&&(Dat(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):vat(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),this[Do]?(this.flowing&&this[xs]!==0&&this[bb](!0),this.flowing?this.emit("data",e):this[l3](e),this[xs]!==0&&this.emit("readable"),o&&a(o),this.flowing):e.length?(typeof e=="string"&&!(r===this[Ra]&&!this[Mf].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Ra]&&(e=this[Mf].write(e)),this.flowing&&this[xs]!==0&&this[bb](!0),this.flowing?this.emit("data",e):this[l3](e),this[xs]!==0&&this.emit("readable"),o&&a(o),this.flowing):(this[xs]!==0&&this.emit("readable"),o&&a(o),this.flowing)}read(e){if(this[So])return null;if(this[xs]===0||e===0||e>this[xs])return this[Of](),null;this[Do]&&(e=null),this.buffer.length>1&&!this[Do]&&(this.encoding?this.buffer=[this.buffer.join("")]:this.buffer=[Buffer.concat(this.buffer,this[xs])]);let r=this[Zue](e||null,this.buffer[0]);return this[Of](),r}[Zue](e,r){return e===r.length||e===null?this[c3]():(this.buffer[0]=r.slice(e),r=r.slice(0,e),this[xs]-=e),this.emit("data",r),!this.buffer.length&&!this[Nf]&&this.emit("drain"),r}end(e,r,o){return typeof e=="function"&&(o=e,e=null),typeof r=="function"&&(o=r,r="utf8"),e&&this.write(e,r),o&&this.once("end",o),this[Nf]=!0,this.writable=!1,(this.flowing||!this[o2])&&this[Of](),this}[Ry](){this[So]||(this[o2]=!1,this[kb]=!0,this.emit("resume"),this.buffer.length?this[bb]():this[Nf]?this[Of]():this.emit("drain"))}resume(){return this[Ry]()}pause(){this[kb]=!1,this[o2]=!0}get destroyed(){return this[So]}get flowing(){return this[kb]}get paused(){return this[o2]}[l3](e){this[Do]?this[xs]+=1:this[xs]+=e.length,this.buffer.push(e)}[c3](){return this.buffer.length&&(this[Do]?this[xs]-=1:this[xs]-=this.buffer[0].length),this.buffer.shift()}[bb](e){do;while(this[$ue](this[c3]()));!e&&!this.buffer.length&&!this[Nf]&&this.emit("drain")}[$ue](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[So])return;let o=this[mh];return r=r||{},e===Jue.stdout||e===Jue.stderr?r.end=!1:r.end=r.end!==!1,r.proxyErrors=!!r.proxyErrors,o?r.end&&e.end():(this.pipes.push(r.proxyErrors?new f3(this,e,r):new Qb(this,e,r)),this[Uf]?a2(()=>this[Ry]()):this[Ry]()),e}unpipe(e){let r=this.pipes.find(o=>o.dest===e);r&&(this.pipes.splice(this.pipes.indexOf(r),1),r.unpipe())}addListener(e,r){return this.on(e,r)}on(e,r){let o=super.on(e,r);return e==="data"&&!this.pipes.length&&!this.flowing?this[Ry]():e==="readable"&&this[xs]!==0?super.emit("readable"):Bat(e)&&this[mh]?(super.emit(e),this.removeAllListeners(e)):e==="error"&&this[s2]&&(this[Uf]?a2(()=>r.call(this,this[s2])):r.call(this,this[s2])),o}get emittedEnd(){return this[mh]}[Of](){!this[Pb]&&!this[mh]&&!this[So]&&this.buffer.length===0&&this[Nf]&&(this[Pb]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[xb]&&this.emit("close"),this[Pb]=!1)}emit(e,r,...o){if(e!=="error"&&e!=="close"&&e!==So&&this[So])return;if(e==="data")return r?this[Uf]?a2(()=>this[u3](r)):this[u3](r):!1;if(e==="end")return this[eAe]();if(e==="close"){if(this[xb]=!0,!this[mh]&&!this[So])return;let n=super.emit("close");return this.removeAllListeners("close"),n}else if(e==="error"){this[s2]=r;let n=super.emit("error",r);return this[Of](),n}else if(e==="resume"){let n=super.emit("resume");return this[Of](),n}else if(e==="finish"||e==="prefinish"){let n=super.emit(e);return this.removeAllListeners(e),n}let a=super.emit(e,r,...o);return this[Of](),a}[u3](e){for(let o of this.pipes)o.dest.write(e)===!1&&this.pause();let r=super.emit("data",e);return this[Of](),r}[eAe](){this[mh]||(this[mh]=!0,this.readable=!1,this[Uf]?a2(()=>this[A3]()):this[A3]())}[A3](){if(this[Mf]){let r=this[Mf].end();if(r){for(let o of this.pipes)o.dest.write(r);super.emit("data",r)}}for(let r of this.pipes)r.end();let e=super.emit("end");return this.removeAllListeners("end"),e}collect(){let e=[];this[Do]||(e.dataLength=0);let r=this.promise();return this.on("data",o=>{e.push(o),this[Do]||(e.dataLength+=o.length)}),r.then(()=>e)}concat(){return this[Do]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Do]?Promise.reject(new Error("cannot concat in objectMode")):this[Ra]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(So,()=>r(new Error("stream destroyed"))),this.on("error",o=>r(o)),this.on("end",()=>e())})}[Iat](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[Nf])return Promise.resolve({done:!0});let o=null,a=null,n=h=>{this.removeListener("data",u),this.removeListener("end",A),a(h)},u=h=>{this.removeListener("error",n),this.removeListener("end",A),this.pause(),o({value:h,done:!!this[Nf]})},A=()=>{this.removeListener("error",n),this.removeListener("data",u),o({done:!0})},p=()=>n(new Error("stream destroyed"));return new Promise((h,E)=>{a=E,o=h,this.once(So,p),this.once("error",n),this.once("end",A),this.once("data",u)})}}}[wat](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[So]?(e?this.emit("error",e):this.emit(So),this):(this[So]=!0,this.buffer.length=0,this[xs]=0,typeof this.close=="function"&&!this[xb]&&this.close(),e?this.emit("error",e):this.emit(So),this)}static isStream(e){return!!e&&(e instanceof rAe||e instanceof zue||e instanceof Cat&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var sAe=_((C4t,iAe)=>{var Sat=ve("zlib").constants||{ZLIB_VERNUM:4736};iAe.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:1/0,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},Sat))});var x3=_(hl=>{"use strict";var m3=ve("assert"),yh=ve("buffer").Buffer,lAe=ve("zlib"),Tg=hl.constants=sAe(),Pat=Ty(),oAe=yh.concat,Lg=Symbol("_superWrite"),Ny=class extends Error{constructor(e){super("zlib: "+e.message),this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},xat=Symbol("opts"),l2=Symbol("flushFlag"),aAe=Symbol("finishFlushFlag"),P3=Symbol("fullFlushFlag"),ui=Symbol("handle"),Fb=Symbol("onError"),Ly=Symbol("sawError"),p3=Symbol("level"),h3=Symbol("strategy"),g3=Symbol("ended"),I4t=Symbol("_defaultFullFlush"),Rb=class extends Pat{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e),this[Ly]=!1,this[g3]=!1,this[xat]=e,this[l2]=e.flush,this[aAe]=e.finishFlush;try{this[ui]=new lAe[r](e)}catch(o){throw new Ny(o)}this[Fb]=o=>{this[Ly]||(this[Ly]=!0,this.close(),this.emit("error",o))},this[ui].on("error",o=>this[Fb](new Ny(o))),this.once("end",()=>this.close)}close(){this[ui]&&(this[ui].close(),this[ui]=null,this.emit("close"))}reset(){if(!this[Ly])return m3(this[ui],"zlib binding closed"),this[ui].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[P3]),this.write(Object.assign(yh.alloc(0),{[l2]:e})))}end(e,r,o){return e&&this.write(e,r),this.flush(this[aAe]),this[g3]=!0,super.end(null,null,o)}get ended(){return this[g3]}write(e,r,o){if(typeof r=="function"&&(o=r,r="utf8"),typeof e=="string"&&(e=yh.from(e,r)),this[Ly])return;m3(this[ui],"zlib binding closed");let a=this[ui]._handle,n=a.close;a.close=()=>{};let u=this[ui].close;this[ui].close=()=>{},yh.concat=h=>h;let A;try{let h=typeof e[l2]=="number"?e[l2]:this[l2];A=this[ui]._processChunk(e,h),yh.concat=oAe}catch(h){yh.concat=oAe,this[Fb](new Ny(h))}finally{this[ui]&&(this[ui]._handle=a,a.close=n,this[ui].close=u,this[ui].removeAllListeners("error"))}this[ui]&&this[ui].on("error",h=>this[Fb](new Ny(h)));let p;if(A)if(Array.isArray(A)&&A.length>0){p=this[Lg](yh.from(A[0]));for(let h=1;h{this.flush(a),n()};try{this[ui].params(e,r)}finally{this[ui].flush=o}this[ui]&&(this[p3]=e,this[h3]=r)}}}},y3=class extends _f{constructor(e){super(e,"Deflate")}},E3=class extends _f{constructor(e){super(e,"Inflate")}},d3=Symbol("_portable"),C3=class extends _f{constructor(e){super(e,"Gzip"),this[d3]=e&&!!e.portable}[Lg](e){return this[d3]?(this[d3]=!1,e[9]=255,super[Lg](e)):super[Lg](e)}},I3=class extends _f{constructor(e){super(e,"Gunzip")}},w3=class extends _f{constructor(e){super(e,"DeflateRaw")}},B3=class extends _f{constructor(e){super(e,"InflateRaw")}},v3=class extends _f{constructor(e){super(e,"Unzip")}},Tb=class extends Rb{constructor(e,r){e=e||{},e.flush=e.flush||Tg.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||Tg.BROTLI_OPERATION_FINISH,super(e,r),this[P3]=Tg.BROTLI_OPERATION_FLUSH}},D3=class extends Tb{constructor(e){super(e,"BrotliCompress")}},S3=class extends Tb{constructor(e){super(e,"BrotliDecompress")}};hl.Deflate=y3;hl.Inflate=E3;hl.Gzip=C3;hl.Gunzip=I3;hl.DeflateRaw=w3;hl.InflateRaw=B3;hl.Unzip=v3;typeof lAe.BrotliCompress=="function"?(hl.BrotliCompress=D3,hl.BrotliDecompress=S3):hl.BrotliCompress=hl.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var Oy=_((v4t,cAe)=>{var bat=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform;cAe.exports=bat!=="win32"?t=>t:t=>t&&t.replace(/\\/g,"/")});var Lb=_((S4t,uAe)=>{"use strict";var kat=Ty(),b3=Oy(),k3=Symbol("slurp");uAe.exports=class extends kat{constructor(e,r,o){switch(super(),this.pause(),this.extended=r,this.globalExtended=o,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=b3(e.path),this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=b3(e.linkpath),this.uname=e.uname,this.gname=e.gname,r&&this[k3](r),o&&this[k3](o,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let o=this.remain,a=this.blockRemain;return this.remain=Math.max(0,o-r),this.blockRemain=Math.max(0,a-r),this.ignore?!0:o>=r?super.write(e):super.write(e.slice(0,o))}[k3](e,r){for(let o in e)e[o]!==null&&e[o]!==void 0&&!(r&&o==="path")&&(this[o]=o==="path"||o==="linkpath"?b3(e[o]):e[o])}}});var Q3=_(Nb=>{"use strict";Nb.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);Nb.code=new Map(Array.from(Nb.name).map(t=>[t[1],t[0]]))});var hAe=_((x4t,pAe)=>{"use strict";var Qat=(t,e)=>{if(Number.isSafeInteger(t))t<0?Rat(t,e):Fat(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},Fat=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},Rat=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var o=e.length;o>1;o--){var a=t&255;t=Math.floor(t/256),r?e[o-1]=AAe(a):a===0?e[o-1]=0:(r=!0,e[o-1]=fAe(a))}},Tat=t=>{let e=t[0],r=e===128?Nat(t.slice(1,t.length)):e===255?Lat(t):null;if(r===null)throw Error("invalid base256 encoding");if(!Number.isSafeInteger(r))throw Error("parsed number outside of javascript safe integer range");return r},Lat=t=>{for(var e=t.length,r=0,o=!1,a=e-1;a>-1;a--){var n=t[a],u;o?u=AAe(n):n===0?u=n:(o=!0,u=fAe(n)),u!==0&&(r-=u*Math.pow(256,e-a-1))}return r},Nat=t=>{for(var e=t.length,r=0,o=e-1;o>-1;o--){var a=t[o];a!==0&&(r+=a*Math.pow(256,e-o-1))}return r},AAe=t=>(255^t)&255,fAe=t=>(255^t)+1&255;pAe.exports={encode:Qat,parse:Tat}});var Uy=_((b4t,dAe)=>{"use strict";var F3=Q3(),My=ve("path").posix,gAe=hAe(),R3=Symbol("slurp"),gl=Symbol("type"),N3=class{constructor(e,r,o,a){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[gl]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,o,a):e&&this.set(e)}decode(e,r,o,a){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=Ng(e,r,100),this.mode=Eh(e,r+100,8),this.uid=Eh(e,r+108,8),this.gid=Eh(e,r+116,8),this.size=Eh(e,r+124,12),this.mtime=T3(e,r+136,12),this.cksum=Eh(e,r+148,12),this[R3](o),this[R3](a,!0),this[gl]=Ng(e,r+156,1),this[gl]===""&&(this[gl]="0"),this[gl]==="0"&&this.path.substr(-1)==="/"&&(this[gl]="5"),this[gl]==="5"&&(this.size=0),this.linkpath=Ng(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=Ng(e,r+265,32),this.gname=Ng(e,r+297,32),this.devmaj=Eh(e,r+329,8),this.devmin=Eh(e,r+337,8),e[r+475]!==0){let u=Ng(e,r+345,155);this.path=u+"/"+this.path}else{let u=Ng(e,r+345,130);u&&(this.path=u+"/"+this.path),this.atime=T3(e,r+476,12),this.ctime=T3(e,r+488,12)}let n=8*32;for(let u=r;u=r+512))throw new Error("need 512 bytes for header");let o=this.ctime||this.atime?130:155,a=Oat(this.path||"",o),n=a[0],u=a[1];this.needPax=a[2],this.needPax=Og(e,r,100,n)||this.needPax,this.needPax=Ch(e,r+100,8,this.mode)||this.needPax,this.needPax=Ch(e,r+108,8,this.uid)||this.needPax,this.needPax=Ch(e,r+116,8,this.gid)||this.needPax,this.needPax=Ch(e,r+124,12,this.size)||this.needPax,this.needPax=L3(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[gl].charCodeAt(0),this.needPax=Og(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=Og(e,r+265,32,this.uname)||this.needPax,this.needPax=Og(e,r+297,32,this.gname)||this.needPax,this.needPax=Ch(e,r+329,8,this.devmaj)||this.needPax,this.needPax=Ch(e,r+337,8,this.devmin)||this.needPax,this.needPax=Og(e,r+345,o,u)||this.needPax,e[r+475]!==0?this.needPax=Og(e,r+345,155,u)||this.needPax:(this.needPax=Og(e,r+345,130,u)||this.needPax,this.needPax=L3(e,r+476,12,this.atime)||this.needPax,this.needPax=L3(e,r+488,12,this.ctime)||this.needPax);let A=8*32;for(let p=r;p{let o=t,a="",n,u=My.parse(t).root||".";if(Buffer.byteLength(o)<100)n=[o,a,!1];else{a=My.dirname(o),o=My.basename(o);do Buffer.byteLength(o)<=100&&Buffer.byteLength(a)<=e?n=[o,a,!1]:Buffer.byteLength(o)>100&&Buffer.byteLength(a)<=e?n=[o.substr(0,99),a,!0]:(o=My.join(My.basename(a),o),a=My.dirname(a));while(a!==u&&!n);n||(n=[t.substr(0,99),"",!0])}return n},Ng=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),T3=(t,e,r)=>Mat(Eh(t,e,r)),Mat=t=>t===null?null:new Date(t*1e3),Eh=(t,e,r)=>t[e]&128?gAe.parse(t.slice(e,e+r)):_at(t,e,r),Uat=t=>isNaN(t)?null:t,_at=(t,e,r)=>Uat(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),Hat={12:8589934591,8:2097151},Ch=(t,e,r,o)=>o===null?!1:o>Hat[r]||o<0?(gAe.encode(o,t.slice(e,e+r)),!0):(qat(t,e,r,o),!1),qat=(t,e,r,o)=>t.write(jat(o,r),e,r,"ascii"),jat=(t,e)=>Gat(Math.floor(t).toString(8),e),Gat=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",L3=(t,e,r,o)=>o===null?!1:Ch(t,e,r,o.getTime()/1e3),Wat=new Array(156).join("\0"),Og=(t,e,r,o)=>o===null?!1:(t.write(o+Wat,e,r,"utf8"),o.length!==Buffer.byteLength(o)||o.length>r);dAe.exports=N3});var Ob=_((k4t,mAe)=>{"use strict";var Yat=Uy(),Vat=ve("path"),c2=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),o=512*Math.ceil(1+r/512),a=Buffer.allocUnsafe(o);for(let n=0;n<512;n++)a[n]=0;new Yat({path:("PaxHeader/"+Vat.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(a),a.write(e,512,r,"utf8");for(let n=r+512;n=Math.pow(10,n)&&(n+=1),n+a+o}};c2.parse=(t,e,r)=>new c2(Kat(Jat(t),e),r);var Kat=(t,e)=>e?Object.keys(t).reduce((r,o)=>(r[o]=t[o],r),e):t,Jat=t=>t.replace(/\n$/,"").split(` -`).reduce(zat,Object.create(null)),zat=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let o=e.split("="),a=o.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!a)return t;let n=o.join("=");return t[a]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(a)?new Date(n*1e3):/^[0-9]+$/.test(n)?+n:n,t};mAe.exports=c2});var _y=_((Q4t,yAe)=>{yAe.exports=t=>{let e=t.length-1,r=-1;for(;e>-1&&t.charAt(e)==="/";)r=e,e--;return r===-1?t:t.slice(0,r)}});var Mb=_((F4t,EAe)=>{"use strict";EAe.exports=t=>class extends t{warn(e,r,o={}){this.file&&(o.file=this.file),this.cwd&&(o.cwd=this.cwd),o.code=r instanceof Error&&r.code||e,o.tarCode=e,!this.strict&&o.recoverable!==!1?(r instanceof Error&&(o=Object.assign(r,o),r=r.message),this.emit("warn",o.tarCode,r,o)):r instanceof Error?this.emit("error",Object.assign(r,o)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),o))}}});var M3=_((T4t,CAe)=>{"use strict";var Ub=["|","<",">","?",":"],O3=Ub.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),Xat=new Map(Ub.map((t,e)=>[t,O3[e]])),Zat=new Map(O3.map((t,e)=>[t,Ub[e]]));CAe.exports={encode:t=>Ub.reduce((e,r)=>e.split(r).join(Xat.get(r)),t),decode:t=>O3.reduce((e,r)=>e.split(r).join(Zat.get(r)),t)}});var U3=_((L4t,wAe)=>{var{isAbsolute:$at,parse:IAe}=ve("path").win32;wAe.exports=t=>{let e="",r=IAe(t);for(;$at(t)||r.root;){let o=t.charAt(0)==="/"&&t.slice(0,4)!=="//?/"?"/":r.root;t=t.substr(o.length),e+=o,r=IAe(t)}return[e,t]}});var vAe=_((N4t,BAe)=>{"use strict";BAe.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&-19),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var J3=_((U4t,MAe)=>{"use strict";var QAe=Ty(),FAe=Ob(),RAe=Uy(),lA=ve("fs"),DAe=ve("path"),aA=Oy(),elt=_y(),TAe=(t,e)=>e?(t=aA(t).replace(/^\.(\/|$)/,""),elt(e)+"/"+t):aA(t),tlt=16*1024*1024,SAe=Symbol("process"),PAe=Symbol("file"),xAe=Symbol("directory"),H3=Symbol("symlink"),bAe=Symbol("hardlink"),u2=Symbol("header"),_b=Symbol("read"),q3=Symbol("lstat"),Hb=Symbol("onlstat"),j3=Symbol("onread"),G3=Symbol("onreadlink"),W3=Symbol("openfile"),Y3=Symbol("onopenfile"),Ih=Symbol("close"),qb=Symbol("mode"),V3=Symbol("awaitDrain"),_3=Symbol("ondrain"),cA=Symbol("prefix"),kAe=Symbol("hadError"),LAe=Mb(),rlt=M3(),NAe=U3(),OAe=vAe(),jb=LAe(class extends QAe{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=aA(e),this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid()||0,this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||tlt,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=aA(r.cwd||process.cwd()),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,this.prefix=r.prefix?aA(r.prefix):null,this.fd=null,this.blockLen=null,this.blockRemain=null,this.buf=null,this.offset=null,this.length=null,this.pos=null,this.remain=null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=NAe(this.path);a&&(this.path=n,o=a)}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=rlt.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=aA(r.absolute||DAe.resolve(this.cwd,e)),this.path===""&&(this.path="./"),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.statCache.has(this.absolute)?this[Hb](this.statCache.get(this.absolute)):this[q3]()}emit(e,...r){return e==="error"&&(this[kAe]=!0),super.emit(e,...r)}[q3](){lA.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[Hb](r)})}[Hb](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=ilt(e),this.emit("stat",e),this[SAe]()}[SAe](){switch(this.type){case"File":return this[PAe]();case"Directory":return this[xAe]();case"SymbolicLink":return this[H3]();default:return this.end()}}[qb](e){return OAe(e,this.type==="Directory",this.portable)}[cA](e){return TAe(e,this.prefix)}[u2](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new RAe({path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,mode:this[qb](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&super.write(new FAe({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),super.write(this.header.block)}[xAe](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[u2](),this.end()}[H3](){lA.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[G3](r)})}[G3](e){this.linkpath=aA(e),this[u2](),this.end()}[bAe](e){this.type="Link",this.linkpath=aA(DAe.relative(this.cwd,e)),this.stat.size=0,this[u2](),this.end()}[PAe](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[bAe](r)}this.linkCache.set(e,this.absolute)}if(this[u2](),this.stat.size===0)return this.end();this[W3]()}[W3](){lA.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[Y3](r)})}[Y3](e){if(this.fd=e,this[kAe])return this[Ih]();this.blockLen=512*Math.ceil(this.stat.size/512),this.blockRemain=this.blockLen;let r=Math.min(this.blockLen,this.maxReadSize);this.buf=Buffer.allocUnsafe(r),this.offset=0,this.pos=0,this.remain=this.stat.size,this.length=this.buf.length,this[_b]()}[_b](){let{fd:e,buf:r,offset:o,length:a,pos:n}=this;lA.read(e,r,o,a,n,(u,A)=>{if(u)return this[Ih](()=>this.emit("error",u));this[j3](A)})}[Ih](e){lA.close(this.fd,e)}[j3](e){if(e<=0&&this.remain>0){let a=new Error("encountered unexpected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[Ih](()=>this.emit("error",a))}if(e>this.remain){let a=new Error("did not encounter expected EOF");return a.path=this.absolute,a.syscall="read",a.code="EOF",this[Ih](()=>this.emit("error",a))}if(e===this.remain)for(let a=e;athis[_3]())}[V3](e){this.once("drain",e)}write(e){if(this.blockRemaine?this.emit("error",e):this.end());this.offset>=this.length&&(this.buf=Buffer.allocUnsafe(Math.min(this.blockRemain,this.buf.length)),this.offset=0),this.length=this.buf.length-this.offset,this[_b]()}}),K3=class extends jb{[q3](){this[Hb](lA.lstatSync(this.absolute))}[H3](){this[G3](lA.readlinkSync(this.absolute))}[W3](){this[Y3](lA.openSync(this.absolute,"r"))}[_b](){let e=!0;try{let{fd:r,buf:o,offset:a,length:n,pos:u}=this,A=lA.readSync(r,o,a,n,u);this[j3](A),e=!1}finally{if(e)try{this[Ih](()=>{})}catch{}}}[V3](e){e()}[Ih](e){lA.closeSync(this.fd),e()}},nlt=LAe(class extends QAe{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.prefix=r.prefix||null,this.path=aA(e.path),this.mode=this[qb](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=aA(e.linkpath),typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let o=!1;if(!this.preservePaths){let[a,n]=NAe(this.path);a&&(this.path=n,o=a)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new RAe({path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),o&&this.warn("TAR_ENTRY_INFO",`stripping ${o} from absolute path`,{entry:this,path:o+this.path}),this.header.encode()&&!this.noPax&&super.write(new FAe({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this[cA](this.path),linkpath:this.type==="Link"?this[cA](this.linkpath):this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[cA](e){return TAe(e,this.prefix)}[qb](e){return OAe(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&super.write(Buffer.alloc(this.blockRemain)),super.end()}});jb.Sync=K3;jb.Tar=nlt;var ilt=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";MAe.exports=jb});var Zb=_((H4t,WAe)=>{"use strict";var zb=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},slt=Ty(),olt=x3(),alt=Lb(),i_=J3(),llt=i_.Sync,clt=i_.Tar,ult=eP(),UAe=Buffer.alloc(1024),Yb=Symbol("onStat"),Gb=Symbol("ended"),uA=Symbol("queue"),Hy=Symbol("current"),Mg=Symbol("process"),Wb=Symbol("processing"),_Ae=Symbol("processJob"),AA=Symbol("jobs"),z3=Symbol("jobDone"),Vb=Symbol("addFSEntry"),HAe=Symbol("addTarEntry"),e_=Symbol("stat"),t_=Symbol("readdir"),Kb=Symbol("onreaddir"),Jb=Symbol("pipe"),qAe=Symbol("entry"),X3=Symbol("entryOpt"),r_=Symbol("writeEntryClass"),GAe=Symbol("write"),Z3=Symbol("ondrain"),Xb=ve("fs"),jAe=ve("path"),Alt=Mb(),$3=Oy(),s_=Alt(class extends slt{constructor(e){super(e),e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=$3(e.prefix||""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[r_]=i_,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new olt.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[Z3]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[Z3]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[uA]=new ult,this[AA]=0,this.jobs=+e.jobs||4,this[Wb]=!1,this[Gb]=!1}[GAe](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[Gb]=!0,this[Mg](),this}write(e){if(this[Gb])throw new Error("write after end");return e instanceof alt?this[HAe](e):this[Vb](e),this.flowing}[HAe](e){let r=$3(jAe.resolve(this.cwd,e.path));if(!this.filter(e.path,e))e.resume();else{let o=new zb(e.path,r,!1);o.entry=new clt(e,this[X3](o)),o.entry.on("end",a=>this[z3](o)),this[AA]+=1,this[uA].push(o)}this[Mg]()}[Vb](e){let r=$3(jAe.resolve(this.cwd,e));this[uA].push(new zb(e,r)),this[Mg]()}[e_](e){e.pending=!0,this[AA]+=1;let r=this.follow?"stat":"lstat";Xb[r](e.absolute,(o,a)=>{e.pending=!1,this[AA]-=1,o?this.emit("error",o):this[Yb](e,a)})}[Yb](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[Mg]()}[t_](e){e.pending=!0,this[AA]+=1,Xb.readdir(e.absolute,(r,o)=>{if(e.pending=!1,this[AA]-=1,r)return this.emit("error",r);this[Kb](e,o)})}[Kb](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[Mg]()}[Mg](){if(!this[Wb]){this[Wb]=!0;for(let e=this[uA].head;e!==null&&this[AA]this.warn(r,o,a),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime,prefix:this.prefix}}[qAe](e){this[AA]+=1;try{return new this[r_](e.path,this[X3](e)).on("end",()=>this[z3](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[Z3](){this[Hy]&&this[Hy].entry&&this[Hy].entry.resume()}[Jb](e){e.piped=!0,e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[Vb](u+a)});let r=e.entry,o=this.zip;o?r.on("data",a=>{o.write(a)||r.pause()}):r.on("data",a=>{super.write(a)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),n_=class extends s_{constructor(e){super(e),this[r_]=llt}pause(){}resume(){}[e_](e){let r=this.follow?"statSync":"lstatSync";this[Yb](e,Xb[r](e.absolute))}[t_](e,r){this[Kb](e,Xb.readdirSync(e.absolute))}[Jb](e){let r=e.entry,o=this.zip;e.readdir&&e.readdir.forEach(a=>{let n=e.path,u=n==="./"?"":n.replace(/\/*$/,"/");this[Vb](u+a)}),o?r.on("data",a=>{o.write(a)}):r.on("data",a=>{super[GAe](a)})}};s_.Sync=n_;WAe.exports=s_});var Jy=_(f2=>{"use strict";var flt=Ty(),plt=ve("events").EventEmitter,Ta=ve("fs"),l_=Ta.writev;if(!l_){let t=process.binding("fs"),e=t.FSReqWrap||t.FSReqCallback;l_=(r,o,a,n)=>{let u=(p,h)=>n(p,h,o),A=new e;A.oncomplete=u,t.writeBuffers(r,o,a,A)}}var Vy=Symbol("_autoClose"),Zc=Symbol("_close"),A2=Symbol("_ended"),zn=Symbol("_fd"),YAe=Symbol("_finished"),Bh=Symbol("_flags"),o_=Symbol("_flush"),c_=Symbol("_handleChunk"),u_=Symbol("_makeBuf"),nk=Symbol("_mode"),$b=Symbol("_needDrain"),Wy=Symbol("_onerror"),Ky=Symbol("_onopen"),a_=Symbol("_onread"),jy=Symbol("_onwrite"),vh=Symbol("_open"),Hf=Symbol("_path"),Ug=Symbol("_pos"),fA=Symbol("_queue"),Gy=Symbol("_read"),VAe=Symbol("_readSize"),wh=Symbol("_reading"),ek=Symbol("_remain"),KAe=Symbol("_size"),tk=Symbol("_write"),qy=Symbol("_writing"),rk=Symbol("_defaultFlag"),Yy=Symbol("_errored"),ik=class extends flt{constructor(e,r){if(r=r||{},super(r),this.readable=!0,this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Yy]=!1,this[zn]=typeof r.fd=="number"?r.fd:null,this[Hf]=e,this[VAe]=r.readSize||16*1024*1024,this[wh]=!1,this[KAe]=typeof r.size=="number"?r.size:1/0,this[ek]=this[KAe],this[Vy]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[zn]=="number"?this[Gy]():this[vh]()}get fd(){return this[zn]}get path(){return this[Hf]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[vh](){Ta.open(this[Hf],"r",(e,r)=>this[Ky](e,r))}[Ky](e,r){e?this[Wy](e):(this[zn]=r,this.emit("open",r),this[Gy]())}[u_](){return Buffer.allocUnsafe(Math.min(this[VAe],this[ek]))}[Gy](){if(!this[wh]){this[wh]=!0;let e=this[u_]();if(e.length===0)return process.nextTick(()=>this[a_](null,0,e));Ta.read(this[zn],e,0,e.length,null,(r,o,a)=>this[a_](r,o,a))}}[a_](e,r,o){this[wh]=!1,e?this[Wy](e):this[c_](r,o)&&this[Gy]()}[Zc](){if(this[Vy]&&typeof this[zn]=="number"){let e=this[zn];this[zn]=null,Ta.close(e,r=>r?this.emit("error",r):this.emit("close"))}}[Wy](e){this[wh]=!0,this[Zc](),this.emit("error",e)}[c_](e,r){let o=!1;return this[ek]-=e,e>0&&(o=super.write(ethis[Ky](e,r))}[Ky](e,r){this[rk]&&this[Bh]==="r+"&&e&&e.code==="ENOENT"?(this[Bh]="w",this[vh]()):e?this[Wy](e):(this[zn]=r,this.emit("open",r),this[o_]())}end(e,r){return e&&this.write(e,r),this[A2]=!0,!this[qy]&&!this[fA].length&&typeof this[zn]=="number"&&this[jy](null,0),this}write(e,r){return typeof e=="string"&&(e=Buffer.from(e,r)),this[A2]?(this.emit("error",new Error("write() after end()")),!1):this[zn]===null||this[qy]||this[fA].length?(this[fA].push(e),this[$b]=!0,!1):(this[qy]=!0,this[tk](e),!0)}[tk](e){Ta.write(this[zn],e,0,e.length,this[Ug],(r,o)=>this[jy](r,o))}[jy](e,r){e?this[Wy](e):(this[Ug]!==null&&(this[Ug]+=r),this[fA].length?this[o_]():(this[qy]=!1,this[A2]&&!this[YAe]?(this[YAe]=!0,this[Zc](),this.emit("finish")):this[$b]&&(this[$b]=!1,this.emit("drain"))))}[o_](){if(this[fA].length===0)this[A2]&&this[jy](null,0);else if(this[fA].length===1)this[tk](this[fA].pop());else{let e=this[fA];this[fA]=[],l_(this[zn],e,this[Ug],(r,o)=>this[jy](r,o))}}[Zc](){if(this[Vy]&&typeof this[zn]=="number"){let e=this[zn];this[zn]=null,Ta.close(e,r=>r?this.emit("error",r):this.emit("close"))}}},f_=class extends sk{[vh](){let e;if(this[rk]&&this[Bh]==="r+")try{e=Ta.openSync(this[Hf],this[Bh],this[nk])}catch(r){if(r.code==="ENOENT")return this[Bh]="w",this[vh]();throw r}else e=Ta.openSync(this[Hf],this[Bh],this[nk]);this[Ky](null,e)}[Zc](){if(this[Vy]&&typeof this[zn]=="number"){let e=this[zn];this[zn]=null,Ta.closeSync(e),this.emit("close")}}[tk](e){let r=!0;try{this[jy](null,Ta.writeSync(this[zn],e,0,e.length,this[Ug])),r=!1}finally{if(r)try{this[Zc]()}catch{}}}};f2.ReadStream=ik;f2.ReadStreamSync=A_;f2.WriteStream=sk;f2.WriteStreamSync=f_});var fk=_((G4t,tfe)=>{"use strict";var hlt=Mb(),glt=Uy(),dlt=ve("events"),mlt=eP(),ylt=1024*1024,Elt=Lb(),JAe=Ob(),Clt=x3(),p_=Buffer.from([31,139]),$l=Symbol("state"),_g=Symbol("writeEntry"),qf=Symbol("readEntry"),h_=Symbol("nextEntry"),zAe=Symbol("processEntry"),ec=Symbol("extendedHeader"),p2=Symbol("globalExtendedHeader"),Dh=Symbol("meta"),XAe=Symbol("emitMeta"),yi=Symbol("buffer"),jf=Symbol("queue"),Hg=Symbol("ended"),ZAe=Symbol("emittedEnd"),qg=Symbol("emit"),La=Symbol("unzip"),ok=Symbol("consumeChunk"),ak=Symbol("consumeChunkSub"),g_=Symbol("consumeBody"),$Ae=Symbol("consumeMeta"),efe=Symbol("consumeHeader"),lk=Symbol("consuming"),d_=Symbol("bufferConcat"),m_=Symbol("maybeEnd"),h2=Symbol("writing"),Sh=Symbol("aborted"),ck=Symbol("onDone"),jg=Symbol("sawValidEntry"),uk=Symbol("sawNullBlock"),Ak=Symbol("sawEOF"),Ilt=t=>!0;tfe.exports=hlt(class extends dlt{constructor(e){e=e||{},super(e),this.file=e.file||"",this[jg]=null,this.on(ck,r=>{(this[$l]==="begin"||this[jg]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(ck,e.ondone):this.on(ck,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||ylt,this.filter=typeof e.filter=="function"?e.filter:Ilt,this.writable=!0,this.readable=!1,this[jf]=new mlt,this[yi]=null,this[qf]=null,this[_g]=null,this[$l]="begin",this[Dh]="",this[ec]=null,this[p2]=null,this[Hg]=!1,this[La]=null,this[Sh]=!1,this[uk]=!1,this[Ak]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[efe](e,r){this[jg]===null&&(this[jg]=!1);let o;try{o=new glt(e,r,this[ec],this[p2])}catch(a){return this.warn("TAR_ENTRY_INVALID",a)}if(o.nullBlock)this[uk]?(this[Ak]=!0,this[$l]==="begin"&&(this[$l]="header"),this[qg]("eof")):(this[uk]=!0,this[qg]("nullBlock"));else if(this[uk]=!1,!o.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:o});else if(!o.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:o});else{let a=o.type;if(/^(Symbolic)?Link$/.test(a)&&!o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:o});else if(!/^(Symbolic)?Link$/.test(a)&&o.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:o});else{let n=this[_g]=new Elt(o,this[ec],this[p2]);if(!this[jg])if(n.remain){let u=()=>{n.invalid||(this[jg]=!0)};n.on("end",u)}else this[jg]=!0;n.meta?n.size>this.maxMetaEntrySize?(n.ignore=!0,this[qg]("ignoredEntry",n),this[$l]="ignore",n.resume()):n.size>0&&(this[Dh]="",n.on("data",u=>this[Dh]+=u),this[$l]="meta"):(this[ec]=null,n.ignore=n.ignore||!this.filter(n.path,n),n.ignore?(this[qg]("ignoredEntry",n),this[$l]=n.remain?"ignore":"header",n.resume()):(n.remain?this[$l]="body":(this[$l]="header",n.end()),this[qf]?this[jf].push(n):(this[jf].push(n),this[h_]())))}}}[zAe](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[qf]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",o=>this[h_]()),r=!1)):(this[qf]=null,r=!1),r}[h_](){do;while(this[zAe](this[jf].shift()));if(!this[jf].length){let e=this[qf];!e||e.flowing||e.size===e.remain?this[h2]||this.emit("drain"):e.once("drain",o=>this.emit("drain"))}}[g_](e,r){let o=this[_g],a=o.blockRemain,n=a>=e.length&&r===0?e:e.slice(r,r+a);return o.write(n),o.blockRemain||(this[$l]="header",this[_g]=null,o.end()),n.length}[$Ae](e,r){let o=this[_g],a=this[g_](e,r);return this[_g]||this[XAe](o),a}[qg](e,r,o){!this[jf].length&&!this[qf]?this.emit(e,r,o):this[jf].push([e,r,o])}[XAe](e){switch(this[qg]("meta",this[Dh]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[ec]=JAe.parse(this[Dh],this[ec],!1);break;case"GlobalExtendedHeader":this[p2]=JAe.parse(this[Dh],this[p2],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[ec]=this[ec]||Object.create(null),this[ec].path=this[Dh].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[ec]=this[ec]||Object.create(null),this[ec].linkpath=this[Dh].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[Sh]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[Sh])return;if(this[La]===null&&e){if(this[yi]&&(e=Buffer.concat([this[yi],e]),this[yi]=null),e.lengththis[ok](n)),this[La].on("error",n=>this.abort(n)),this[La].on("end",n=>{this[Hg]=!0,this[ok]()}),this[h2]=!0;let a=this[La][o?"end":"write"](e);return this[h2]=!1,a}}this[h2]=!0,this[La]?this[La].write(e):this[ok](e),this[h2]=!1;let r=this[jf].length?!1:this[qf]?this[qf].flowing:!0;return!r&&!this[jf].length&&this[qf].once("drain",o=>this.emit("drain")),r}[d_](e){e&&!this[Sh]&&(this[yi]=this[yi]?Buffer.concat([this[yi],e]):e)}[m_](){if(this[Hg]&&!this[ZAe]&&!this[Sh]&&!this[lk]){this[ZAe]=!0;let e=this[_g];if(e&&e.blockRemain){let r=this[yi]?this[yi].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[yi]&&e.write(this[yi]),e.end()}this[qg](ck)}}[ok](e){if(this[lk])this[d_](e);else if(!e&&!this[yi])this[m_]();else{if(this[lk]=!0,this[yi]){this[d_](e);let r=this[yi];this[yi]=null,this[ak](r)}else this[ak](e);for(;this[yi]&&this[yi].length>=512&&!this[Sh]&&!this[Ak];){let r=this[yi];this[yi]=null,this[ak](r)}this[lk]=!1}(!this[yi]||this[Hg])&&this[m_]()}[ak](e){let r=0,o=e.length;for(;r+512<=o&&!this[Sh]&&!this[Ak];)switch(this[$l]){case"begin":case"header":this[efe](e,r),r+=512;break;case"ignore":case"body":r+=this[g_](e,r);break;case"meta":r+=this[$Ae](e,r);break;default:throw new Error("invalid state: "+this[$l])}r{"use strict";var wlt=Fy(),nfe=fk(),zy=ve("fs"),Blt=Jy(),rfe=ve("path"),y_=_y();sfe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=wlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Dlt(o,e),o.noResume||vlt(o),o.file&&o.sync?Slt(o):o.file?Plt(o,r):ife(o)};var vlt=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Dlt=(t,e)=>{let r=new Map(e.map(n=>[y_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||rfe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(rfe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(y_(n)):n=>a(y_(n))},Slt=t=>{let e=ife(t),r=t.file,o=!0,a;try{let n=zy.statSync(r),u=t.maxReadSize||16*1024*1024;if(n.size{let r=new nfe(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("end",u),zy.stat(a,(p,h)=>{if(p)A(p);else{let E=new Blt.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},ife=t=>new nfe(t)});var Afe=_((Y4t,ufe)=>{"use strict";var xlt=Fy(),hk=Zb(),ofe=Jy(),afe=pk(),lfe=ve("path");ufe.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let o=xlt(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return o.file&&o.sync?blt(o,e):o.file?klt(o,e,r):o.sync?Qlt(o,e):Flt(o,e)};var blt=(t,e)=>{let r=new hk.Sync(t),o=new ofe.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(o),cfe(r,e)},klt=(t,e,r)=>{let o=new hk(t),a=new ofe.WriteStream(t.file,{mode:t.mode||438});o.pipe(a);let n=new Promise((u,A)=>{a.on("error",A),a.on("close",u),o.on("error",A)});return E_(o,e),r?n.then(r,r):n},cfe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?afe({file:lfe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},E_=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return afe({file:lfe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>E_(t,e));t.add(r)}t.end()},Qlt=(t,e)=>{let r=new hk.Sync(t);return cfe(r,e),r},Flt=(t,e)=>{let r=new hk(t);return E_(r,e),r}});var C_=_((V4t,yfe)=>{"use strict";var Rlt=Fy(),ffe=Zb(),dl=ve("fs"),pfe=Jy(),hfe=pk(),gfe=ve("path"),dfe=Uy();yfe.exports=(t,e,r)=>{let o=Rlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),o.sync?Tlt(o,e):Nlt(o,e,r)};var Tlt=(t,e)=>{let r=new ffe.Sync(t),o=!0,a,n;try{try{a=dl.openSync(t.file,"r+")}catch(p){if(p.code==="ENOENT")a=dl.openSync(t.file,"w+");else throw p}let u=dl.fstatSync(a),A=Buffer.alloc(512);e:for(n=0;nu.size)break;n+=h,t.mtimeCache&&t.mtimeCache.set(p.path,p.mtime)}o=!1,Llt(t,r,n,a,e)}finally{if(o)try{dl.closeSync(a)}catch{}}},Llt=(t,e,r,o,a)=>{let n=new pfe.WriteStreamSync(t.file,{fd:o,start:r});e.pipe(n),Olt(e,a)},Nlt=(t,e,r)=>{e=Array.from(e);let o=new ffe(t),a=(u,A,p)=>{let h=(C,T)=>{C?dl.close(u,N=>p(C)):p(null,T)},E=0;if(A===0)return h(null,0);let w=0,D=Buffer.alloc(512),b=(C,T)=>{if(C)return h(C);if(w+=T,w<512&&T)return dl.read(u,D,w,D.length-w,E+w,b);if(E===0&&D[0]===31&&D[1]===139)return h(new Error("cannot append to compressed archives"));if(w<512)return h(null,E);let N=new dfe(D);if(!N.cksumValid)return h(null,E);let U=512*Math.ceil(N.size/512);if(E+U+512>A||(E+=U+512,E>=A))return h(null,E);t.mtimeCache&&t.mtimeCache.set(N.path,N.mtime),w=0,dl.read(u,D,0,512,E,b)};dl.read(u,D,0,512,E,b)},n=new Promise((u,A)=>{o.on("error",A);let p="r+",h=(E,w)=>{if(E&&E.code==="ENOENT"&&p==="r+")return p="w+",dl.open(t.file,p,h);if(E)return A(E);dl.fstat(w,(D,b)=>{if(D)return dl.close(w,()=>A(D));a(w,b.size,(C,T)=>{if(C)return A(C);let N=new pfe.WriteStream(t.file,{fd:w,start:T});o.pipe(N),N.on("error",A),N.on("close",u),mfe(o,e)})})};dl.open(t.file,p,h)});return r?n.then(r,r):n},Olt=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?hfe({file:gfe.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:o=>t.add(o)}):t.add(r)}),t.end()},mfe=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return hfe({file:gfe.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:o=>t.add(o)}).then(o=>mfe(t,e));t.add(r)}t.end()}});var Cfe=_((K4t,Efe)=>{"use strict";var Mlt=Fy(),Ult=C_();Efe.exports=(t,e,r)=>{let o=Mlt(t);if(!o.file)throw new TypeError("file is required");if(o.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),_lt(o),Ult(o,e,r)};var _lt=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,o)=>e(r,o)&&!(t.mtimeCache.get(r)>o.mtime):(r,o)=>!(t.mtimeCache.get(r)>o.mtime)}});var Bfe=_((J4t,wfe)=>{var{promisify:Ife}=ve("util"),Ph=ve("fs"),Hlt=t=>{if(!t)t={mode:511,fs:Ph};else if(typeof t=="object")t={mode:511,fs:Ph,...t};else if(typeof t=="number")t={mode:t,fs:Ph};else if(typeof t=="string")t={mode:parseInt(t,8),fs:Ph};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||Ph.mkdir,t.mkdirAsync=Ife(t.mkdir),t.stat=t.stat||t.fs.stat||Ph.stat,t.statAsync=Ife(t.stat),t.statSync=t.statSync||t.fs.statSync||Ph.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Ph.mkdirSync,t};wfe.exports=Hlt});var Dfe=_((z4t,vfe)=>{var qlt=process.platform,{resolve:jlt,parse:Glt}=ve("path"),Wlt=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=jlt(t),qlt==="win32"){let e=/[*|"<>?:]/,{root:r}=Glt(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};vfe.exports=Wlt});var kfe=_((X4t,bfe)=>{var{dirname:Sfe}=ve("path"),Pfe=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(o=>o.isDirectory()?r:void 0,o=>o.code==="ENOENT"?Pfe(t,Sfe(e),e):void 0),xfe=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(o){return o.code==="ENOENT"?xfe(t,Sfe(e),e):void 0}};bfe.exports={findMade:Pfe,findMadeSync:xfe}});var B_=_((Z4t,Ffe)=>{var{dirname:Qfe}=ve("path"),I_=(t,e,r)=>{e.recursive=!1;let o=Qfe(t);return o===t?e.mkdirAsync(t,e).catch(a=>{if(a.code!=="EISDIR")throw a}):e.mkdirAsync(t,e).then(()=>r||t,a=>{if(a.code==="ENOENT")return I_(o,e).then(n=>I_(t,e,n));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;return e.statAsync(t).then(n=>{if(n.isDirectory())return r;throw a},()=>{throw a})})},w_=(t,e,r)=>{let o=Qfe(t);if(e.recursive=!1,o===t)try{return e.mkdirSync(t,e)}catch(a){if(a.code!=="EISDIR")throw a;return}try{return e.mkdirSync(t,e),r||t}catch(a){if(a.code==="ENOENT")return w_(t,e,w_(o,e,r));if(a.code!=="EEXIST"&&a.code!=="EROFS")throw a;try{if(!e.statSync(t).isDirectory())throw a}catch{throw a}}};Ffe.exports={mkdirpManual:I_,mkdirpManualSync:w_}});var Lfe=_(($4t,Tfe)=>{var{dirname:Rfe}=ve("path"),{findMade:Ylt,findMadeSync:Vlt}=kfe(),{mkdirpManual:Klt,mkdirpManualSync:Jlt}=B_(),zlt=(t,e)=>(e.recursive=!0,Rfe(t)===t?e.mkdirAsync(t,e):Ylt(e,t).then(o=>e.mkdirAsync(t,e).then(()=>o).catch(a=>{if(a.code==="ENOENT")return Klt(t,e);throw a}))),Xlt=(t,e)=>{if(e.recursive=!0,Rfe(t)===t)return e.mkdirSync(t,e);let o=Vlt(e,t);try{return e.mkdirSync(t,e),o}catch(a){if(a.code==="ENOENT")return Jlt(t,e);throw a}};Tfe.exports={mkdirpNative:zlt,mkdirpNativeSync:Xlt}});var Ufe=_((eUt,Mfe)=>{var Nfe=ve("fs"),Zlt=process.version,v_=Zlt.replace(/^v/,"").split("."),Ofe=+v_[0]>10||+v_[0]==10&&+v_[1]>=12,$lt=Ofe?t=>t.mkdir===Nfe.mkdir:()=>!1,ect=Ofe?t=>t.mkdirSync===Nfe.mkdirSync:()=>!1;Mfe.exports={useNative:$lt,useNativeSync:ect}});var Wfe=_((tUt,Gfe)=>{var Xy=Bfe(),Zy=Dfe(),{mkdirpNative:_fe,mkdirpNativeSync:Hfe}=Lfe(),{mkdirpManual:qfe,mkdirpManualSync:jfe}=B_(),{useNative:tct,useNativeSync:rct}=Ufe(),$y=(t,e)=>(t=Zy(t),e=Xy(e),tct(e)?_fe(t,e):qfe(t,e)),nct=(t,e)=>(t=Zy(t),e=Xy(e),rct(e)?Hfe(t,e):jfe(t,e));$y.sync=nct;$y.native=(t,e)=>_fe(Zy(t),Xy(e));$y.manual=(t,e)=>qfe(Zy(t),Xy(e));$y.nativeSync=(t,e)=>Hfe(Zy(t),Xy(e));$y.manualSync=(t,e)=>jfe(Zy(t),Xy(e));Gfe.exports=$y});var Zfe=_((rUt,Xfe)=>{"use strict";var tc=ve("fs"),Gg=ve("path"),ict=tc.lchown?"lchown":"chown",sct=tc.lchownSync?"lchownSync":"chownSync",Vfe=tc.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),Yfe=(t,e,r)=>{try{return tc[sct](t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},oct=(t,e,r)=>{try{return tc.chownSync(t,e,r)}catch(o){if(o.code!=="ENOENT")throw o}},act=Vfe?(t,e,r,o)=>a=>{!a||a.code!=="EISDIR"?o(a):tc.chown(t,e,r,o)}:(t,e,r,o)=>o,D_=Vfe?(t,e,r)=>{try{return Yfe(t,e,r)}catch(o){if(o.code!=="EISDIR")throw o;oct(t,e,r)}}:(t,e,r)=>Yfe(t,e,r),lct=process.version,Kfe=(t,e,r)=>tc.readdir(t,e,r),cct=(t,e)=>tc.readdirSync(t,e);/^v4\./.test(lct)&&(Kfe=(t,e,r)=>tc.readdir(t,r));var gk=(t,e,r,o)=>{tc[ict](t,e,r,act(t,e,r,a=>{o(a&&a.code!=="ENOENT"?a:null)}))},Jfe=(t,e,r,o,a)=>{if(typeof e=="string")return tc.lstat(Gg.resolve(t,e),(n,u)=>{if(n)return a(n.code!=="ENOENT"?n:null);u.name=e,Jfe(t,u,r,o,a)});if(e.isDirectory())S_(Gg.resolve(t,e.name),r,o,n=>{if(n)return a(n);let u=Gg.resolve(t,e.name);gk(u,r,o,a)});else{let n=Gg.resolve(t,e.name);gk(n,r,o,a)}},S_=(t,e,r,o)=>{Kfe(t,{withFileTypes:!0},(a,n)=>{if(a){if(a.code==="ENOENT")return o();if(a.code!=="ENOTDIR"&&a.code!=="ENOTSUP")return o(a)}if(a||!n.length)return gk(t,e,r,o);let u=n.length,A=null,p=h=>{if(!A){if(h)return o(A=h);if(--u===0)return gk(t,e,r,o)}};n.forEach(h=>Jfe(t,h,e,r,p))})},uct=(t,e,r,o)=>{if(typeof e=="string")try{let a=tc.lstatSync(Gg.resolve(t,e));a.name=e,e=a}catch(a){if(a.code==="ENOENT")return;throw a}e.isDirectory()&&zfe(Gg.resolve(t,e.name),r,o),D_(Gg.resolve(t,e.name),r,o)},zfe=(t,e,r)=>{let o;try{o=cct(t,{withFileTypes:!0})}catch(a){if(a.code==="ENOENT")return;if(a.code==="ENOTDIR"||a.code==="ENOTSUP")return D_(t,e,r);throw a}return o&&o.length&&o.forEach(a=>uct(t,a,e,r)),D_(t,e,r)};Xfe.exports=S_;S_.sync=zfe});var rpe=_((nUt,P_)=>{"use strict";var $fe=Wfe(),rc=ve("fs"),dk=ve("path"),epe=Zfe(),$c=Oy(),mk=class extends Error{constructor(e,r){super("Cannot extract through symbolic link"),this.path=r,this.symlink=e}get name(){return"SylinkError"}},yk=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'"),this.path=e,this.code=r}get name(){return"CwdError"}},Ek=(t,e)=>t.get($c(e)),g2=(t,e,r)=>t.set($c(e),r),Act=(t,e)=>{rc.stat(t,(r,o)=>{(r||!o.isDirectory())&&(r=new yk(t,r&&r.code||"ENOTDIR")),e(r)})};P_.exports=(t,e,r)=>{t=$c(t);let o=e.umask,a=e.mode|448,n=(a&o)!==0,u=e.uid,A=e.gid,p=typeof u=="number"&&typeof A=="number"&&(u!==e.processUid||A!==e.processGid),h=e.preserve,E=e.unlink,w=e.cache,D=$c(e.cwd),b=(N,U)=>{N?r(N):(g2(w,t,!0),U&&p?epe(U,u,A,J=>b(J)):n?rc.chmod(t,a,r):r())};if(w&&Ek(w,t)===!0)return b();if(t===D)return Act(t,b);if(h)return $fe(t,{mode:a}).then(N=>b(null,N),b);let T=$c(dk.relative(D,t)).split("/");Ck(D,T,a,w,E,D,null,b)};var Ck=(t,e,r,o,a,n,u,A)=>{if(!e.length)return A(null,u);let p=e.shift(),h=$c(dk.resolve(t+"/"+p));if(Ek(o,h))return Ck(h,e,r,o,a,n,u,A);rc.mkdir(h,r,tpe(h,e,r,o,a,n,u,A))},tpe=(t,e,r,o,a,n,u,A)=>p=>{p?rc.lstat(t,(h,E)=>{if(h)h.path=h.path&&$c(h.path),A(h);else if(E.isDirectory())Ck(t,e,r,o,a,n,u,A);else if(a)rc.unlink(t,w=>{if(w)return A(w);rc.mkdir(t,r,tpe(t,e,r,o,a,n,u,A))});else{if(E.isSymbolicLink())return A(new mk(t,t+"/"+e.join("/")));A(p)}}):(u=u||t,Ck(t,e,r,o,a,n,u,A))},fct=t=>{let e=!1,r="ENOTDIR";try{e=rc.statSync(t).isDirectory()}catch(o){r=o.code}finally{if(!e)throw new yk(t,r)}};P_.exports.sync=(t,e)=>{t=$c(t);let r=e.umask,o=e.mode|448,a=(o&r)!==0,n=e.uid,u=e.gid,A=typeof n=="number"&&typeof u=="number"&&(n!==e.processUid||u!==e.processGid),p=e.preserve,h=e.unlink,E=e.cache,w=$c(e.cwd),D=N=>{g2(E,t,!0),N&&A&&epe.sync(N,n,u),a&&rc.chmodSync(t,o)};if(E&&Ek(E,t)===!0)return D();if(t===w)return fct(w),D();if(p)return D($fe.sync(t,o));let C=$c(dk.relative(w,t)).split("/"),T=null;for(let N=C.shift(),U=w;N&&(U+="/"+N);N=C.shift())if(U=$c(dk.resolve(U)),!Ek(E,U))try{rc.mkdirSync(U,o),T=T||U,g2(E,U,!0)}catch{let te=rc.lstatSync(U);if(te.isDirectory()){g2(E,U,!0);continue}else if(h){rc.unlinkSync(U),rc.mkdirSync(U,o),T=T||U,g2(E,U,!0);continue}else if(te.isSymbolicLink())return new mk(U,U+"/"+C.join("/"))}return D(T)}});var b_=_((iUt,npe)=>{var x_=Object.create(null),{hasOwnProperty:pct}=Object.prototype;npe.exports=t=>(pct.call(x_,t)||(x_[t]=t.normalize("NFKD")),x_[t])});var ape=_((sUt,ope)=>{var ipe=ve("assert"),hct=b_(),gct=_y(),{join:spe}=ve("path"),dct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,mct=dct==="win32";ope.exports=()=>{let t=new Map,e=new Map,r=h=>h.split("/").slice(0,-1).reduce((w,D)=>(w.length&&(D=spe(w[w.length-1],D)),w.push(D||"/"),w),[]),o=new Set,a=h=>{let E=e.get(h);if(!E)throw new Error("function does not have any path reservations");return{paths:E.paths.map(w=>t.get(w)),dirs:[...E.dirs].map(w=>t.get(w))}},n=h=>{let{paths:E,dirs:w}=a(h);return E.every(D=>D[0]===h)&&w.every(D=>D[0]instanceof Set&&D[0].has(h))},u=h=>o.has(h)||!n(h)?!1:(o.add(h),h(()=>A(h)),!0),A=h=>{if(!o.has(h))return!1;let{paths:E,dirs:w}=e.get(h),D=new Set;return E.forEach(b=>{let C=t.get(b);ipe.equal(C[0],h),C.length===1?t.delete(b):(C.shift(),typeof C[0]=="function"?D.add(C[0]):C[0].forEach(T=>D.add(T)))}),w.forEach(b=>{let C=t.get(b);ipe(C[0]instanceof Set),C[0].size===1&&C.length===1?t.delete(b):C[0].size===1?(C.shift(),D.add(C[0])):C[0].delete(h)}),o.delete(h),D.forEach(b=>u(b)),!0};return{check:n,reserve:(h,E)=>{h=mct?["win32 parallelization disabled"]:h.map(D=>hct(gct(spe(D))).toLowerCase());let w=new Set(h.map(D=>r(D)).reduce((D,b)=>D.concat(b)));return e.set(E,{dirs:w,paths:h}),h.forEach(D=>{let b=t.get(D);b?b.push(E):t.set(D,[E])}),w.forEach(D=>{let b=t.get(D);b?b[b.length-1]instanceof Set?b[b.length-1].add(E):b.push(new Set([E])):t.set(D,[new Set([E])])}),u(E)}}}});var upe=_((oUt,cpe)=>{var yct=process.platform,Ect=yct==="win32",Cct=global.__FAKE_TESTING_FS__||ve("fs"),{O_CREAT:Ict,O_TRUNC:wct,O_WRONLY:Bct,UV_FS_O_FILEMAP:lpe=0}=Cct.constants,vct=Ect&&!!lpe,Dct=512*1024,Sct=lpe|wct|Ict|Bct;cpe.exports=vct?t=>t"w"});var M_=_((aUt,vpe)=>{"use strict";var Pct=ve("assert"),xct=fk(),Fn=ve("fs"),bct=Jy(),Gf=ve("path"),Ipe=rpe(),Ape=M3(),kct=ape(),Qct=U3(),ml=Oy(),Fct=_y(),Rct=b_(),fpe=Symbol("onEntry"),F_=Symbol("checkFs"),ppe=Symbol("checkFs2"),Bk=Symbol("pruneCache"),R_=Symbol("isReusable"),nc=Symbol("makeFs"),T_=Symbol("file"),L_=Symbol("directory"),vk=Symbol("link"),hpe=Symbol("symlink"),gpe=Symbol("hardlink"),dpe=Symbol("unsupported"),mpe=Symbol("checkPath"),xh=Symbol("mkdir"),Po=Symbol("onError"),Ik=Symbol("pending"),ype=Symbol("pend"),eE=Symbol("unpend"),k_=Symbol("ended"),Q_=Symbol("maybeClose"),N_=Symbol("skip"),d2=Symbol("doChown"),m2=Symbol("uid"),y2=Symbol("gid"),E2=Symbol("checkedCwd"),wpe=ve("crypto"),Bpe=upe(),Tct=process.env.TESTING_TAR_FAKE_PLATFORM||process.platform,C2=Tct==="win32",Lct=(t,e)=>{if(!C2)return Fn.unlink(t,e);let r=t+".DELETE."+wpe.randomBytes(16).toString("hex");Fn.rename(t,r,o=>{if(o)return e(o);Fn.unlink(r,e)})},Nct=t=>{if(!C2)return Fn.unlinkSync(t);let e=t+".DELETE."+wpe.randomBytes(16).toString("hex");Fn.renameSync(t,e),Fn.unlinkSync(e)},Epe=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,Cpe=t=>Rct(Fct(ml(t))).toLowerCase(),Oct=(t,e)=>{e=Cpe(e);for(let r of t.keys()){let o=Cpe(r);(o===e||o.indexOf(e+"/")===0)&&t.delete(r)}},Mct=t=>{for(let e of t.keys())t.delete(e)},I2=class extends xct{constructor(e){if(e||(e={}),e.ondone=r=>{this[k_]=!0,this[Q_]()},super(e),this[E2]=!1,this.reservations=kct(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[Ik]=0,this[k_]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||C2,this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=ml(Gf.resolve(e.cwd||process.cwd())),this.strip=+e.strip||0,this.processUmask=e.noChmod?0:process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[fpe](r))}warn(e,r,o={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(o.recoverable=!1),super.warn(e,r,o)}[Q_](){this[k_]&&this[Ik]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[mpe](e){if(this.strip){let r=ml(e.path).split("/");if(r.length=this.strip)e.linkpath=o.slice(this.strip).join("/");else return!1}}if(!this.preservePaths){let r=ml(e.path),o=r.split("/");if(o.includes("..")||C2&&/^[a-z]:\.\.$/i.test(o[0]))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;let[a,n]=Qct(r);a&&(e.path=n,this.warn("TAR_ENTRY_INFO",`stripping ${a} from absolute path`,{entry:e,path:r}))}if(Gf.isAbsolute(e.path)?e.absolute=ml(Gf.resolve(e.path)):e.absolute=ml(Gf.resolve(this.cwd,e.path)),!this.preservePaths&&e.absolute.indexOf(this.cwd+"/")!==0&&e.absolute!==this.cwd)return this.warn("TAR_ENTRY_ERROR","path escaped extraction target",{entry:e,path:ml(e.path),resolvedPath:e.absolute,cwd:this.cwd}),!1;if(e.absolute===this.cwd&&e.type!=="Directory"&&e.type!=="GNUDumpDir")return!1;if(this.win32){let{root:r}=Gf.win32.parse(e.absolute);e.absolute=r+Ape.encode(e.absolute.substr(r.length));let{root:o}=Gf.win32.parse(e.path);e.path=o+Ape.encode(e.path.substr(o.length))}return!0}[fpe](e){if(!this[mpe](e))return e.resume();switch(Pct.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[F_](e);case"CharacterDevice":case"BlockDevice":case"FIFO":default:return this[dpe](e)}}[Po](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[eE](),r.resume())}[xh](e,r,o){Ipe(ml(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r,noChmod:this.noChmod},o)}[d2](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[m2](e){return Epe(this.uid,e.uid,this.processUid)}[y2](e){return Epe(this.gid,e.gid,this.processGid)}[T_](e,r){let o=e.mode&4095||this.fmode,a=new bct.WriteStream(e.absolute,{flags:Bpe(e.size),mode:o,autoClose:!1});a.on("error",p=>{a.fd&&Fn.close(a.fd,()=>{}),a.write=()=>!0,this[Po](p,e),r()});let n=1,u=p=>{if(p){a.fd&&Fn.close(a.fd,()=>{}),this[Po](p,e),r();return}--n===0&&Fn.close(a.fd,h=>{h?this[Po](h,e):this[eE](),r()})};a.on("finish",p=>{let h=e.absolute,E=a.fd;if(e.mtime&&!this.noMtime){n++;let w=e.atime||new Date,D=e.mtime;Fn.futimes(E,w,D,b=>b?Fn.utimes(h,w,D,C=>u(C&&b)):u())}if(this[d2](e)){n++;let w=this[m2](e),D=this[y2](e);Fn.fchown(E,w,D,b=>b?Fn.chown(h,w,D,C=>u(C&&b)):u())}u()});let A=this.transform&&this.transform(e)||e;A!==e&&(A.on("error",p=>{this[Po](p,e),r()}),e.pipe(A)),A.pipe(a)}[L_](e,r){let o=e.mode&4095||this.dmode;this[xh](e.absolute,o,a=>{if(a){this[Po](a,e),r();return}let n=1,u=A=>{--n===0&&(r(),this[eE](),e.resume())};e.mtime&&!this.noMtime&&(n++,Fn.utimes(e.absolute,e.atime||new Date,e.mtime,u)),this[d2](e)&&(n++,Fn.chown(e.absolute,this[m2](e),this[y2](e),u)),u()})}[dpe](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[hpe](e,r){this[vk](e,e.linkpath,"symlink",r)}[gpe](e,r){let o=ml(Gf.resolve(this.cwd,e.linkpath));this[vk](e,o,"link",r)}[ype](){this[Ik]++}[eE](){this[Ik]--,this[Q_]()}[N_](e){this[eE](),e.resume()}[R_](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&!C2}[F_](e){this[ype]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,o=>this[ppe](e,o))}[Bk](e){e.type==="SymbolicLink"?Mct(this.dirCache):e.type!=="Directory"&&Oct(this.dirCache,e.absolute)}[ppe](e,r){this[Bk](e);let o=A=>{this[Bk](e),r(A)},a=()=>{this[xh](this.cwd,this.dmode,A=>{if(A){this[Po](A,e),o();return}this[E2]=!0,n()})},n=()=>{if(e.absolute!==this.cwd){let A=ml(Gf.dirname(e.absolute));if(A!==this.cwd)return this[xh](A,this.dmode,p=>{if(p){this[Po](p,e),o();return}u()})}u()},u=()=>{Fn.lstat(e.absolute,(A,p)=>{if(p&&(this.keep||this.newer&&p.mtime>e.mtime)){this[N_](e),o();return}if(A||this[R_](e,p))return this[nc](null,e,o);if(p.isDirectory()){if(e.type==="Directory"){let h=!this.noChmod&&e.mode&&(p.mode&4095)!==e.mode,E=w=>this[nc](w,e,o);return h?Fn.chmod(e.absolute,e.mode,E):E()}if(e.absolute!==this.cwd)return Fn.rmdir(e.absolute,h=>this[nc](h,e,o))}if(e.absolute===this.cwd)return this[nc](null,e,o);Lct(e.absolute,h=>this[nc](h,e,o))})};this[E2]?n():a()}[nc](e,r,o){if(e){this[Po](e,r),o();return}switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[T_](r,o);case"Link":return this[gpe](r,o);case"SymbolicLink":return this[hpe](r,o);case"Directory":case"GNUDumpDir":return this[L_](r,o)}}[vk](e,r,o,a){Fn[o](r,e.absolute,n=>{n?this[Po](n,e):(this[eE](),e.resume()),a()})}},wk=t=>{try{return[null,t()]}catch(e){return[e,null]}},O_=class extends I2{[nc](e,r){return super[nc](e,r,()=>{})}[F_](e){if(this[Bk](e),!this[E2]){let n=this[xh](this.cwd,this.dmode);if(n)return this[Po](n,e);this[E2]=!0}if(e.absolute!==this.cwd){let n=ml(Gf.dirname(e.absolute));if(n!==this.cwd){let u=this[xh](n,this.dmode);if(u)return this[Po](u,e)}}let[r,o]=wk(()=>Fn.lstatSync(e.absolute));if(o&&(this.keep||this.newer&&o.mtime>e.mtime))return this[N_](e);if(r||this[R_](e,o))return this[nc](null,e);if(o.isDirectory()){if(e.type==="Directory"){let u=!this.noChmod&&e.mode&&(o.mode&4095)!==e.mode,[A]=u?wk(()=>{Fn.chmodSync(e.absolute,e.mode)}):[];return this[nc](A,e)}let[n]=wk(()=>Fn.rmdirSync(e.absolute));this[nc](n,e)}let[a]=e.absolute===this.cwd?[]:wk(()=>Nct(e.absolute));this[nc](a,e)}[T_](e,r){let o=e.mode&4095||this.fmode,a=A=>{let p;try{Fn.closeSync(n)}catch(h){p=h}(A||p)&&this[Po](A||p,e),r()},n;try{n=Fn.openSync(e.absolute,Bpe(e.size),o)}catch(A){return a(A)}let u=this.transform&&this.transform(e)||e;u!==e&&(u.on("error",A=>this[Po](A,e)),e.pipe(u)),u.on("data",A=>{try{Fn.writeSync(n,A,0,A.length)}catch(p){a(p)}}),u.on("end",A=>{let p=null;if(e.mtime&&!this.noMtime){let h=e.atime||new Date,E=e.mtime;try{Fn.futimesSync(n,h,E)}catch(w){try{Fn.utimesSync(e.absolute,h,E)}catch{p=w}}}if(this[d2](e)){let h=this[m2](e),E=this[y2](e);try{Fn.fchownSync(n,h,E)}catch(w){try{Fn.chownSync(e.absolute,h,E)}catch{p=p||w}}}a(p)})}[L_](e,r){let o=e.mode&4095||this.dmode,a=this[xh](e.absolute,o);if(a){this[Po](a,e),r();return}if(e.mtime&&!this.noMtime)try{Fn.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch{}if(this[d2](e))try{Fn.chownSync(e.absolute,this[m2](e),this[y2](e))}catch{}r(),e.resume()}[xh](e,r){try{return Ipe.sync(ml(e),{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(o){return o}}[vk](e,r,o,a){try{Fn[o+"Sync"](r,e.absolute),a(),e.resume()}catch(n){return this[Po](n,e)}}};I2.Sync=O_;vpe.exports=I2});var bpe=_((lUt,xpe)=>{"use strict";var Uct=Fy(),Dk=M_(),Spe=ve("fs"),Ppe=Jy(),Dpe=ve("path"),U_=_y();xpe.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let o=Uct(t);if(o.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!o.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&_ct(o,e),o.file&&o.sync?Hct(o):o.file?qct(o,r):o.sync?jct(o):Gct(o)};var _ct=(t,e)=>{let r=new Map(e.map(n=>[U_(n),!0])),o=t.filter,a=(n,u)=>{let A=u||Dpe.parse(n).root||".",p=n===A?!1:r.has(n)?r.get(n):a(Dpe.dirname(n),A);return r.set(n,p),p};t.filter=o?(n,u)=>o(n,u)&&a(U_(n)):n=>a(U_(n))},Hct=t=>{let e=new Dk.Sync(t),r=t.file,o=Spe.statSync(r),a=t.maxReadSize||16*1024*1024;new Ppe.ReadStreamSync(r,{readSize:a,size:o.size}).pipe(e)},qct=(t,e)=>{let r=new Dk(t),o=t.maxReadSize||16*1024*1024,a=t.file,n=new Promise((u,A)=>{r.on("error",A),r.on("close",u),Spe.stat(a,(p,h)=>{if(p)A(p);else{let E=new Ppe.ReadStream(a,{readSize:o,size:h.size});E.on("error",A),E.pipe(r)}})});return e?n.then(e,e):n},jct=t=>new Dk.Sync(t),Gct=t=>new Dk(t)});var kpe=_(us=>{"use strict";us.c=us.create=Afe();us.r=us.replace=C_();us.t=us.list=pk();us.u=us.update=Cfe();us.x=us.extract=bpe();us.Pack=Zb();us.Unpack=M_();us.Parse=fk();us.ReadEntry=Lb();us.WriteEntry=J3();us.Header=Uy();us.Pax=Ob();us.types=Q3()});var __,Qpe,bh,w2,B2,Fpe=It(()=>{__=et(lg()),Qpe=ve("worker_threads"),bh=Symbol("kTaskInfo"),w2=class{constructor(e,r){this.fn=e;this.limit=(0,__.default)(r.poolSize)}run(e){return this.limit(()=>this.fn(e))}},B2=class{constructor(e,r){this.source=e;this.workers=[];this.limit=(0,__.default)(r.poolSize),this.cleanupInterval=setInterval(()=>{if(this.limit.pendingCount===0&&this.limit.activeCount===0){let o=this.workers.pop();o?o.terminate():clearInterval(this.cleanupInterval)}},5e3).unref()}createWorker(){this.cleanupInterval.refresh();let e=new Qpe.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return e.on("message",r=>{if(!e[bh])throw new Error("Assertion failed: Worker sent a result without having a task assigned");e[bh].resolve(r),e[bh]=null,e.unref(),this.workers.push(e)}),e.on("error",r=>{e[bh]?.reject(r),e[bh]=null}),e.on("exit",r=>{r!==0&&e[bh]?.reject(new Error(`Worker exited with code ${r}`)),e[bh]=null}),e}run(e){return this.limit(()=>{let r=this.workers.pop()??this.createWorker();return r.ref(),new Promise((o,a)=>{r[bh]={resolve:o,reject:a},r.postMessage(e)})})}}});var Tpe=_((fUt,Rpe)=>{var H_;Rpe.exports.getContent=()=>(typeof H_>"u"&&(H_=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),H_)});var $i={};Vt($i,{convertToZip:()=>Kct,convertToZipWorker:()=>G_,extractArchiveTo:()=>Upe,getDefaultTaskPool:()=>Ope,getTaskPoolForConfiguration:()=>Mpe,makeArchiveFromDirectory:()=>Vct});function Wct(t,e){switch(t){case"async":return new w2(G_,{poolSize:e});case"workers":return new B2((0,j_.getContent)(),{poolSize:e});default:throw new Error(`Assertion failed: Unknown value ${t} for taskPoolMode`)}}function Ope(){return typeof q_>"u"&&(q_=Wct("workers",Xi.availableParallelism())),q_}function Mpe(t){return typeof t>"u"?Ope():Al(Yct,t,()=>{let e=t.get("taskPoolMode"),r=t.get("taskPoolConcurrency");switch(e){case"async":return new w2(G_,{poolSize:r});case"workers":return new B2((0,j_.getContent)(),{poolSize:r});default:throw new Error(`Assertion failed: Unknown value ${e} for taskPoolMode`)}})}async function G_(t){let{tmpFile:e,tgz:r,compressionLevel:o,extractBufferOpts:a}=t,n=new Zi(e,{create:!0,level:o,stats:wa.makeDefaultStats()}),u=Buffer.from(r.buffer,r.byteOffset,r.byteLength);return await Upe(u,n,a),n.saveAndClose(),e}async function Vct(t,{baseFs:e=new _n,prefixPath:r=Bt.root,compressionLevel:o,inMemory:a=!1}={}){let n;if(a)n=new Zi(null,{level:o});else{let A=await ae.mktempPromise(),p=V.join(A,"archive.zip");n=new Zi(p,{create:!0,level:o})}let u=V.resolve(Bt.root,r);return await n.copyPromise(u,t,{baseFs:e,stableTime:!0,stableSort:!0}),n}async function Kct(t,e={}){let r=await ae.mktempPromise(),o=V.join(r,"archive.zip"),a=e.compressionLevel??e.configuration?.get("compressionLevel")??"mixed",n={prefixPath:e.prefixPath,stripComponents:e.stripComponents};return await(e.taskPool??Mpe(e.configuration)).run({tmpFile:o,tgz:t,compressionLevel:a,extractBufferOpts:n}),new Zi(o,{level:e.compressionLevel})}async function*Jct(t){let e=new Npe.default.Parse,r=new Lpe.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",o=>{r.write(o)}),e.on("error",o=>{r.destroy(o)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let o of r){let a=o;yield a,a.resume()}}async function Upe(t,e,{stripComponents:r=0,prefixPath:o=Bt.dot}={}){function a(n){if(n.path[0]==="/")return!0;let u=n.path.split(/\//g);return!!(u.some(A=>A==="..")||u.length<=r)}for await(let n of Jct(t)){if(a(n))continue;let u=V.normalize(Ae.toPortablePath(n.path)).replace(/\/$/,"").split(/\//g);if(u.length<=r)continue;let A=u.slice(r).join("/"),p=V.join(o,A),h=420;switch((n.type==="Directory"||(n.mode??0)&73)&&(h|=73),n.type){case"Directory":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),e.mkdirSync(p,{mode:h}),e.utimesSync(p,Si.SAFE_TIME,Si.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),e.writeFileSync(p,await Xm(n),{mode:h}),e.utimesSync(p,Si.SAFE_TIME,Si.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(V.dirname(p),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),e.symlinkSync(n.linkpath,p),e.lutimesSync(p,Si.SAFE_TIME,Si.SAFE_TIME);break}}return e}var Lpe,Npe,j_,q_,Yct,_pe=It(()=>{Ve();St();sA();Lpe=ve("stream"),Npe=et(kpe());Fpe();Gl();j_=et(Tpe());Yct=new WeakMap});var qpe=_((W_,Hpe)=>{(function(t,e){typeof W_=="object"?Hpe.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(W_,function(){function t(a,n){var u=n?"\u2514":"\u251C";return a?u+="\u2500 ":u+="\u2500\u2500\u2510",u}function e(a,n){var u=[];for(var A in a)a.hasOwnProperty(A)&&(n&&typeof a[A]=="function"||u.push(A));return u}function r(a,n,u,A,p,h,E){var w="",D=0,b,C,T=A.slice(0);if(T.push([n,u])&&A.length>0&&(A.forEach(function(U,J){J>0&&(w+=(U[1]?" ":"\u2502")+" "),!C&&U[0]===n&&(C=!0)}),w+=t(a,u)+a,p&&(typeof n!="object"||n instanceof Date)&&(w+=": "+n),C&&(w+=" (circular ref.)"),E(w)),!C&&typeof n=="object"){var N=e(n,h);N.forEach(function(U){b=++D===N.length,r(U,n[U],b,T,p,h,E)})}}var o={};return o.asLines=function(a,n,u,A){var p=typeof u!="function"?u:!1;r(".",a,!1,[],n,p,A||u)},o.asTree=function(a,n,u){var A="";return r(".",a,!1,[],n,u,function(p){A+=p+` -`}),A},o})});var As={};Vt(As,{emitList:()=>zct,emitTree:()=>Ype,treeNodeToJson:()=>Wpe,treeNodeToTreeify:()=>Gpe});function Gpe(t,{configuration:e}){let r={},o=0,a=(n,u)=>{let A=Array.isArray(n)?n.entries():Object.entries(n);for(let[p,h]of A){if(!h)continue;let{label:E,value:w,children:D}=h,b=[];typeof E<"u"&&b.push(Cg(e,E,2)),typeof w<"u"&&b.push(Ut(e,w[0],w[1])),b.length===0&&b.push(Cg(e,`${p}`,2));let C=b.join(": ").trim(),T=`\0${o++}\0`,N=u[`${T}${C}`]={};typeof D<"u"&&a(D,N)}};if(typeof t.children>"u")throw new Error("The root node must only contain children");return a(t.children,r),r}function Wpe(t){let e=r=>{if(typeof r.children>"u"){if(typeof r.value>"u")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Ig(r.value[0],r.value[1])}let o=Array.isArray(r.children)?r.children.entries():Object.entries(r.children??{}),a=Array.isArray(r.children)?[]:{};for(let[n,u]of o)u&&(a[Xct(n)]=e(u));return typeof r.value>"u"?a:{value:Ig(r.value[0],r.value[1]),children:a}};return e(t)}function zct(t,{configuration:e,stdout:r,json:o}){let a=t.map(n=>({value:n}));Ype({children:a},{configuration:e,stdout:r,json:o})}function Ype(t,{configuration:e,stdout:r,json:o,separators:a=0}){if(o){let u=Array.isArray(t.children)?t.children.values():Object.values(t.children??{});for(let A of u)A&&r.write(`${JSON.stringify(Wpe(A))} -`);return}let n=(0,jpe.asTree)(Gpe(t,{configuration:e}),!1,!1);if(n=n.replace(/\0[0-9]+\0/g,""),a>=1&&(n=n.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),a>=2)for(let u=0;u<2;++u)n=n.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(a>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(n)}function Xct(t){return typeof t=="string"?t.replace(/^\0[0-9]+\0/,""):t}var jpe,Vpe=It(()=>{jpe=et(qpe());Wl()});function v2(t){let e=t.match(Zct);if(!e?.groups)throw new Error("Assertion failed: Expected the checksum to match the requested pattern");let r=e.groups.cacheVersion?parseInt(e.groups.cacheVersion):null;return{cacheKey:e.groups.cacheKey??null,cacheVersion:r,cacheSpec:e.groups.cacheSpec??null,hash:e.groups.hash}}var Kpe,Y_,V_,Sk,Wr,Zct,K_=It(()=>{Ve();St();St();sA();Kpe=ve("crypto"),Y_=et(ve("fs"));Kl();ah();Gl();Io();V_=Zm(process.env.YARN_CACHE_CHECKPOINT_OVERRIDE??process.env.YARN_CACHE_VERSION_OVERRIDE??9),Sk=Zm(process.env.YARN_CACHE_VERSION_OVERRIDE??10),Wr=class t{constructor(e,{configuration:r,immutable:o=r.get("enableImmutableCache"),check:a=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,Kpe.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=o,this.check=a;let{cacheSpec:n,cacheKey:u}=t.getCacheKey(r);this.cacheSpec=n,this.cacheKey=u}static async find(e,{immutable:r,check:o}={}){let a=new t(e.get("cacheFolder"),{configuration:e,immutable:r,check:o});return await a.setup(),a}static getCacheKey(e){let r=e.get("compressionLevel"),o=r!=="mixed"?`c${r}`:"";return{cacheKey:[Sk,o].join(""),cacheSpec:o}}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${ly(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let a=v2(r).hash.slice(0,10);return`${ly(e)}-${a}.zip`}isChecksumCompatible(e){if(e===null)return!1;let{cacheVersion:r,cacheSpec:o}=v2(e);if(r===null||r{let he=new Zi,De=V.join(Bt.root,_M(e));return he.mkdirSync(De,{recursive:!0}),he.writeJsonSync(V.join(De,mr.manifest),{name:rn(e),mocked:!0}),he},E=async(he,{isColdHit:De,controlPath:Ee=null})=>{if(Ee===null&&u.unstablePackages?.has(e.locatorHash))return{isValid:!0,hash:null};let g=r&&!De?v2(r).cacheKey:this.cacheKey,me=!u.skipIntegrityCheck||!r?`${g}/${await fx(he)}`:r;if(Ee!==null){let fe=!u.skipIntegrityCheck||!r?`${this.cacheKey}/${await fx(Ee)}`:r;if(me!==fe)throw new Jt(18,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}let Ce=null;switch(r!==null&&me!==r&&(this.check?Ce="throw":v2(r).cacheKey!==v2(me).cacheKey?Ce="update":Ce=this.configuration.get("checksumBehavior")),Ce){case null:case"update":return{isValid:!0,hash:me};case"ignore":return{isValid:!0,hash:r};case"reset":return{isValid:!1,hash:r};default:case"throw":throw new Jt(18,"The remote archive doesn't match the expected checksum")}},w=async he=>{if(!n)throw new Error(`Cache check required but no loader configured for ${jr(this.configuration,e)}`);let De=await n(),Ee=De.getRealPath();De.saveAndClose(),await ae.chmodPromise(Ee,420);let g=await E(he,{controlPath:Ee,isColdHit:!1});if(!g.isValid)throw new Error("Assertion failed: Expected a valid checksum");return g.hash},D=async()=>{if(A===null||!await ae.existsPromise(A)){let he=await n(),De=he.getRealPath();return he.saveAndClose(),{source:"loader",path:De}}return{source:"mirror",path:A}},b=async()=>{if(!n)throw new Error(`Cache entry required but missing for ${jr(this.configuration,e)}`);if(this.immutable)throw new Jt(56,`Cache entry required but missing for ${jr(this.configuration,e)}`);let{path:he,source:De}=await D(),{hash:Ee}=await E(he,{isColdHit:!0}),g=this.getLocatorPath(e,Ee),me=[];De!=="mirror"&&A!==null&&me.push(async()=>{let fe=`${A}${this.cacheId}`;await ae.copyFilePromise(he,fe,Y_.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(fe,420),await ae.renamePromise(fe,A)}),(!u.mirrorWriteOnly||A===null)&&me.push(async()=>{let fe=`${g}${this.cacheId}`;await ae.copyFilePromise(he,fe,Y_.default.constants.COPYFILE_FICLONE),await ae.chmodPromise(fe,420),await ae.renamePromise(fe,g)});let Ce=u.mirrorWriteOnly?A??g:g;return await Promise.all(me.map(fe=>fe())),[!1,Ce,Ee]},C=async()=>{let De=(async()=>{let Ee=u.unstablePackages?.has(e.locatorHash),g=Ee||!r||this.isChecksumCompatible(r)?this.getLocatorPath(e,r):null,me=g!==null?this.markedFiles.has(g)||await p.existsPromise(g):!1,Ce=!!u.mockedPackages?.has(e.locatorHash)&&(!this.check||!me),fe=Ce||me,ie=fe?o:a;if(ie&&ie(),fe){let Z=null,Se=g;if(!Ce)if(this.check)Z=await w(Se);else{let Re=await E(Se,{isColdHit:!1});if(Re.isValid)Z=Re.hash;else return b()}return[Ce,Se,Z]}else{if(this.immutable&&Ee)throw new Jt(56,`Cache entry required but missing for ${jr(this.configuration,e)}; consider defining ${pe.pretty(this.configuration,"supportedArchitectures",pe.Type.CODE)} to cache packages for multiple systems`);return b()}})();this.mutexes.set(e.locatorHash,De);try{return await De}finally{this.mutexes.delete(e.locatorHash)}};for(let he;he=this.mutexes.get(e.locatorHash);)await he;let[T,N,U]=await C();T||this.markedFiles.add(N);let J,te=T?()=>h():()=>new Zi(N,{baseFs:p,readOnly:!0}),le=new Am(()=>rO(()=>J=te(),he=>`Failed to open the cache entry for ${jr(this.configuration,e)}: ${he}`),V),ce=new ju(N,{baseFs:le,pathUtils:V}),ue=()=>{J?.discardAndClose()},Ie=u.unstablePackages?.has(e.locatorHash)?null:U;return[ce,ue,Ie]}},Zct=/^(?:(?(?[0-9]+)(?.*))\/)?(?.*)$/});var Pk,Jpe=It(()=>{Pk=(r=>(r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE",r))(Pk||{})});var $ct,tE,J_=It(()=>{St();Ol();bf();Io();$ct=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,o)=>`${r}#commit=${o}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",o,a)=>`https://${r}github.com/${o}.git#commit=${a}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/[^/]+\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>mx({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],tE=class{constructor(e){this.resolver=e;this.resolutions=null}async setup(e,{report:r}){let o=V.join(e.cwd,mr.lockfile);if(!ae.existsSync(o))return;let a=await ae.readFilePromise(o,"utf8"),n=Vi(a);if(Object.hasOwn(n,"__metadata"))return;let u=this.resolutions=new Map;for(let A of Object.keys(n)){let p=v1(A);if(!p){r.reportWarning(14,`Failed to parse the string "${A}" into a proper descriptor`);continue}let h=Fa(p.range)?kn(p,`npm:${p.range}`):p,{version:E,resolved:w}=n[A];if(!w)continue;let D;for(let[C,T]of $ct){let N=w.match(C);if(N){D=T(E,...N);break}}if(!D){r.reportWarning(14,`${Jn(e.configuration,h)}: Only some patterns can be imported from legacy lockfiles (not "${w}")`);continue}let b=h;try{let C=vg(h.range),T=v1(C.selector,!0);T&&(b=T)}catch{}u.set(h.descriptorHash,Ps(b,D))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let a=this.resolutions.get(e.descriptorHash);if(!a)throw new Error("Assertion failed: The resolution should have been registered");let n=NM(a),u=o.project.configuration.normalizeDependency(n);return await this.resolver.getCandidates(u,r,o)}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}}});var pA,zpe=It(()=>{Kl();n2();Wl();pA=class extends Ws{constructor({configuration:r,stdout:o,suggestInstall:a=!0}){super();this.errorCount=0;g1(this,{configuration:r}),this.configuration=r,this.stdout=o,this.suggestInstall=a}static async start(r,o){let a=new this(r);try{await o(a)}catch(n){a.reportExceptionOnce(n)}finally{await a.finalize()}return a}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(r){}reportCacheMiss(r){}startSectionSync(r,o){return o()}async startSectionPromise(r,o){return await o()}startTimerSync(r,o,a){return(typeof o=="function"?o:a)()}async startTimerPromise(r,o,a){return await(typeof o=="function"?o:a)()}reportSeparator(){}reportInfo(r,o){}reportWarning(r,o){}reportError(r,o){this.errorCount+=1,this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(r)}: ${o} -`)}reportProgress(r){return{...Promise.resolve().then(async()=>{for await(let{}of r);}),stop:()=>{}}}reportJson(r){}reportFold(r,o){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${Ut(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(r){return r3(r,{configuration:this.configuration,json:!1})}}});var rE,z_=It(()=>{Io();rE=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(hx(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){let a=o.project.storedResolutions.get(e.descriptorHash);if(a){let u=o.project.originalPackages.get(a);if(u)return[u]}let n=o.project.originalPackages.get(hx(e).locatorHash);if(n)return[n];throw new Error("Resolution expected from the lockfile data")}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let o=r.project.originalPackages.get(e.locatorHash);if(!o)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return o}}});function Wf(){}function eut(t,e,r,o,a){for(var n=0,u=e.length,A=0,p=0;nb.length?T:b}),h.value=t.join(E)}else h.value=t.join(r.slice(A,A+h.count));A+=h.count,h.added||(p+=h.count)}}var D=e[u-1];return u>1&&typeof D.value=="string"&&(D.added||D.removed)&&t.equals("",D.value)&&(e[u-2].value+=D.value,e.pop()),e}function tut(t){return{newPos:t.newPos,components:t.components.slice(0)}}function rut(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}function $pe(t,e,r){return r=rut(r,{ignoreWhitespace:!0}),t8.diff(t,e,r)}function nut(t,e,r){return r8.diff(t,e,r)}function xk(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?xk=function(e){return typeof e}:xk=function(e){return e&&typeof Symbol=="function"&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},xk(t)}function X_(t){return out(t)||aut(t)||lut(t)||cut()}function out(t){if(Array.isArray(t))return Z_(t)}function aut(t){if(typeof Symbol<"u"&&Symbol.iterator in Object(t))return Array.from(t)}function lut(t,e){if(t){if(typeof t=="string")return Z_(t,e);var r=Object.prototype.toString.call(t).slice(8,-1);if(r==="Object"&&t.constructor&&(r=t.constructor.name),r==="Map"||r==="Set")return Array.from(t);if(r==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r))return Z_(t,e)}}function Z_(t,e){(e==null||e>t.length)&&(e=t.length);for(var r=0,o=new Array(e);r"u"&&(u.context=4);var A=nut(r,o,u);if(!A)return;A.push({value:"",lines:[]});function p(U){return U.map(function(J){return" "+J})}for(var h=[],E=0,w=0,D=[],b=1,C=1,T=function(J){var te=A[J],le=te.lines||te.value.replace(/\n$/,"").split(` -`);if(te.lines=le,te.added||te.removed){var ce;if(!E){var ue=A[J-1];E=b,w=C,ue&&(D=u.context>0?p(ue.lines.slice(-u.context)):[],E-=D.length,w-=D.length)}(ce=D).push.apply(ce,X_(le.map(function(fe){return(te.added?"+":"-")+fe}))),te.added?C+=le.length:b+=le.length}else{if(E)if(le.length<=u.context*2&&J=A.length-2&&le.length<=u.context){var g=/\n$/.test(r),me=/\n$/.test(o),Ce=le.length==0&&D.length>Ee.oldLines;!g&&Ce&&r.length>0&&D.splice(Ee.oldLines,0,"\\ No newline at end of file"),(!g&&!Ce||!me)&&D.push("\\ No newline at end of file")}h.push(Ee),E=0,w=0,D=[]}b+=le.length,C+=le.length}},N=0;N{Wf.prototype={diff:function(e,r){var o=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},a=o.callback;typeof o=="function"&&(a=o,o={}),this.options=o;var n=this;function u(T){return a?(setTimeout(function(){a(void 0,T)},0),!0):T}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var A=r.length,p=e.length,h=1,E=A+p;o.maxEditLength&&(E=Math.min(E,o.maxEditLength));var w=[{newPos:-1,components:[]}],D=this.extractCommon(w[0],r,e,0);if(w[0].newPos+1>=A&&D+1>=p)return u([{value:this.join(r),count:r.length}]);function b(){for(var T=-1*h;T<=h;T+=2){var N=void 0,U=w[T-1],J=w[T+1],te=(J?J.newPos:0)-T;U&&(w[T-1]=void 0);var le=U&&U.newPos+1=A&&te+1>=p)return u(eut(n,N.components,r,e,n.useLongestToken));w[T]=N}h++}if(a)(function T(){setTimeout(function(){if(h>E)return a();b()||T()},0)})();else for(;h<=E;){var C=b();if(C)return C}},pushComponent:function(e,r,o){var a=e[e.length-1];a&&a.added===r&&a.removed===o?e[e.length-1]={count:a.count+1,added:r,removed:o}:e.push({count:1,added:r,removed:o})},extractCommon:function(e,r,o,a){for(var n=r.length,u=o.length,A=e.newPos,p=A-a,h=0;A+1"u"?r:u}:o;return typeof t=="string"?t:JSON.stringify($_(t,null,null,a),a," ")};D2.equals=function(t,e){return Wf.prototype.equals.call(D2,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};e8=new Wf;e8.tokenize=function(t){return t.slice()};e8.join=e8.removeEmpty=function(t){return t}});var rhe=_((HUt,the)=>{var Aut=jl(),fut=fy(),put=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,hut=/^\w*$/;function gut(t,e){if(Aut(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||fut(t)?!0:hut.test(t)||!put.test(t)||e!=null&&t in Object(e)}the.exports=gut});var she=_((qUt,ihe)=>{var nhe=mP(),dut="Expected a function";function i8(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(dut);var r=function(){var o=arguments,a=e?e.apply(this,o):o[0],n=r.cache;if(n.has(a))return n.get(a);var u=t.apply(this,o);return r.cache=n.set(a,u)||n,u};return r.cache=new(i8.Cache||nhe),r}i8.Cache=nhe;ihe.exports=i8});var ahe=_((jUt,ohe)=>{var mut=she(),yut=500;function Eut(t){var e=mut(t,function(o){return r.size===yut&&r.clear(),o}),r=e.cache;return e}ohe.exports=Eut});var s8=_((GUt,lhe)=>{var Cut=ahe(),Iut=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,wut=/\\(\\)?/g,But=Cut(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(Iut,function(r,o,a,n){e.push(a?n.replace(wut,"$1"):o||r)}),e});lhe.exports=But});var Wg=_((WUt,che)=>{var vut=jl(),Dut=rhe(),Sut=s8(),Put=t2();function xut(t,e){return vut(t)?t:Dut(t,e)?[t]:Sut(Put(t))}che.exports=xut});var nE=_((YUt,uhe)=>{var but=fy(),kut=1/0;function Qut(t){if(typeof t=="string"||but(t))return t;var e=t+"";return e=="0"&&1/t==-kut?"-0":e}uhe.exports=Qut});var bk=_((VUt,Ahe)=>{var Fut=Wg(),Rut=nE();function Tut(t,e){e=Fut(e,t);for(var r=0,o=e.length;t!=null&&r{var Lut=RP(),Nut=Wg(),Out=n1(),fhe=cl(),Mut=nE();function Uut(t,e,r,o){if(!fhe(t))return t;e=Nut(e,t);for(var a=-1,n=e.length,u=n-1,A=t;A!=null&&++a{var _ut=bk(),Hut=o8(),qut=Wg();function jut(t,e,r){for(var o=-1,a=e.length,n={};++o{function Gut(t,e){return t!=null&&e in Object(t)}dhe.exports=Gut});var a8=_((XUt,yhe)=>{var Wut=Wg(),Yut=e1(),Vut=jl(),Kut=n1(),Jut=wP(),zut=nE();function Xut(t,e,r){e=Wut(e,t);for(var o=-1,a=e.length,n=!1;++o{var Zut=mhe(),$ut=a8();function eAt(t,e){return t!=null&&$ut(t,e,Zut)}Ehe.exports=eAt});var whe=_(($Ut,Ihe)=>{var tAt=ghe(),rAt=Che();function nAt(t,e){return tAt(t,e,function(r,o){return rAt(t,o)})}Ihe.exports=nAt});var She=_((e3t,Dhe)=>{var Bhe=dg(),iAt=e1(),sAt=jl(),vhe=Bhe?Bhe.isConcatSpreadable:void 0;function oAt(t){return sAt(t)||iAt(t)||!!(vhe&&t&&t[vhe])}Dhe.exports=oAt});var bhe=_((t3t,xhe)=>{var aAt=CP(),lAt=She();function Phe(t,e,r,o,a){var n=-1,u=t.length;for(r||(r=lAt),a||(a=[]);++n0&&r(A)?e>1?Phe(A,e-1,r,o,a):aAt(a,A):o||(a[a.length]=A)}return a}xhe.exports=Phe});var Qhe=_((r3t,khe)=>{var cAt=bhe();function uAt(t){var e=t==null?0:t.length;return e?cAt(t,1):[]}khe.exports=uAt});var l8=_((n3t,Fhe)=>{var AAt=Qhe(),fAt=KN(),pAt=JN();function hAt(t){return pAt(fAt(t,void 0,AAt),t+"")}Fhe.exports=hAt});var c8=_((i3t,Rhe)=>{var gAt=whe(),dAt=l8(),mAt=dAt(function(t,e){return t==null?{}:gAt(t,e)});Rhe.exports=mAt});var kk,The=It(()=>{Kl();kk=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,o){return this.resolver.bindDescriptor(e,r,o)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,o){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,o,a){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new Jt(20,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}}});var Ri,u8=It(()=>{Kl();Ri=class extends Ws{reportCacheHit(e){}reportCacheMiss(e){}startSectionSync(e,r){return r()}async startSectionPromise(e,r){return await r()}startTimerSync(e,r,o){return(typeof r=="function"?r:o)()}async startTimerPromise(e,r,o){return await(typeof r=="function"?r:o)()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){return{...Promise.resolve().then(async()=>{for await(let{}of e);}),stop:()=>{}}}reportJson(e){}reportFold(e,r){}async finalize(){}}});var Lhe,iE,A8=It(()=>{St();Lhe=et(ux());Ay();Dg();Wl();ah();bf();Io();iE=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.project=r,this.cwd=e}async setup(){this.manifest=await _t.tryFind(this.cwd)??new _t,this.relativeCwd=V.relative(this.project.cwd,this.cwd)||Bt.dot;let e=this.manifest.name?this.manifest.name:rA(null,`${this.computeCandidateName()}-${Ji(this.relativeCwd).substring(0,6)}`);this.anchoredDescriptor=kn(e,`${ci.protocol}${this.relativeCwd}`),this.anchoredLocator=Ps(e,`${ci.protocol}${this.relativeCwd}`);let r=this.manifest.workspaceDefinitions.map(({pattern:a})=>a);if(r.length===0)return;let o=await(0,Lhe.default)(r,{cwd:Ae.fromPortablePath(this.cwd),onlyDirectories:!0,ignore:["**/node_modules","**/.git","**/.yarn"]});o.sort(),await o.reduce(async(a,n)=>{let u=V.resolve(this.cwd,Ae.toPortablePath(n)),A=await ae.existsPromise(V.join(u,"package.json"));await a,A&&this.workspacesCwds.add(u)},Promise.resolve())}get anchoredPackage(){let e=this.project.storedPackages.get(this.anchoredLocator.locatorHash);if(!e)throw new Error(`Assertion failed: Expected workspace ${S1(this.project.configuration,this)} (${Ut(this.project.configuration,V.join(this.cwd,mr.manifest),Ct.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);return e}accepts(e){let r=e.indexOf(":"),o=r!==-1?e.slice(0,r+1):null,a=r!==-1?e.slice(r+1):e;if(o===ci.protocol&&V.normalize(a)===this.relativeCwd||o===ci.protocol&&(a==="*"||a==="^"||a==="~"))return!0;let n=Fa(a);return n?o===ci.protocol?n.test(this.manifest.version??"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?n.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${V.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=_t.hardDependencies}={}){let r=new Set,o=a=>{for(let n of e)for(let u of a.manifest[n].values()){let A=this.project.tryWorkspaceByDescriptor(u);A===null||r.has(A)||(r.add(A),o(A))}};return o(this),r}getRecursiveWorkspaceDependents({dependencies:e=_t.hardDependencies}={}){let r=new Set,o=a=>{for(let n of this.project.workspaces)e.some(A=>[...n.manifest[A].values()].some(p=>{let h=this.project.tryWorkspaceByDescriptor(p);return h!==null&&B1(h.anchoredLocator,a.anchoredLocator)}))&&!r.has(n)&&(r.add(n),o(n))};return o(this),r}getRecursiveWorkspaceChildren(){let e=new Set([this]);for(let r of e)for(let o of r.workspacesCwds){let a=this.project.workspacesByCwd.get(o);a&&e.add(a)}return e.delete(this),Array.from(e)}async persistManifest(){let e={};this.manifest.exportTo(e);let r=V.join(this.cwd,_t.fileName),o=`${JSON.stringify(e,null,this.manifest.indent)} -`;await ae.changeFilePromise(r,o,{automaticNewlines:!0}),this.manifest.raw=e}}});function BAt({project:t,allDescriptors:e,allResolutions:r,allPackages:o,accessibleLocators:a=new Set,optionalBuilds:n=new Set,peerRequirements:u=new Map,peerWarnings:A=[],peerRequirementNodes:p=new Map,volatileDescriptors:h=new Set}){let E=new Map,w=[],D=new Map,b=new Map,C=new Map,T=new Map,N=new Map(t.workspaces.map(ce=>{let ue=ce.anchoredLocator.locatorHash,Ie=o.get(ue);if(typeof Ie>"u")throw new Error("Assertion failed: The workspace should have an associated package");return[ue,E1(Ie)]})),U=()=>{let ce=ae.mktempSync(),ue=V.join(ce,"stacktrace.log"),Ie=String(w.length+1).length,he=w.map((De,Ee)=>`${`${Ee+1}.`.padStart(Ie," ")} ${Qa(De)} -`).join("");throw ae.writeFileSync(ue,he),ae.detachTemp(ce),new Jt(45,`Encountered a stack overflow when resolving peer dependencies; cf ${Ae.fromPortablePath(ue)}`)},J=ce=>{let ue=r.get(ce.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: The resolution should have been registered");let Ie=o.get(ue);if(!Ie)throw new Error("Assertion failed: The package could not be found");return Ie},te=(ce,ue,Ie,{top:he,optional:De})=>{w.length>1e3&&U(),w.push(ue);let Ee=le(ce,ue,Ie,{top:he,optional:De});return w.pop(),Ee},le=(ce,ue,Ie,{top:he,optional:De})=>{if(De||n.delete(ue.locatorHash),a.has(ue.locatorHash))return;a.add(ue.locatorHash);let Ee=o.get(ue.locatorHash);if(!Ee)throw new Error(`Assertion failed: The package (${jr(t.configuration,ue)}) should have been registered`);let g=[],me=new Map,Ce=[],fe=[],ie=[],Z=[];for(let Re of Array.from(Ee.dependencies.values())){if(Ee.peerDependencies.has(Re.identHash)&&Ee.locatorHash!==he)continue;if(Sf(Re))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");h.delete(Re.descriptorHash);let ht=De;if(!ht){let xe=Ee.dependenciesMeta.get(rn(Re));if(typeof xe<"u"){let tt=xe.get(null);typeof tt<"u"&&tt.optional&&(ht=!0)}}let q=r.get(Re.descriptorHash);if(!q)throw new Error(`Assertion failed: The resolution (${Jn(t.configuration,Re)}) should have been registered`);let nt=N.get(q)||o.get(q);if(!nt)throw new Error(`Assertion failed: The package (${q}, resolved from ${Jn(t.configuration,Re)}) should have been registered`);if(nt.peerDependencies.size===0){te(Re,nt,new Map,{top:he,optional:ht});continue}let Le,Te,ke=new Set,Ke=new Map;Ce.push(()=>{Le=MM(Re,ue.locatorHash),Te=UM(nt,ue.locatorHash),Ee.dependencies.delete(Re.identHash),Ee.dependencies.set(Le.identHash,Le),r.set(Le.descriptorHash,Te.locatorHash),e.set(Le.descriptorHash,Le),o.set(Te.locatorHash,Te),g.push([nt,Le,Te])}),fe.push(()=>{T.set(Te.locatorHash,Ke);for(let xe of Te.peerDependencies.values()){let He=Al(me,xe.identHash,()=>{let x=Ie.get(xe.identHash)??null,I=Ee.dependencies.get(xe.identHash);return!I&&w1(ue,xe)&&(ce.identHash===ue.identHash?I=ce:(I=kn(ue,ce.range),e.set(I.descriptorHash,I),r.set(I.descriptorHash,ue.locatorHash),h.delete(I.descriptorHash),x=null)),I||(I=kn(xe,"missing:")),{subject:ue,ident:xe,provided:I,root:!x,requests:new Map,hash:`p${Ji(ue.locatorHash,xe.identHash).slice(0,5)}`}}).provided;if(He.range==="missing:"&&Te.dependencies.has(xe.identHash)){Te.peerDependencies.delete(xe.identHash);continue}Ke.set(xe.identHash,{requester:Te,descriptor:xe,meta:Te.peerDependenciesMeta.get(rn(xe)),children:new Map}),Te.dependencies.set(xe.identHash,He),Sf(He)&&Jm(C,He.descriptorHash).add(Te.locatorHash),D.set(He.identHash,He),He.range==="missing:"&&ke.add(He.identHash)}Te.dependencies=new Map(Ss(Te.dependencies,([xe,tt])=>rn(tt)))}),ie.push(()=>{if(!o.has(Te.locatorHash))return;let xe=E.get(nt.locatorHash);typeof xe=="number"&&xe>=2&&U();let tt=E.get(nt.locatorHash),He=typeof tt<"u"?tt+1:1;E.set(nt.locatorHash,He),te(Le,Te,Ke,{top:he,optional:ht}),E.set(nt.locatorHash,He-1)}),Z.push(()=>{let xe=Ee.dependencies.get(Re.identHash);if(typeof xe>"u")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let tt=r.get(xe.descriptorHash);if(typeof tt>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let He=T.get(tt);if(typeof He>"u")throw new Error("Assertion failed: Expected the peer requests to be registered");for(let x of me.values()){let I=He.get(x.ident.identHash);I&&(x.requests.set(xe.descriptorHash,I),p.set(x.hash,x),x.root||Ie.get(x.ident.identHash)?.children.set(xe.descriptorHash,I))}if(o.has(Te.locatorHash))for(let x of ke)Te.dependencies.delete(x)})}for(let Re of[...Ce,...fe])Re();let Se;do{Se=!0;for(let[Re,ht,q]of g){let nt=A1(b,Re.locatorHash),Le=Ji(...[...q.dependencies.values()].map(xe=>{let tt=xe.range!=="missing:"?r.get(xe.descriptorHash):"missing:";if(typeof tt>"u")throw new Error(`Assertion failed: Expected the resolution for ${Jn(t.configuration,xe)} to have been registered`);return tt===he?`${tt} (top)`:tt}),ht.identHash),Te=nt.get(Le);if(typeof Te>"u"){nt.set(Le,ht);continue}if(Te===ht)continue;o.delete(q.locatorHash),e.delete(ht.descriptorHash),r.delete(ht.descriptorHash),a.delete(q.locatorHash);let ke=C.get(ht.descriptorHash)||[],Ke=[Ee.locatorHash,...ke];C.delete(ht.descriptorHash);for(let xe of Ke){let tt=o.get(xe);typeof tt>"u"||(tt.dependencies.get(ht.identHash).descriptorHash!==Te.descriptorHash&&(Se=!1),tt.dependencies.set(ht.identHash,Te))}for(let xe of me.values())xe.provided.descriptorHash===ht.descriptorHash&&(xe.provided=Te)}}while(!Se);for(let Re of[...ie,...Z])Re()};for(let ce of t.workspaces){let ue=ce.anchoredLocator;h.delete(ce.anchoredDescriptor.descriptorHash),te(ce.anchoredDescriptor,ue,new Map,{top:ue.locatorHash,optional:!1})}for(let ce of p.values()){if(!ce.root)continue;let ue=o.get(ce.subject.locatorHash);if(typeof ue>"u")continue;for(let he of ce.requests.values()){let De=`p${Ji(ce.subject.locatorHash,rn(ce.ident),he.requester.locatorHash).slice(0,5)}`;u.set(De,{subject:ce.subject.locatorHash,requested:ce.ident,rootRequester:he.requester.locatorHash,allRequesters:Array.from(P1(he),Ee=>Ee.requester.locatorHash)})}let Ie=[...P1(ce)];if(ce.provided.range!=="missing:"){let he=J(ce.provided),De=he.version??"0.0.0",Ee=me=>{if(me.startsWith(ci.protocol)){if(!t.tryWorkspaceByLocator(he))return null;me=me.slice(ci.protocol.length),(me==="^"||me==="~")&&(me="*")}return me},g=!0;for(let me of Ie){let Ce=Ee(me.descriptor.range);if(Ce===null){g=!1;continue}if(!nA(De,Ce)){g=!1;let fe=`p${Ji(ce.subject.locatorHash,rn(ce.ident),me.requester.locatorHash).slice(0,5)}`;A.push({type:1,subject:ue,requested:ce.ident,requester:me.requester,version:De,hash:fe,requirementCount:Ie.length})}}if(!g){let me=Ie.map(Ce=>Ee(Ce.descriptor.range));A.push({type:3,node:ce,range:me.includes(null)?null:qM(me),hash:ce.hash})}}else{let he=!0;for(let De of Ie)if(!De.meta?.optional){he=!1;let Ee=`p${Ji(ce.subject.locatorHash,rn(ce.ident),De.requester.locatorHash).slice(0,5)}`;A.push({type:0,subject:ue,requested:ce.ident,requester:De.requester,hash:Ee})}he||A.push({type:2,node:ce,hash:ce.hash})}}}function*vAt(t){let e=new Map;if("children"in t)e.set(t,t);else for(let r of t.requests.values())e.set(r,r);for(let[r,o]of e){yield{request:r,root:o};for(let a of r.children.values())e.has(a)||e.set(a,o)}}function DAt(t,e){let r=[],o=[],a=!1;for(let n of t.peerWarnings)if(!(n.type===1||n.type===0)){if(!t.tryWorkspaceByLocator(n.node.subject)){a=!0;continue}if(n.type===3){let u=t.storedResolutions.get(n.node.provided.descriptorHash);if(typeof u>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let A=t.storedPackages.get(u);if(typeof A>"u")throw new Error("Assertion failed: Expected the package to be registered");let p=eh(vAt(n.node),({request:w,root:D})=>nA(A.version??"0.0.0",w.descriptor.range)?eh.skip:w===D?Ui(t.configuration,w.requester):`${Ui(t.configuration,w.requester)} (via ${Ui(t.configuration,D.requester)})`),h=[...P1(n.node)].length>1?"and other dependencies request":"requests",E=n.range?cy(t.configuration,n.range):Ut(t.configuration,"but they have non-overlapping ranges!","redBright");r.push(`${Ui(t.configuration,n.node.ident)} is listed by your project with version ${D1(t.configuration,A.version??"0.0.0")} (${Ut(t.configuration,n.hash,Ct.CODE)}), which doesn't satisfy what ${p} ${h} (${E}).`)}if(n.type===2){let u=n.node.requests.size>1?" and other dependencies":"";o.push(`${jr(t.configuration,n.node.subject)} doesn't provide ${Ui(t.configuration,n.node.ident)} (${Ut(t.configuration,n.hash,Ct.CODE)}), requested by ${Ui(t.configuration,n.node.requests.values().next().value.requester)}${u}.`)}}e.startSectionSync({reportFooter:()=>{e.reportWarning(86,`Some peer dependencies are incorrectly met by your project; run ${Ut(t.configuration,"yarn explain peer-requirements ",Ct.CODE)} for details, where ${Ut(t.configuration,"",Ct.CODE)} is the six-letter p-prefixed code.`)},skipIfEmpty:!0},()=>{for(let n of Ss(r,u=>ey.default(u)))e.reportWarning(60,n);for(let n of Ss(o,u=>ey.default(u)))e.reportWarning(2,n)}),a&&e.reportWarning(86,`Some peer dependencies are incorrectly met by dependencies; run ${Ut(t.configuration,"yarn explain peer-requirements",Ct.CODE)} for details.`)}var Qk,Fk,Rk,Mhe,h8,p8,g8,Tk,yAt,EAt,Nhe,CAt,IAt,wAt,yl,f8,Lk,Ohe,Qt,Uhe=It(()=>{St();St();Ol();Gt();Qk=ve("crypto");n8();Fk=et(c8()),Rk=et(lg()),Mhe=et(ni()),h8=ve("util"),p8=et(ve("v8")),g8=et(ve("zlib"));K_();W1();J_();z_();Ay();VM();Kl();The();n2();u8();Dg();A8();vx();Wl();ah();Gl();rb();a3();bf();Io();Tk=Zm(process.env.YARN_LOCKFILE_VERSION_OVERRIDE??8),yAt=3,EAt=/ *, */g,Nhe=/\/$/,CAt=32,IAt=(0,h8.promisify)(g8.default.gzip),wAt=(0,h8.promisify)(g8.default.gunzip),yl=(r=>(r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build",r))(yl||{}),f8={restoreLinkersCustomData:["linkersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["skippedBuilds","storedBuildState"]},Lk=(a=>(a[a.NotProvided=0]="NotProvided",a[a.NotCompatible=1]="NotCompatible",a[a.NodeNotProvided=2]="NodeNotProvided",a[a.NodeNotCompatible=3]="NodeNotCompatible",a))(Lk||{}),Ohe=t=>Ji(`${yAt}`,t),Qt=class t{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.skippedBuilds=new Set;this.lockfileLastVersion=null;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.peerWarnings=[];this.peerRequirementNodes=new Map;this.linkersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){if(!e.projectCwd)throw new it(`No project found in ${r}`);let o=e.projectCwd,a=r,n=null;for(;n!==e.projectCwd;){if(n=a,ae.existsSync(V.join(n,mr.manifest))){o=n;break}a=V.dirname(n)}let u=new t(e.projectCwd,{configuration:e});ze.telemetry?.reportProject(u.cwd),await u.setupResolutions(),await u.setupWorkspaces(),ze.telemetry?.reportWorkspaceCount(u.workspaces.length),ze.telemetry?.reportDependencyCount(u.workspaces.reduce((C,T)=>C+T.manifest.dependencies.size+T.manifest.devDependencies.size,0));let A=u.tryWorkspaceByCwd(o);if(A)return{project:u,workspace:A,locator:A.anchoredLocator};let p=await u.findLocatorForLocation(`${o}/`,{strict:!0});if(p)return{project:u,locator:p,workspace:null};let h=Ut(e,u.cwd,Ct.PATH),E=Ut(e,V.relative(u.cwd,o),Ct.PATH),w=`- If ${h} isn't intended to be a project, remove any yarn.lock and/or package.json file there.`,D=`- If ${h} is intended to be a project, it might be that you forgot to list ${E} in its workspace configuration.`,b=`- Finally, if ${h} is fine and you intend ${E} to be treated as a completely separate project (not even a workspace), create an empty yarn.lock file in it.`;throw new it(`The nearest package directory (${Ut(e,o,Ct.PATH)}) doesn't seem to be part of the project declared in ${Ut(e,u.cwd,Ct.PATH)}. - -${[w,D,b].join(` -`)}`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=V.join(this.cwd,mr.lockfile),r=this.configuration.get("defaultLanguageName");if(ae.existsSync(e)){let o=await ae.readFilePromise(e,"utf8");this.lockFileChecksum=Ohe(o);let a=Vi(o);if(a.__metadata){let n=a.__metadata.version,u=a.__metadata.cacheKey;this.lockfileLastVersion=n,this.lockfileNeedsRefresh=n"u")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${A})`);let h=Pf(p.resolution,!0),E=new _t;E.load(p,{yamlCompatibilityMode:!0});let w=E.version,D=E.languageName||r,b=p.linkType.toUpperCase(),C=p.conditions??null,T=E.dependencies,N=E.peerDependencies,U=E.dependenciesMeta,J=E.peerDependenciesMeta,te=E.bin;if(p.checksum!=null){let ce=typeof u<"u"&&!p.checksum.includes("/")?`${u}/${p.checksum}`:p.checksum;this.storedChecksums.set(h.locatorHash,ce)}let le={...h,version:w,languageName:D,linkType:b,conditions:C,dependencies:T,peerDependencies:N,dependenciesMeta:U,peerDependenciesMeta:J,bin:te};this.originalPackages.set(le.locatorHash,le);for(let ce of A.split(EAt)){let ue=lh(ce);n<=6&&(ue=this.configuration.normalizeDependency(ue),ue=kn(ue,ue.range.replace(/^patch:[^@]+@(?!npm(:|%3A))/,"$1npm%3A"))),this.storedDescriptors.set(ue.descriptorHash,ue),this.storedResolutions.set(ue.descriptorHash,h.locatorHash)}}}else o.includes("yarn lockfile v1")&&(this.lockfileLastVersion=-1)}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=new Set,r=(0,Rk.default)(4),o=async(a,n)=>{if(e.has(n))return a;e.add(n);let u=new iE(n,{project:this});await r(()=>u.setup());let A=a.then(()=>{this.addWorkspace(u)});return Array.from(u.workspacesCwds).reduce(o,A)};await o(Promise.resolve(),this.cwd)}addWorkspace(e){let r=this.workspacesByIdent.get(e.anchoredLocator.identHash);if(typeof r<"u")throw new Error(`Duplicate workspace name ${Ui(this.configuration,e.anchoredLocator)}: ${Ae.fromPortablePath(e.cwd)} conflicts with ${Ae.fromPortablePath(r.cwd)}`);this.workspaces.push(e),this.workspacesByCwd.set(e.cwd,e),this.workspacesByIdent.set(e.anchoredLocator.identHash,e)}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){V.isAbsolute(e)||(e=V.resolve(this.cwd,e)),e=V.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let o of this.workspaces)V.relative(o.cwd,e).startsWith("../")||r&&r.cwd.length>=o.cwd.length||(r=o);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r>"u"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Ui(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){if(e.range.startsWith(ci.protocol)){let o=e.range.slice(ci.protocol.length);if(o!=="^"&&o!=="~"&&o!=="*"&&!Fa(o))return this.tryWorkspaceByCwd(o)}let r=this.tryWorkspaceByIdent(e);return r===null||(Sf(e)&&(e=C1(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Jn(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Jc(e)&&(e=I1(e)),r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${jr(this.configuration,e)})`);return r}deleteDescriptor(e){this.storedResolutions.delete(e),this.storedDescriptors.delete(e)}deleteLocator(e){this.originalPackages.delete(e),this.storedPackages.delete(e),this.accessibleLocators.delete(e)}forgetResolution(e){if("descriptorHash"in e){let r=this.storedResolutions.get(e.descriptorHash);this.deleteDescriptor(e.descriptorHash);let o=new Set(this.storedResolutions.values());typeof r<"u"&&!o.has(r)&&this.deleteLocator(r)}if("locatorHash"in e){this.deleteLocator(e.locatorHash);for(let[r,o]of this.storedResolutions)o===e.locatorHash&&this.deleteDescriptor(r)}}forgetTransientResolutions(){let e=this.configuration.makeResolver(),r=new Map;for(let[o,a]of this.storedResolutions.entries()){let n=r.get(a);n||r.set(a,n=new Set),n.add(o)}for(let o of this.originalPackages.values()){let a;try{a=e.shouldPersistResolution(o,{project:this,resolver:e})}catch{a=!1}if(!a){this.deleteLocator(o.locatorHash);let n=r.get(o.locatorHash);if(n){r.delete(o.locatorHash);for(let u of n)this.deleteDescriptor(u)}}}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,o]of e.dependencies)Sf(o)&&e.dependencies.set(r,C1(o))}getDependencyMeta(e,r){let o={},n=this.topLevelWorkspace.manifest.dependenciesMeta.get(rn(e));if(!n)return o;let u=n.get(null);if(u&&Object.assign(o,u),r===null||!Mhe.default.valid(r))return o;for(let[A,p]of n)A!==null&&A===r&&Object.assign(o,p);return o}async findLocatorForLocation(e,{strict:r=!1}={}){let o=new Ri,a=this.configuration.getLinkers(),n={project:this,report:o};for(let u of a){let A=await u.findPackageLocator(e,n);if(A){if(r&&(await u.findPackageLocation(A,n)).replace(Nhe,"")!==e.replace(Nhe,""))continue;return A}}return null}async loadUserConfig(){let e=V.join(this.cwd,".pnp.cjs");await ae.existsPromise(e)&&vf(e).setup();let r=V.join(this.cwd,"yarn.config.cjs");return await ae.existsPromise(r)?vf(r):null}async preparePackage(e,{resolver:r,resolveOptions:o}){let a=await this.configuration.getPackageExtensions(),n=this.configuration.normalizePackage(e,{packageExtensions:a});for(let[u,A]of n.dependencies){let p=await this.configuration.reduceHook(E=>E.reduceDependency,A,this,n,A,{resolver:r,resolveOptions:o});if(!w1(A,p))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let h=r.bindDescriptor(p,n,o);n.dependencies.set(u,h)}return n}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions();let r=new Map(this.originalPackages),o=[];e.lockfileOnly||this.forgetTransientResolutions();let a=e.resolver||this.configuration.makeResolver(),n=new tE(a);await n.setup(this,{report:e.report});let u=e.lockfileOnly?[new kk(a)]:[n,a],A=new Sg([new rE(a),...u]),p=new Sg([...u]),h=this.configuration.makeFetcher(),E=e.lockfileOnly?{project:this,report:e.report,resolver:A}:{project:this,report:e.report,resolver:A,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:h,cacheOptions:{mirrorWriteOnly:!0}}},w=new Map,D=new Map,b=new Map,C=new Map,T=new Map,N=new Map,U=this.topLevelWorkspace.anchoredLocator,J=new Set,te=[],le=IU(),ce=this.configuration.getSupportedArchitectures();await e.report.startProgressPromise(Ws.progressViaTitle(),async ie=>{let Z=async nt=>{let Le=await zm(async()=>await A.resolve(nt,E),xe=>`${jr(this.configuration,nt)}: ${xe}`);if(!B1(nt,Le))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${jr(this.configuration,nt)} to ${jr(this.configuration,Le)})`);C.set(Le.locatorHash,Le),!r.delete(Le.locatorHash)&&!this.tryWorkspaceByLocator(Le)&&o.push(Le);let ke=await this.preparePackage(Le,{resolver:A,resolveOptions:E}),Ke=Wc([...ke.dependencies.values()].map(xe=>q(xe)));return te.push(Ke),Ke.catch(()=>{}),D.set(ke.locatorHash,ke),ke},Se=async nt=>{let Le=T.get(nt.locatorHash);if(typeof Le<"u")return Le;let Te=Promise.resolve().then(()=>Z(nt));return T.set(nt.locatorHash,Te),Te},Re=async(nt,Le)=>{let Te=await q(Le);return w.set(nt.descriptorHash,nt),b.set(nt.descriptorHash,Te.locatorHash),Te},ht=async nt=>{ie.setTitle(Jn(this.configuration,nt));let Le=this.resolutionAliases.get(nt.descriptorHash);if(typeof Le<"u")return Re(nt,this.storedDescriptors.get(Le));let Te=A.getResolutionDependencies(nt,E),ke=Object.fromEntries(await Wc(Object.entries(Te).map(async([tt,He])=>{let x=A.bindDescriptor(He,U,E),I=await q(x);return J.add(I.locatorHash),[tt,I]}))),xe=(await zm(async()=>await A.getCandidates(nt,ke,E),tt=>`${Jn(this.configuration,nt)}: ${tt}`))[0];if(typeof xe>"u")throw new Jt(82,`${Jn(this.configuration,nt)}: No candidates found`);if(e.checkResolutions){let{locators:tt}=await p.getSatisfying(nt,ke,[xe],{...E,resolver:p});if(!tt.find(He=>He.locatorHash===xe.locatorHash))throw new Jt(78,`Invalid resolution ${d1(this.configuration,nt,xe)}`)}return w.set(nt.descriptorHash,nt),b.set(nt.descriptorHash,xe.locatorHash),Se(xe)},q=nt=>{let Le=N.get(nt.descriptorHash);if(typeof Le<"u")return Le;w.set(nt.descriptorHash,nt);let Te=Promise.resolve().then(()=>ht(nt));return N.set(nt.descriptorHash,Te),Te};for(let nt of this.workspaces){let Le=nt.anchoredDescriptor;te.push(q(Le))}for(;te.length>0;){let nt=[...te];te.length=0,await Wc(nt)}});let ue=ul(r.values(),ie=>this.tryWorkspaceByLocator(ie)?ul.skip:ie);if(o.length>0||ue.length>0){let ie=new Set(this.workspaces.flatMap(nt=>{let Le=D.get(nt.anchoredLocator.locatorHash);if(!Le)throw new Error("Assertion failed: The workspace should have been resolved");return Array.from(Le.dependencies.values(),Te=>{let ke=b.get(Te.descriptorHash);if(!ke)throw new Error("Assertion failed: The resolution should have been registered");return ke})})),Z=nt=>ie.has(nt.locatorHash)?"0":"1",Se=nt=>Qa(nt),Re=Ss(o,[Z,Se]),ht=Ss(ue,[Z,Se]),q=e.report.getRecommendedLength();Re.length>0&&e.report.reportInfo(85,`${Ut(this.configuration,"+",Ct.ADDED)} ${_P(this.configuration,Re,q)}`),ht.length>0&&e.report.reportInfo(85,`${Ut(this.configuration,"-",Ct.REMOVED)} ${_P(this.configuration,ht,q)}`)}let Ie=new Set(this.resolutionAliases.values()),he=new Set(D.keys()),De=new Set,Ee=new Map,g=[],me=new Map;BAt({project:this,accessibleLocators:De,volatileDescriptors:Ie,optionalBuilds:he,peerRequirements:Ee,peerWarnings:g,peerRequirementNodes:me,allDescriptors:w,allResolutions:b,allPackages:D});for(let ie of J)he.delete(ie);for(let ie of Ie)w.delete(ie),b.delete(ie);let Ce=new Set,fe=new Set;for(let ie of D.values())ie.conditions!=null&&he.has(ie.locatorHash)&&(Ex(ie,ce)||(Ex(ie,le)&&e.report.reportWarningOnce(77,`${jr(this.configuration,ie)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ut(this.configuration,"supportedArchitectures",Ct.SETTING)} setting`),fe.add(ie.locatorHash)),Ce.add(ie.locatorHash));this.storedResolutions=b,this.storedDescriptors=w,this.storedPackages=D,this.accessibleLocators=De,this.conditionalLocators=Ce,this.disabledLocators=fe,this.originalPackages=C,this.optionalBuilds=he,this.peerRequirements=Ee,this.peerWarnings=g,this.peerRequirementNodes=me}async fetchEverything({cache:e,report:r,fetcher:o,mode:a,persistProject:n=!0}){let u={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},A=o||this.configuration.makeFetcher(),p={checksums:this.storedChecksums,project:this,cache:e,fetcher:A,report:r,cacheOptions:u},h=Array.from(new Set(Ss(this.storedResolutions.values(),[C=>{let T=this.storedPackages.get(C);if(!T)throw new Error("Assertion failed: The locator should have been registered");return Qa(T)}])));a==="update-lockfile"&&(h=h.filter(C=>!this.storedChecksums.has(C)));let E=!1,w=Ws.progressViaCounter(h.length);await r.reportProgress(w);let D=(0,Rk.default)(CAt);if(await Wc(h.map(C=>D(async()=>{let T=this.storedPackages.get(C);if(!T)throw new Error("Assertion failed: The locator should have been registered");if(Jc(T))return;let N;try{N=await A.fetch(T,p)}catch(U){U.message=`${jr(this.configuration,T)}: ${U.message}`,r.reportExceptionOnce(U),E=U;return}N.checksum!=null?this.storedChecksums.set(T.locatorHash,N.checksum):this.storedChecksums.delete(T.locatorHash),N.releaseFs&&N.releaseFs()}).finally(()=>{w.tick()}))),E)throw E;let b=n&&a!=="update-lockfile"?await this.cacheCleanup({cache:e,report:r}):null;if(r.cacheMisses.size>0||b){let T=(await Promise.all([...r.cacheMisses].map(async ue=>{let Ie=this.storedPackages.get(ue),he=this.storedChecksums.get(ue)??null,De=e.getLocatorPath(Ie,he);return(await ae.statPromise(De)).size}))).reduce((ue,Ie)=>ue+Ie,0)-(b?.size??0),N=r.cacheMisses.size,U=b?.count??0,J=`${TP(N,{zero:"No new packages",one:"A package was",more:`${Ut(this.configuration,N,Ct.NUMBER)} packages were`})} added to the project`,te=`${TP(U,{zero:"none were",one:"one was",more:`${Ut(this.configuration,U,Ct.NUMBER)} were`})} removed`,le=T!==0?` (${Ut(this.configuration,T,Ct.SIZE_DIFF)})`:"",ce=U>0?N>0?`${J}, and ${te}${le}.`:`${J}, but ${te}${le}.`:`${J}${le}.`;r.reportInfo(13,ce)}}async linkEverything({cache:e,report:r,fetcher:o,mode:a}){let n={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},u=o||this.configuration.makeFetcher(),A={checksums:this.storedChecksums,project:this,cache:e,fetcher:u,report:r,cacheOptions:n},p=this.configuration.getLinkers(),h={project:this,report:r},E=new Map(p.map(Ce=>{let fe=Ce.makeInstaller(h),ie=Ce.getCustomDataKey(),Z=this.linkersCustomData.get(ie);return typeof Z<"u"&&fe.attachCustomData(Z),[Ce,fe]})),w=new Map,D=new Map,b=new Map,C=new Map(await Wc([...this.accessibleLocators].map(async Ce=>{let fe=this.storedPackages.get(Ce);if(!fe)throw new Error("Assertion failed: The locator should have been registered");return[Ce,await u.fetch(fe,A)]}))),T=[],N=new Set,U=[];for(let Ce of this.accessibleLocators){let fe=this.storedPackages.get(Ce);if(typeof fe>"u")throw new Error("Assertion failed: The locator should have been registered");let ie=C.get(fe.locatorHash);if(typeof ie>"u")throw new Error("Assertion failed: The fetch result should have been registered");let Z=[],Se=ht=>{Z.push(ht)},Re=this.tryWorkspaceByLocator(fe);if(Re!==null){let ht=[],{scripts:q}=Re.manifest;for(let Le of["preinstall","install","postinstall"])q.has(Le)&&ht.push({type:0,script:Le});try{for(let[Le,Te]of E)if(Le.supportsPackage(fe,h)&&(await Te.installPackage(fe,ie,{holdFetchResult:Se})).buildRequest!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{Z.length===0?ie.releaseFs?.():T.push(Wc(Z).catch(()=>{}).then(()=>{ie.releaseFs?.()}))}let nt=V.join(ie.packageFs.getRealPath(),ie.prefixPath);D.set(fe.locatorHash,nt),!Jc(fe)&&ht.length>0&&b.set(fe.locatorHash,{buildDirectives:ht,buildLocations:[nt]})}else{let ht=p.find(Le=>Le.supportsPackage(fe,h));if(!ht)throw new Jt(12,`${jr(this.configuration,fe)} isn't supported by any available linker`);let q=E.get(ht);if(!q)throw new Error("Assertion failed: The installer should have been registered");let nt;try{nt=await q.installPackage(fe,ie,{holdFetchResult:Se})}finally{Z.length===0?ie.releaseFs?.():T.push(Wc(Z).then(()=>{}).then(()=>{ie.releaseFs?.()}))}w.set(fe.locatorHash,ht),D.set(fe.locatorHash,nt.packageLocation),nt.buildRequest&&nt.packageLocation&&(nt.buildRequest.skipped?(N.add(fe.locatorHash),this.skippedBuilds.has(fe.locatorHash)||U.push([fe,nt.buildRequest.explain])):b.set(fe.locatorHash,{buildDirectives:nt.buildRequest.directives,buildLocations:[nt.packageLocation]}))}}let J=new Map;for(let Ce of this.accessibleLocators){let fe=this.storedPackages.get(Ce);if(!fe)throw new Error("Assertion failed: The locator should have been registered");let ie=this.tryWorkspaceByLocator(fe)!==null,Z=async(Se,Re)=>{let ht=D.get(fe.locatorHash);if(typeof ht>"u")throw new Error(`Assertion failed: The package (${jr(this.configuration,fe)}) should have been registered`);let q=[];for(let nt of fe.dependencies.values()){let Le=this.storedResolutions.get(nt.descriptorHash);if(typeof Le>"u")throw new Error(`Assertion failed: The resolution (${Jn(this.configuration,nt)}, from ${jr(this.configuration,fe)})should have been registered`);let Te=this.storedPackages.get(Le);if(typeof Te>"u")throw new Error(`Assertion failed: The package (${Le}, resolved from ${Jn(this.configuration,nt)}) should have been registered`);let ke=this.tryWorkspaceByLocator(Te)===null?w.get(Le):null;if(typeof ke>"u")throw new Error(`Assertion failed: The package (${Le}, resolved from ${Jn(this.configuration,nt)}) should have been registered`);ke===Se||ke===null?D.get(Te.locatorHash)!==null&&q.push([nt,Te]):!ie&&ht!==null&&u1(J,Le).push(ht)}ht!==null&&await Re.attachInternalDependencies(fe,q)};if(ie)for(let[Se,Re]of E)Se.supportsPackage(fe,h)&&await Z(Se,Re);else{let Se=w.get(fe.locatorHash);if(!Se)throw new Error("Assertion failed: The linker should have been found");let Re=E.get(Se);if(!Re)throw new Error("Assertion failed: The installer should have been registered");await Z(Se,Re)}}for(let[Ce,fe]of J){let ie=this.storedPackages.get(Ce);if(!ie)throw new Error("Assertion failed: The package should have been registered");let Z=w.get(ie.locatorHash);if(!Z)throw new Error("Assertion failed: The linker should have been found");let Se=E.get(Z);if(!Se)throw new Error("Assertion failed: The installer should have been registered");await Se.attachExternalDependents(ie,fe)}let te=new Map;for(let[Ce,fe]of E){let ie=await fe.finalizeInstall();for(let Z of ie?.records??[])Z.buildRequest.skipped?(N.add(Z.locator.locatorHash),this.skippedBuilds.has(Z.locator.locatorHash)||U.push([Z.locator,Z.buildRequest.explain])):b.set(Z.locator.locatorHash,{buildDirectives:Z.buildRequest.directives,buildLocations:Z.buildLocations});typeof ie?.customData<"u"&&te.set(Ce.getCustomDataKey(),ie.customData)}if(this.linkersCustomData=te,await Wc(T),a==="skip-build")return;for(let[,Ce]of Ss(U,([fe])=>Qa(fe)))Ce(r);let le=new Set(b.keys()),ce=(0,Qk.createHash)("sha512");ce.update(process.versions.node),await this.configuration.triggerHook(Ce=>Ce.globalHashGeneration,this,Ce=>{ce.update("\0"),ce.update(Ce)});let ue=ce.digest("hex"),Ie=new Map,he=Ce=>{let fe=Ie.get(Ce.locatorHash);if(typeof fe<"u")return fe;let ie=this.storedPackages.get(Ce.locatorHash);if(typeof ie>"u")throw new Error("Assertion failed: The package should have been registered");let Z=(0,Qk.createHash)("sha512");Z.update(Ce.locatorHash),Ie.set(Ce.locatorHash,"");for(let Se of ie.dependencies.values()){let Re=this.storedResolutions.get(Se.descriptorHash);if(typeof Re>"u")throw new Error(`Assertion failed: The resolution (${Jn(this.configuration,Se)}) should have been registered`);let ht=this.storedPackages.get(Re);if(typeof ht>"u")throw new Error("Assertion failed: The package should have been registered");Z.update(he(ht))}return fe=Z.digest("hex"),Ie.set(Ce.locatorHash,fe),fe},De=(Ce,fe)=>{let ie=(0,Qk.createHash)("sha512");ie.update(ue),ie.update(he(Ce));for(let Z of fe)ie.update(Z);return ie.digest("hex")},Ee=new Map,g=!1,me=Ce=>{let fe=new Set([Ce.locatorHash]);for(let ie of fe){let Z=this.storedPackages.get(ie);if(!Z)throw new Error("Assertion failed: The package should have been registered");for(let Se of Z.dependencies.values()){let Re=this.storedResolutions.get(Se.descriptorHash);if(!Re)throw new Error(`Assertion failed: The resolution (${Jn(this.configuration,Se)}) should have been registered`);if(Re!==Ce.locatorHash&&le.has(Re))return!1;let ht=this.storedPackages.get(Re);if(!ht)throw new Error("Assertion failed: The package should have been registered");let q=this.tryWorkspaceByLocator(ht);if(q){if(q.anchoredLocator.locatorHash!==Ce.locatorHash&&le.has(q.anchoredLocator.locatorHash))return!1;fe.add(q.anchoredLocator.locatorHash)}fe.add(Re)}}return!0};for(;le.size>0;){let Ce=le.size,fe=[];for(let ie of le){let Z=this.storedPackages.get(ie);if(!Z)throw new Error("Assertion failed: The package should have been registered");if(!me(Z))continue;let Se=b.get(Z.locatorHash);if(!Se)throw new Error("Assertion failed: The build directive should have been registered");let Re=De(Z,Se.buildLocations);if(this.storedBuildState.get(Z.locatorHash)===Re){Ee.set(Z.locatorHash,Re),le.delete(ie);continue}g||(await this.persistInstallStateFile(),g=!0),this.storedBuildState.has(Z.locatorHash)?r.reportInfo(8,`${jr(this.configuration,Z)} must be rebuilt because its dependency tree changed`):r.reportInfo(7,`${jr(this.configuration,Z)} must be built because it never has been before or the last one failed`);let ht=Se.buildLocations.map(async q=>{if(!V.isAbsolute(q))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${q})`);for(let nt of Se.buildDirectives){let Le=`# This file contains the result of Yarn building a package (${Qa(Z)}) -`;switch(nt.type){case 0:Le+=`# Script name: ${nt.script} -`;break;case 1:Le+=`# Script code: ${nt.script} -`;break}let Te=null;if(!await ae.mktempPromise(async Ke=>{let xe=V.join(Ke,"build.log"),{stdout:tt,stderr:He}=this.configuration.getSubprocessStreams(xe,{header:Le,prefix:jr(this.configuration,Z),report:r}),x;try{switch(nt.type){case 0:x=await Db(Z,nt.script,[],{cwd:q,project:this,stdin:Te,stdout:tt,stderr:He});break;case 1:x=await n3(Z,nt.script,[],{cwd:q,project:this,stdin:Te,stdout:tt,stderr:He});break}}catch(y){He.write(y.stack),x=1}if(tt.end(),He.end(),x===0)return!0;ae.detachTemp(Ke);let I=`${jr(this.configuration,Z)} couldn't be built successfully (exit code ${Ut(this.configuration,x,Ct.NUMBER)}, logs can be found here: ${Ut(this.configuration,xe,Ct.PATH)})`,P=this.optionalBuilds.has(Z.locatorHash);return P?r.reportInfo(9,I):r.reportError(9,I),Nue&&r.reportFold(Ae.fromPortablePath(xe),ae.readFileSync(xe,"utf8")),P}))return!1}return!0});fe.push(...ht,Promise.allSettled(ht).then(q=>{le.delete(ie),q.every(nt=>nt.status==="fulfilled"&&nt.value===!0)&&Ee.set(Z.locatorHash,Re)}))}if(await Wc(fe),Ce===le.size){let ie=Array.from(le).map(Z=>{let Se=this.storedPackages.get(Z);if(!Se)throw new Error("Assertion failed: The package should have been registered");return jr(this.configuration,Se)}).join(", ");r.reportError(3,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${ie})`);break}}this.storedBuildState=Ee,this.skippedBuilds=N}async installWithNewReport(e,r){return(await Lt.start({configuration:this.configuration,json:e.json,stdout:e.stdout,forceSectionAlignment:!0,includeLogs:!e.json&&!e.quiet,includeVersion:!0},async a=>{await this.install({...r,report:a})})).exitCode()}async install(e){let r=this.configuration.get("nodeLinker");ze.telemetry?.reportInstall(r);let o=!1;if(await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{this.configuration.get("enableOfflineMode")&&e.report.reportWarning(90,"Offline work is enabled; Yarn won't fetch packages from the remote registry if it can avoid it"),await this.configuration.triggerHook(E=>E.validateProject,this,{reportWarning:(E,w)=>{e.report.reportWarning(E,w)},reportError:(E,w)=>{e.report.reportError(E,w),o=!0}})}),o)return;let a=await this.configuration.getPackageExtensions();for(let E of a.values())for(let[,w]of E)for(let D of w)D.status="inactive";let n=V.join(this.cwd,mr.lockfile),u=null;if(e.immutable)try{u=await ae.readFilePromise(n,"utf8")}catch(E){throw E.code==="ENOENT"?new Jt(28,"The lockfile would have been created by this install, which is explicitly forbidden."):E}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{DAt(this,e.report);for(let[,E]of a)for(let[,w]of E)for(let D of w)if(D.userProvided){let b=Ut(this.configuration,D,Ct.PACKAGE_EXTENSION);switch(D.status){case"inactive":e.report.reportWarning(68,`${b}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case"redundant":e.report.reportWarning(69,`${b}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(u!==null){let E=G0(u,this.generateLockfile());if(E!==u){let w=ehe(n,n,u,E,void 0,void 0,{maxEditLength:100});if(w){e.report.reportSeparator();for(let D of w.hunks){e.report.reportInfo(null,`@@ -${D.oldStart},${D.oldLines} +${D.newStart},${D.newLines} @@`);for(let b of D.lines)b.startsWith("+")?e.report.reportError(28,Ut(this.configuration,b,Ct.ADDED)):b.startsWith("-")?e.report.reportError(28,Ut(this.configuration,b,Ct.REMOVED)):e.report.reportInfo(null,Ut(this.configuration,b,"grey"))}e.report.reportSeparator()}throw new Jt(28,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let E of a.values())for(let[,w]of E)for(let D of w)D.userProvided&&D.status==="active"&&ze.telemetry?.reportPackageExtension(Ig(D,Ct.PACKAGE_EXTENSION));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e)});let A=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],p=await Promise.all(A.map(async E=>px(E,{cwd:this.cwd})));(typeof e.persistProject>"u"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode==="update-lockfile"){e.report.reportWarning(73,`Skipped due to ${Ut(this.configuration,"mode=update-lockfile",Ct.CODE)}`);return}await this.linkEverything(e);let E=await Promise.all(A.map(async w=>px(w,{cwd:this.cwd})));for(let w=0;w{await this.configuration.triggerHook(E=>E.validateProjectAfterInstall,this,{reportWarning:(E,w)=>{e.report.reportWarning(E,w)},reportError:(E,w)=>{e.report.reportError(E,w),h=!0}})}),!h&&await this.configuration.triggerHook(E=>E.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,u]of this.storedResolutions.entries()){let A=e.get(u);A||e.set(u,A=new Set),A.add(n)}let r={},{cacheKey:o}=Wr.getCacheKey(this.configuration);r.__metadata={version:Tk,cacheKey:o};for(let[n,u]of e.entries()){let A=this.originalPackages.get(n);if(!A)continue;let p=[];for(let w of u){let D=this.storedDescriptors.get(w);if(!D)throw new Error("Assertion failed: The descriptor should have been registered");p.push(D)}let h=p.map(w=>ka(w)).sort().join(", "),E=new _t;E.version=A.linkType==="HARD"?A.version:"0.0.0-use.local",E.languageName=A.languageName,E.dependencies=new Map(A.dependencies),E.peerDependencies=new Map(A.peerDependencies),E.dependenciesMeta=new Map(A.dependenciesMeta),E.peerDependenciesMeta=new Map(A.peerDependenciesMeta),E.bin=new Map(A.bin),r[h]={...E.exportTo({},{compatibilityMode:!1}),linkType:A.linkType.toLowerCase(),resolution:Qa(A),checksum:this.storedChecksums.get(A.locatorHash),conditions:A.conditions||void 0}}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+Sa(r)}async persistLockfile(){let e=V.join(this.cwd,mr.lockfile),r="";try{r=await ae.readFilePromise(e,"utf8")}catch{}let o=this.generateLockfile(),a=G0(r,o);a!==r&&(await ae.writeFilePromise(e,a),this.lockFileChecksum=Ohe(a),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let u of Object.values(f8))e.push(...u);let r=(0,Fk.default)(this,e),o=p8.default.serialize(r),a=Ji(o);if(this.installStateChecksum===a)return;let n=this.configuration.get("installStatePath");await ae.mkdirPromise(V.dirname(n),{recursive:!0}),await ae.writeFilePromise(n,await IAt(o)),this.installStateChecksum=a}async restoreInstallState({restoreLinkersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:o=!0}={}){let a=this.configuration.get("installStatePath"),n;try{let u=await wAt(await ae.readFilePromise(a));n=p8.default.deserialize(u),this.installStateChecksum=Ji(u)}catch{r&&await this.applyLightResolution();return}e&&typeof n.linkersCustomData<"u"&&(this.linkersCustomData=n.linkersCustomData),o&&Object.assign(this,(0,Fk.default)(n,f8.restoreBuildState)),r&&(n.lockFileChecksum===this.lockFileChecksum?Object.assign(this,(0,Fk.default)(n,f8.restoreResolutions)):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new Ri}),await this.persistInstallStateFile()}async persist(){let e=(0,Rk.default)(4);await Promise.all([this.persistLockfile(),...this.workspaces.map(r=>e(()=>r.persistManifest()))])}async cacheCleanup({cache:e,report:r}){if(this.configuration.get("enableGlobalCache"))return null;let o=new Set([".gitignore"]);if(!n4(e.cwd,this.cwd)||!await ae.existsPromise(e.cwd))return null;let a=[];for(let u of await ae.readdirPromise(e.cwd)){if(o.has(u))continue;let A=V.resolve(e.cwd,u);e.markedFiles.has(A)||(e.immutable?r.reportError(56,`${Ut(this.configuration,V.basename(A),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):a.push(ae.lstatPromise(A).then(async p=>(await ae.removePromise(A),p.size))))}if(a.length===0)return null;let n=await Promise.all(a);return{count:a.length,size:n.reduce((u,A)=>u+A,0)}}}});function SAt(t){let o=Math.floor(t.timeNow/864e5),a=t.updateInterval*864e5,n=t.state.lastUpdate??t.timeNow+a+Math.floor(a*t.randomInitialInterval),u=n+a,A=t.state.lastTips??o*864e5,p=A+864e5+8*36e5-t.timeZone,h=u<=t.timeNow,E=p<=t.timeNow,w=null;return(h||E||!t.state.lastUpdate||!t.state.lastTips)&&(w={},w.lastUpdate=h?t.timeNow:n,w.lastTips=A,w.blocks=h?{}:t.state.blocks,w.displayedTips=t.state.displayedTips),{nextState:w,triggerUpdate:h,triggerTips:E,nextTips:E?o*864e5:A}}var sE,_he=It(()=>{St();r2();ah();eb();Gl();bf();sE=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.nextTips=0;this.displayedTips=[];this.shouldCommitTips=!1;this.configuration=e;let o=this.getRegistryPath();this.isNew=!ae.existsSync(o),this.shouldShowTips=!1,this.sendReport(r),this.startBuffer()}commitTips(){this.shouldShowTips&&(this.shouldCommitTips=!0)}selectTip(e){let r=new Set(this.displayedTips),o=A=>A&&nn?nA(nn,A):!1,a=e.map((A,p)=>p).filter(A=>e[A]&&o(e[A]?.selector));if(a.length===0)return null;let n=a.filter(A=>!r.has(A));if(n.length===0){let A=Math.floor(a.length*.2);this.displayedTips=A>0?this.displayedTips.slice(-A):[],n=a.filter(p=>!r.has(p))}let u=n[Math.floor(Math.random()*n.length)];return this.displayedTips.push(u),this.commitTips(),e[u]}reportVersion(e){this.reportValue("version",e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue("commandName",e||"")}reportPluginName(e){this.reportValue("pluginName",e)}reportProject(e){this.reportEnumerator("projectCount",e)}reportInstall(e){this.reportHit("installCount",e)}reportPackageExtension(e){this.reportValue("packageExtension",e)}reportWorkspaceCount(e){this.reportValue("workspaceCount",String(e))}reportDependencyCount(e){this.reportValue("dependencyCount",String(e))}reportValue(e,r){Jm(this.values,e).add(r)}reportEnumerator(e,r){Jm(this.enumerators,e).add(Ji(r))}reportHit(e,r="*"){let o=A1(this.hits,e),a=Al(o,r,()=>0);o.set(r,a+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return V.join(e,"telemetry.json")}sendReport(e){let r=this.getRegistryPath(),o;try{o=ae.readJsonSync(r)}catch{o={}}let{nextState:a,triggerUpdate:n,triggerTips:u,nextTips:A}=SAt({state:o,timeNow:Date.now(),timeZone:new Date().getTimezoneOffset()*60*1e3,randomInitialInterval:Math.random(),updateInterval:this.configuration.get("telemetryInterval")});if(this.nextTips=A,this.displayedTips=o.displayedTips??[],a!==null)try{ae.mkdirSync(V.dirname(r),{recursive:!0}),ae.writeJsonSync(r,a)}catch{return!1}if(u&&this.configuration.get("enableTips")&&(this.shouldShowTips=!0),n){let p=o.blocks??{};if(Object.keys(p).length===0){let h=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,E=w=>CU(h,w,{configuration:this.configuration}).catch(()=>{});for(let[w,D]of Object.entries(o.blocks??{})){if(Object.keys(D).length===0)continue;let b=D;b.userId=w,b.reportType="primary";for(let N of Object.keys(b.enumerators??{}))b.enumerators[N]=b.enumerators[N].length;E(b);let C=new Map,T=20;for(let[N,U]of Object.entries(b.values))U.length>0&&C.set(N,U.slice(0,T));for(;C.size>0;){let N={};N.userId=w,N.reportType="secondary",N.metrics={};for(let[U,J]of C)N.metrics[U]=J.shift(),J.length===0&&C.delete(U);E(N)}}}}return!0}applyChanges(){let e=this.getRegistryPath(),r;try{r=ae.readJsonSync(e)}catch{r={}}let o=this.configuration.get("telemetryUserId")??"*",a=r.blocks=r.blocks??{},n=a[o]=a[o]??{};for(let u of this.hits.keys()){let A=n.hits=n.hits??{},p=A[u]=A[u]??{};for(let[h,E]of this.hits.get(u))p[h]=(p[h]??0)+E}for(let u of["values","enumerators"])for(let A of this[u].keys()){let p=n[u]=n[u]??{};p[A]=[...new Set([...p[A]??[],...this[u].get(A)??[]])]}this.shouldCommitTips&&(r.lastTips=this.nextTips,r.displayedTips=this.displayedTips),ae.mkdirSync(V.dirname(e),{recursive:!0}),ae.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}}});var S2={};Vt(S2,{BuildDirectiveType:()=>Pk,CACHE_CHECKPOINT:()=>V_,CACHE_VERSION:()=>Sk,Cache:()=>Wr,Configuration:()=>ze,DEFAULT_RC_FILENAME:()=>PU,FormatType:()=>yce,InstallMode:()=>yl,LEGACY_PLUGINS:()=>j1,LOCKFILE_VERSION:()=>Tk,LegacyMigrationResolver:()=>tE,LightReport:()=>pA,LinkType:()=>$m,LockfileResolver:()=>rE,Manifest:()=>_t,MessageName:()=>vr,MultiFetcher:()=>py,PackageExtensionStatus:()=>sO,PackageExtensionType:()=>iO,PeerWarningType:()=>Lk,Project:()=>Qt,Report:()=>Ws,ReportError:()=>Jt,SettingsType:()=>G1,StreamReport:()=>Lt,TAG_REGEXP:()=>by,TelemetryManager:()=>sE,ThrowReport:()=>Ri,VirtualFetcher:()=>hy,WindowsLinkType:()=>ab,Workspace:()=>iE,WorkspaceFetcher:()=>gy,WorkspaceResolver:()=>ci,YarnVersion:()=>nn,execUtils:()=>Hr,folderUtils:()=>Bx,formatUtils:()=>pe,hashUtils:()=>bn,httpUtils:()=>on,miscUtils:()=>qe,nodeUtils:()=>Xi,parseMessageName:()=>jS,reportOptionDeprecations:()=>Qy,scriptUtils:()=>hn,semverUtils:()=>Ur,stringifyMessageName:()=>Ju,structUtils:()=>G,tgzUtils:()=>$i,treeUtils:()=>As});var Ve=It(()=>{nb();vx();Wl();ah();eb();Gl();rb();a3();bf();Io();_pe();Vpe();K_();W1();W1();Jpe();J_();zpe();z_();Ay();GS();YM();Uhe();Kl();n2();_he();u8();KM();JM();Dg();A8();r2();iie()});var Yhe=_((b_t,x2)=>{"use strict";var xAt=process.env.TERM_PROGRAM==="Hyper",bAt=process.platform==="win32",jhe=process.platform==="linux",d8={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Ghe=Object.assign({},d8,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),Whe=Object.assign({},d8,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:jhe?"\u25B8":"\u276F",pointerSmall:jhe?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});x2.exports=bAt&&!xAt?Ghe:Whe;Reflect.defineProperty(x2.exports,"common",{enumerable:!1,value:d8});Reflect.defineProperty(x2.exports,"windows",{enumerable:!1,value:Ghe});Reflect.defineProperty(x2.exports,"other",{enumerable:!1,value:Whe})});var eu=_((k_t,m8)=>{"use strict";var kAt=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),QAt=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Vhe=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=n=>{let u=n.open=`\x1B[${n.codes[0]}m`,A=n.close=`\x1B[${n.codes[1]}m`,p=n.regex=new RegExp(`\\u001b\\[${n.codes[1]}m`,"g");return n.wrap=(h,E)=>{h.includes(A)&&(h=h.replace(p,A+u));let w=u+h+A;return E?w.replace(/\r*\n/g,`${A}$&${u}`):w},n},r=(n,u,A)=>typeof n=="function"?n(u):n.wrap(u,A),o=(n,u)=>{if(n===""||n==null)return"";if(t.enabled===!1)return n;if(t.visible===!1)return"";let A=""+n,p=A.includes(` -`),h=u.length;for(h>0&&u.includes("unstyle")&&(u=[...new Set(["unstyle",...u])].reverse());h-- >0;)A=r(t.styles[u[h]],A,p);return A},a=(n,u,A)=>{t.styles[n]=e({name:n,codes:u}),(t.keys[A]||(t.keys[A]=[])).push(n),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(h){t.alias(n,h)},get(){let h=E=>o(E,h.stack);return Reflect.setPrototypeOf(h,t),h.stack=this.stack?this.stack.concat(n):[n],h}})};return a("reset",[0,0],"modifier"),a("bold",[1,22],"modifier"),a("dim",[2,22],"modifier"),a("italic",[3,23],"modifier"),a("underline",[4,24],"modifier"),a("inverse",[7,27],"modifier"),a("hidden",[8,28],"modifier"),a("strikethrough",[9,29],"modifier"),a("black",[30,39],"color"),a("red",[31,39],"color"),a("green",[32,39],"color"),a("yellow",[33,39],"color"),a("blue",[34,39],"color"),a("magenta",[35,39],"color"),a("cyan",[36,39],"color"),a("white",[37,39],"color"),a("gray",[90,39],"color"),a("grey",[90,39],"color"),a("bgBlack",[40,49],"bg"),a("bgRed",[41,49],"bg"),a("bgGreen",[42,49],"bg"),a("bgYellow",[43,49],"bg"),a("bgBlue",[44,49],"bg"),a("bgMagenta",[45,49],"bg"),a("bgCyan",[46,49],"bg"),a("bgWhite",[47,49],"bg"),a("blackBright",[90,39],"bright"),a("redBright",[91,39],"bright"),a("greenBright",[92,39],"bright"),a("yellowBright",[93,39],"bright"),a("blueBright",[94,39],"bright"),a("magentaBright",[95,39],"bright"),a("cyanBright",[96,39],"bright"),a("whiteBright",[97,39],"bright"),a("bgBlackBright",[100,49],"bgBright"),a("bgRedBright",[101,49],"bgBright"),a("bgGreenBright",[102,49],"bgBright"),a("bgYellowBright",[103,49],"bgBright"),a("bgBlueBright",[104,49],"bgBright"),a("bgMagentaBright",[105,49],"bgBright"),a("bgCyanBright",[106,49],"bgBright"),a("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=QAt,t.hasColor=t.hasAnsi=n=>(t.ansiRegex.lastIndex=0,typeof n=="string"&&n!==""&&t.ansiRegex.test(n)),t.alias=(n,u)=>{let A=typeof u=="string"?t[u]:u;if(typeof A!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");A.stack||(Reflect.defineProperty(A,"name",{value:n}),t.styles[n]=A,A.stack=[n]),Reflect.defineProperty(t,n,{configurable:!0,enumerable:!0,set(p){t.alias(n,p)},get(){let p=h=>o(h,p.stack);return Reflect.setPrototypeOf(p,t),p.stack=this.stack?this.stack.concat(A.stack):A.stack,p}})},t.theme=n=>{if(!kAt(n))throw new TypeError("Expected theme to be an object");for(let u of Object.keys(n))t.alias(u,n[u]);return t},t.alias("unstyle",n=>typeof n=="string"&&n!==""?(t.ansiRegex.lastIndex=0,n.replace(t.ansiRegex,"")):""),t.alias("noop",n=>n),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Yhe(),t.define=a,t};m8.exports=Vhe();m8.exports.create=Vhe});var xo=_(an=>{"use strict";var FAt=Object.prototype.toString,ic=eu(),Khe=!1,y8=[],Jhe={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};an.longest=(t,e)=>t.reduce((r,o)=>Math.max(r,e?o[e].length:o.length),0);an.hasColor=t=>!!t&&ic.hasColor(t);var Ok=an.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);an.nativeType=t=>FAt.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");an.isAsyncFn=t=>an.nativeType(t)==="asyncfunction";an.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";an.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;an.scrollDown=(t=[])=>[...t.slice(1),t[0]];an.scrollUp=(t=[])=>[t.pop(),...t];an.reorder=(t=[])=>{let e=t.slice();return e.sort((r,o)=>r.index>o.index?1:r.index{let o=t.length,a=r===o?0:r<0?o-1:r,n=t[e];t[e]=t[a],t[a]=n};an.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};an.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};an.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:o=` -`+r,width:a=80}=e,n=(o+r).match(/[^\S\n]/g)||[];a-=n.length;let u=`.{1,${a}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,A=t.trim(),p=new RegExp(u,"g"),h=A.match(p)||[];return h=h.map(E=>E.replace(/\n$/,"")),e.padEnd&&(h=h.map(E=>E.padEnd(a," "))),e.padStart&&(h=h.map(E=>E.padStart(a," "))),r+h.join(o)};an.unmute=t=>{let e=t.stack.find(o=>ic.keys.color.includes(o));return e?ic[e]:t.stack.find(o=>o.slice(2)==="bg")?ic[e.slice(2)]:o=>o};an.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";an.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>ic.keys.color.includes(o));if(e){let o=ic["bg"+an.pascal(e)];return o?o.black:t}let r=t.stack.find(o=>o.slice(0,2)==="bg");return r?ic[r.slice(2).toLowerCase()]||t:ic.none};an.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(o=>ic.keys.color.includes(o)),r=t.stack.find(o=>o.slice(0,2)==="bg");if(e&&!r)return ic[Jhe[e]||e];if(r){let o=r.slice(2).toLowerCase(),a=Jhe[o];return a&&ic["bg"+an.pascal(a)]||t}return ic.none};an.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),o=e>=12?"pm":"am";e=e%12;let a=e===0?12:e,n=r<10?"0"+r:r;return a+":"+n+" "+o};an.set=(t={},e="",r)=>e.split(".").reduce((o,a,n,u)=>{let A=u.length-1>n?o[a]||{}:r;return!an.isObject(A)&&n{let o=t[e]==null?e.split(".").reduce((a,n)=>a&&a[n],t):t[e];return o??r};an.mixin=(t,e)=>{if(!Ok(t))return e;if(!Ok(e))return t;for(let r of Object.keys(e)){let o=Object.getOwnPropertyDescriptor(e,r);if(o.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&Ok(o.value)){let a=Object.getOwnPropertyDescriptor(t,r);Ok(a.value)?t[r]=an.merge({},t[r],e[r]):Reflect.defineProperty(t,r,o)}else Reflect.defineProperty(t,r,o);else Reflect.defineProperty(t,r,o)}return t};an.merge=(...t)=>{let e={};for(let r of t)an.mixin(e,r);return e};an.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let o of Object.keys(r)){let a=r[o];typeof a=="function"?an.define(t,o,a.bind(e)):an.define(t,o,a)}};an.onExit=t=>{let e=(r,o)=>{Khe||(Khe=!0,y8.forEach(a=>a()),r===!0&&process.exit(128+o))};y8.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),y8.push(t)};an.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};an.defineExport=(t,e,r)=>{let o;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(a){o=a},get(){return o?o():r()}})}});var zhe=_(cE=>{"use strict";cE.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};cE.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};cE.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};cE.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};cE.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var $he=_((R_t,Zhe)=>{"use strict";var Xhe=ve("readline"),RAt=zhe(),TAt=/^(?:\x1b)([a-zA-Z0-9])$/,LAt=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,NAt={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function OAt(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function MAt(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var Mk=(t="",e={})=>{let r,o={name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t,...e};if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t="\x1B"+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=o.sequence||""),o.sequence=o.sequence||t||o.name,t==="\r")o.raw=void 0,o.name="return";else if(t===` -`)o.name="enter";else if(t===" ")o.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x1B\x7F"||t==="\x1B\b")o.name="backspace",o.meta=t.charAt(0)==="\x1B";else if(t==="\x1B"||t==="\x1B\x1B")o.name="escape",o.meta=t.length===2;else if(t===" "||t==="\x1B ")o.name="space",o.meta=t.length===2;else if(t<="")o.name=String.fromCharCode(t.charCodeAt(0)+97-1),o.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")o.name="number";else if(t.length===1&&t>="a"&&t<="z")o.name=t;else if(t.length===1&&t>="A"&&t<="Z")o.name=t.toLowerCase(),o.shift=!0;else if(r=TAt.exec(t))o.meta=!0,o.shift=/^[A-Z]$/.test(r[1]);else if(r=LAt.exec(t)){let a=[...t];a[0]==="\x1B"&&a[1]==="\x1B"&&(o.option=!0);let n=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),u=(r[3]||r[5]||1)-1;o.ctrl=!!(u&4),o.meta=!!(u&10),o.shift=!!(u&1),o.code=n,o.name=NAt[n],o.shift=OAt(n)||o.shift,o.ctrl=MAt(n)||o.ctrl}return o};Mk.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let o=Xhe.createInterface({terminal:!0,input:r});Xhe.emitKeypressEvents(r,o);let a=(A,p)=>e(A,Mk(A,p),o),n=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",a),o.resume(),()=>{r.isTTY&&r.setRawMode(n),r.removeListener("keypress",a),o.pause(),o.close()}};Mk.action=(t,e,r)=>{let o={...RAt,...r};return e.ctrl?(e.action=o.ctrl[e.name],e):e.option&&o.option?(e.action=o.option[e.name],e):e.shift?(e.action=o.shift[e.name],e):(e.action=o.keys[e.name],e)};Zhe.exports=Mk});var t0e=_((T_t,e0e)=>{"use strict";e0e.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(e)for(let r of Object.keys(e)){let o=e[r];typeof o=="number"&&(o={interval:o}),UAt(t,r,o)}};function UAt(t,e,r={}){let o=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},a=r.interval||120;o.frames=r.frames||[],o.loading=!0;let n=setInterval(()=>{o.ms=Date.now()-o.start,o.tick++,t.render()},a);return o.stop=()=>{o.loading=!1,clearInterval(n)},Reflect.defineProperty(o,"interval",{value:n}),t.once("close",()=>o.stop()),o.stop}});var n0e=_((L_t,r0e)=>{"use strict";var{define:_At,width:HAt}=xo(),E8=class{constructor(e){let r=e.options;_At(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=HAt(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e={...this};return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};r0e.exports=E8});var s0e=_((N_t,i0e)=>{"use strict";var C8=xo(),Vs=eu(),I8={default:Vs.noop,noop:Vs.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||C8.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||C8.complement(this.primary)},primary:Vs.cyan,success:Vs.green,danger:Vs.magenta,strong:Vs.bold,warning:Vs.yellow,muted:Vs.dim,disabled:Vs.gray,dark:Vs.dim.gray,underline:Vs.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};I8.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(Vs.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(Vs.visible=t.styles.visible);let e=C8.merge({},I8,t.styles);delete e.merge;for(let r of Object.keys(Vs))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Vs[r]});for(let r of Object.keys(Vs.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Vs[r]});return e};i0e.exports=I8});var a0e=_((O_t,o0e)=>{"use strict";var w8=process.platform==="win32",Yf=eu(),qAt=xo(),B8={...Yf.symbols,upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Yf.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Yf.symbols.question,submitted:Yf.symbols.check,cancelled:Yf.symbols.cross},separator:{pending:Yf.symbols.pointerSmall,submitted:Yf.symbols.middot,cancelled:Yf.symbols.middot},radio:{off:w8?"( )":"\u25EF",on:w8?"(*)":"\u25C9",disabled:w8?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]};B8.merge=t=>{let e=qAt.merge({},Yf.symbols,B8,t.symbols);return delete e.merge,e};o0e.exports=B8});var c0e=_((M_t,l0e)=>{"use strict";var jAt=s0e(),GAt=a0e(),WAt=xo();l0e.exports=t=>{t.options=WAt.merge({},t.options.theme,t.options),t.symbols=GAt.merge(t.options),t.styles=jAt.merge(t.options)}});var h0e=_((f0e,p0e)=>{"use strict";var u0e=process.env.TERM_PROGRAM==="Apple_Terminal",YAt=eu(),v8=xo(),tu=p0e.exports=f0e,Pi="\x1B[",A0e="\x07",D8=!1,kh=tu.code={bell:A0e,beep:A0e,beginning:`${Pi}G`,down:`${Pi}J`,esc:Pi,getPosition:`${Pi}6n`,hide:`${Pi}?25l`,line:`${Pi}2K`,lineEnd:`${Pi}K`,lineStart:`${Pi}1K`,restorePosition:Pi+(u0e?"8":"u"),savePosition:Pi+(u0e?"7":"s"),screen:`${Pi}2J`,show:`${Pi}?25h`,up:`${Pi}1J`},Yg=tu.cursor={get hidden(){return D8},hide(){return D8=!0,kh.hide},show(){return D8=!1,kh.show},forward:(t=1)=>`${Pi}${t}C`,backward:(t=1)=>`${Pi}${t}D`,nextLine:(t=1)=>`${Pi}E`.repeat(t),prevLine:(t=1)=>`${Pi}F`.repeat(t),up:(t=1)=>t?`${Pi}${t}A`:"",down:(t=1)=>t?`${Pi}${t}B`:"",right:(t=1)=>t?`${Pi}${t}C`:"",left:(t=1)=>t?`${Pi}${t}D`:"",to(t,e){return e?`${Pi}${e+1};${t+1}H`:`${Pi}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Yg.left(-t):t>0?Yg.right(t):"",r+=e<0?Yg.up(-e):e>0?Yg.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:o,input:a,prompt:n,size:u,value:A}=t;if(o=v8.isPrimitive(o)?String(o):"",a=v8.isPrimitive(a)?String(a):"",A=v8.isPrimitive(A)?String(A):"",u){let p=tu.cursor.up(u)+tu.cursor.to(n.length),h=a.length-r;return h>0&&(p+=tu.cursor.left(h)),p}if(A||e){let p=!a&&o?-o.length:-a.length+r;return e&&(p-=e.length),a===""&&o&&!n.includes(o)&&(p+=o.length),tu.cursor.move(p)}}},S8=tu.erase={screen:kh.screen,up:kh.up,down:kh.down,line:kh.line,lineEnd:kh.lineEnd,lineStart:kh.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return S8.line+Yg.to(0);let r=n=>[...YAt.unstyle(n)].length,o=t.split(/\r?\n/),a=0;for(let n of o)a+=1+Math.floor(Math.max(r(n)-1,0)/e);return(S8.line+Yg.prevLine()).repeat(a-1)+S8.line+Yg.to(0)}});var uE=_((U_t,d0e)=>{"use strict";var VAt=ve("events"),g0e=eu(),P8=$he(),KAt=t0e(),JAt=n0e(),zAt=c0e(),Na=xo(),Vg=h0e(),x8=class t extends VAt{constructor(e={}){super(),this.name=e.name,this.type=e.type,this.options=e,zAt(this),KAt(this),this.state=new JAt(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=ZAt(this.options.margin),this.setMaxListeners(0),XAt(this)}async keypress(e,r={}){this.keypressed=!0;let o=P8.action(e,P8(e,r),this.options.actions);this.state.keypress=o,this.emit("keypress",e,o),this.emit("state",this.state.clone());let a=this.options[o.action]||this[o.action]||this.dispatch;if(typeof a=="function")return await a.call(this,e,o);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Vg.code.beep)}cursorHide(){this.stdout.write(Vg.cursor.hide()),Na.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Vg.cursor.show())}write(e){e&&(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Vg.cursor.down(e)+Vg.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:o}=this.sections(),{cursor:a,initial:n="",input:u="",value:A=""}=this,p=this.state.size=o.length,h={after:r,cursor:a,initial:n,input:u,prompt:e,size:p,value:A},E=Vg.cursor.restore(h);E&&this.stdout.write(E)}sections(){let{buffer:e,input:r,prompt:o}=this.state;o=g0e.unstyle(o);let a=g0e.unstyle(e),n=a.indexOf(o),u=a.slice(0,n),p=a.slice(n).split(` -`),h=p[0],E=p[p.length-1],D=(o+(r?" "+r:"")).length,b=De.call(this,this.value),this.result=()=>o.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let a=r.onSubmit.bind(this),n=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await a(this.name,this.value,this),n())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,o){let{options:a,state:n,symbols:u,timers:A}=this,p=A&&A[e];n.timer=p;let h=a[e]||n[e]||u[e],E=r&&r[e]!=null?r[e]:await h;if(E==="")return E;let w=await this.resolve(E,n,r,o);return!w&&r&&r[e]?this.resolve(h,n,r,o):w}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,o=this.state;return o.timer=r,Na.isObject(e)&&(e=e[o.status]||e.pending),Na.hasColor(e)?e:(this.styles[o.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Na.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,o=this.state;o.timer=r;let a=e[o.status]||e.pending||o.separator,n=await this.resolve(a,o);return Na.isObject(n)&&(n=n[o.status]||n.pending),Na.hasColor(n)?n:this.styles.muted(n)}async pointer(e,r){let o=await this.element("pointer",e,r);if(typeof o=="string"&&Na.hasColor(o))return o;if(o){let a=this.styles,n=this.index===r,u=n?a.primary:h=>h,A=await this.resolve(o[n?"on":"off"]||o,this.state),p=Na.hasColor(A)?A:u(A);return n?p:" ".repeat(A.length)}}async indicator(e,r){let o=await this.element("indicator",e,r);if(typeof o=="string"&&Na.hasColor(o))return o;if(o){let a=this.styles,n=e.enabled===!0,u=n?a.success:a.dark,A=o[n?"on":"off"]||o;return Na.hasColor(A)?A:u(A)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Na.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Na.resolve(this,e,...r)}get base(){return t.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Na.height(this.stdout,25)}get width(){return this.options.columns||Na.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,o=[r,e].find(this.isValue.bind(this));return this.isValue(o)?o:this.initial}static get prompt(){return e=>new this(e).run()}};function XAt(t){let e=a=>t[a]===void 0||typeof t[a]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],o=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let a of Object.keys(t.options)){if(r.includes(a)||/^on[A-Z]/.test(a))continue;let n=t.options[a];typeof n=="function"&&e(a)?o.includes(a)||(t[a]=n.bind(t)):typeof t[a]!="function"&&(t[a]=n)}}function ZAt(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=a=>a%2===0?` -`:" ",o=[];for(let a=0;a<4;a++){let n=r(a);e[a]?o.push(n.repeat(e[a])):o.push("")}return o}d0e.exports=x8});var E0e=_((__t,y0e)=>{"use strict";var $At=xo(),m0e={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return m0e.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};y0e.exports=(t,e={})=>{let r=$At.merge({},m0e,e.roles);return r[t]||r.default}});var b2=_((H_t,w0e)=>{"use strict";var eft=eu(),tft=uE(),rft=E0e(),Uk=xo(),{reorder:b8,scrollUp:nft,scrollDown:ift,isObject:C0e,swap:sft}=Uk,k8=class extends tft{constructor(e){super(e),this.cursorHide(),this.maxSelected=e.maxSelected||1/0,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:o,suggest:a}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(n=>n.enabled=!1),typeof a!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");C0e(r)&&(r=Object.keys(r)),Array.isArray(r)?(o!=null&&(this.index=this.findIndex(o)),r.forEach(n=>this.enable(this.find(n))),await this.render()):(o!=null&&(r=o),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let o=[],a=0,n=async(u,A)=>{typeof u=="function"&&(u=await u.call(this)),u instanceof Promise&&(u=await u);for(let p=0;p(this.state.loadingChoices=!1,u))}async toChoice(e,r,o){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let a=e.value;if(e=rft(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,Uk.define(e,"parent",o),e.level=o?o.level+1:1,e.indent==null&&(e.indent=o?o.indent+" ":e.indent||""),e.path=o?o.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,eft.unstyle(e.message).length));let u={...e};return e.reset=(A=u.input,p=u.value)=>{for(let h of Object.keys(u))e[h]=u[h];e.input=A,e.value=p},a==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,o){let a=await this.toChoice(e,r,o);return this.choices.push(a),this.index=this.choices.length-1,this.limit=this.choices.length,a}async newItem(e,r,o){let a={name:"New choice name?",editable:!0,newChoice:!0,...e},n=await this.addChoice(a,r,o);return n.updateChoice=()=>{delete n.newChoice,n.name=n.message=n.input,n.input="",n.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(a=>this.toggle(a,r));let o=e.parent;for(;o;){let a=o.choices.filter(n=>this.isDisabled(n));o.enabled=a.every(n=>n.enabled===!0),o=o.parent}return I0e(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=o=>{let a=Number(o);if(a>this.choices.length-1)return this.alert();let n=this.focused,u=this.choices.find(A=>a===A.index);if(!u.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(u)===-1){let A=b8(this.choices),p=A.indexOf(u);if(n.index>p){let h=A.slice(p,p+this.limit),E=A.filter(w=>!h.includes(w));this.choices=h.concat(E)}else{let h=p-this.limit+1;this.choices=A.slice(h).concat(A.slice(0,h))}}return this.index=this.choices.indexOf(u),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(o=>{let a=this.choices.length,n=this.num,u=(A=!1,p)=>{clearTimeout(this.numberTimeout),A&&(p=r(n)),this.num="",o(p)};if(n==="0"||n.length===1&&+(n+"0")>a)return u(!0);if(Number(n)>a)return u(!1,this.alert());this.numberTimeout=setTimeout(()=>u(!0),this.delay)})}home(){return this.choices=b8(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=b8(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===0?this.alert():e>r&&o===0?this.scrollUp():(this.index=(o-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,o=this.index;return this.options.scroll===!1&&o===r-1?this.alert():e>r&&o===r-1?this.scrollDown():(this.index=(o+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=nft(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=ift(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){sft(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(o=>e[o]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(o=>!this.isDisabled(o));return e.enabled&&r.every(o=>this.isEnabled(o))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((o,a)=>(o[a]=this.find(a,r),o),{})}filter(e,r){let a=typeof e=="function"?e:(A,p)=>[A.name,p].includes(e),u=(this.options.multiple?this.state._choices:this.choices).filter(a);return r?u.map(A=>A[r]):u}find(e,r){if(C0e(e))return r?e[r]:e;let a=typeof e=="function"?e:(u,A)=>[u.name,A].includes(e),n=this.choices.find(a);if(n)return r?n[r]:n}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(u=>u.newChoice))return this.alert();let{reorder:r,sort:o}=this.options,a=this.multiple===!0,n=this.selected;return n===void 0?this.alert():(Array.isArray(n)&&r!==!1&&o!==!0&&(n=Uk.reorder(n)),this.value=a?n.map(u=>u.name):n.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(o=>o.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let o=this.find(r);o&&(this.initial=o.index,this.focus(o,!0))}}}get choices(){return I0e(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:o}=this,a=e.limit||this._limit||r.limit||o.length;return Math.min(a,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function I0e(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(Uk.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let o=r.choices.filter(a=>!t.isDisabled(a));r.enabled=o.every(a=>a.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}w0e.exports=k8});var Qh=_((q_t,B0e)=>{"use strict";var oft=b2(),Q8=xo(),F8=class extends oft{constructor(e){super(e),this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let o=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!Q8.hasColor(o)&&(o=this.styles.strong(o)),this.resolve(o,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await this.indicator(e,r)+(e.pad||""),u=await this.resolve(e.hint,this.state,e,r);u&&!Q8.hasColor(u)&&(u=this.styles.muted(u));let A=this.indent(e),p=await this.choiceMessage(e,r),h=()=>[this.margin[3],A+a+n,p,this.margin[1],u].filter(Boolean).join(" ");return e.role==="heading"?h():e.disabled?(Q8.hasColor(p)||(p=this.styles.disabled(p)),h()):(o&&(p=this.styles.em(p)),h())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(n,u)=>await this.renderChoice(n,u)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let o=this.margin[0]+r.join(` -`),a;return this.options.choicesHeader&&(a=await this.resolve(this.options.choicesHeader,this.state)),[a,o].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,o="",a=await this.header(),n=await this.prefix(),u=await this.separator(),A=await this.message();this.options.promptLine!==!1&&(o=[n,A,u,""].join(" "),this.state.prompt=o);let p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),w=await this.footer();p&&(o+=p),h&&!o.includes(h)&&(o+=" "+h),e&&!p&&!E.trim()&&this.multiple&&this.emptyError!=null&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([a,o,E,w].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};B0e.exports=F8});var D0e=_((j_t,v0e)=>{"use strict";var aft=Qh(),lft=(t,e)=>{let r=t.toLowerCase();return o=>{let n=o.toLowerCase().indexOf(r),u=e(o.slice(n,n+r.length));return n>=0?o.slice(0,n)+u+o.slice(n+r.length):o}},R8=class extends aft{constructor(e){super(e),this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:o}=this.state;return this.input=o.slice(0,r)+e+o.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let o=e.toLowerCase();return r.filter(a=>a.message.toLowerCase().includes(o))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=lft(this.input,e),o=this.choices;this.choices=o.map(a=>({...a,message:r(a.message)})),await super.render(),this.choices=o}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};v0e.exports=R8});var L8=_((G_t,S0e)=>{"use strict";var T8=xo();S0e.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:o="",pos:a,showCursor:n=!0,color:u}=e,A=u||t.styles.placeholder,p=T8.inverse(t.styles.primary),h=T=>p(t.styles.black(T)),E=r,w=" ",D=h(w);if(t.blink&&t.blink.off===!0&&(h=T=>T,D=""),n&&a===0&&o===""&&r==="")return h(w);if(n&&a===0&&(r===o||r===""))return h(o[0])+A(o.slice(1));o=T8.isPrimitive(o)?`${o}`:"",r=T8.isPrimitive(r)?`${r}`:"";let b=o&&o.startsWith(r)&&o!==r,C=b?h(o[r.length]):D;if(a!==r.length&&n===!0&&(E=r.slice(0,a)+h(r[a])+r.slice(a+1),C=""),n===!1&&(C=""),b){let T=t.styles.unstyle(E+C);return E+C+A(o.slice(T.length))}return E+C}});var _k=_((W_t,P0e)=>{"use strict";var cft=eu(),uft=Qh(),Aft=L8(),N8=class extends uft{constructor(e){super({...e,multiple:!0}),this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:o,input:a}=r;return r.value=r.input=a.slice(0,o)+e+a.slice(o),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:o}=e;return e.value=e.input=o.slice(0,r-1)+o.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:o}=e;if(o[r]===void 0)return this.alert();let a=`${o}`.slice(0,r)+`${o}`.slice(r+1);return e.value=e.input=a,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:o}=e;return r&&r.startsWith(o)&&o!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let o=await this.resolve(e.separator,this.state,e,r)||":";return o?" "+this.styles.disabled(o):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:o,styles:a}=this,{cursor:n,initial:u="",name:A,hint:p,input:h=""}=e,{muted:E,submitted:w,primary:D,danger:b}=a,C=p,T=this.index===r,N=e.validate||(()=>!0),U=await this.choiceSeparator(e,r),J=e.message;this.align==="right"&&(J=J.padStart(this.longest+1," ")),this.align==="left"&&(J=J.padEnd(this.longest+1," "));let te=this.values[A]=h||u,le=h?"success":"dark";await N.call(e,te,this.state)!==!0&&(le="danger");let ce=a[le],ue=ce(await this.indicator(e,r))+(e.pad||""),Ie=this.indent(e),he=()=>[Ie,ue,J+U,h,C].filter(Boolean).join(" ");if(o.submitted)return J=cft.unstyle(J),h=w(h),C="",he();if(e.format)h=await e.format.call(this,h,e,r);else{let De=this.styles.muted;h=Aft(this,{input:h,initial:u,pos:n,showCursor:T,color:De})}return this.isValue(h)||(h=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[A]=await e.result.call(this,te,e,r)),T&&(J=D(J)),e.error?h+=(h?" ":"")+b(e.error.trim()):e.hint&&(h+=(h?" ":"")+E(e.hint.trim())),he()}async submit(){return this.value=this.values,super.base.submit.call(this)}};P0e.exports=N8});var O8=_((Y_t,b0e)=>{"use strict";var fft=_k(),pft=()=>{throw new Error("expected prompt to have a custom authenticate method")},x0e=(t=pft)=>{class e extends fft{constructor(o){super(o)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(o){return x0e(o)}}return e};b0e.exports=x0e()});var F0e=_((V_t,Q0e)=>{"use strict";var hft=O8();function gft(t,e){return t.username===this.options.username&&t.password===this.options.password}var k0e=(t=gft)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(o){return this.options.showPassword?o:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(o.length))}}];class r extends hft.create(t){constructor(a){super({...a,choices:e})}static create(a){return k0e(a)}}return r};Q0e.exports=k0e()});var Hk=_((K_t,R0e)=>{"use strict";var dft=uE(),{isPrimitive:mft,hasColor:yft}=xo(),M8=class extends dft{constructor(e){super(e),this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:o}=this;return o.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return mft(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return yft(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=this.styles.muted(this.default),A=[o,n,u,a].filter(Boolean).join(" ");this.state.prompt=A;let p=await this.header(),h=this.value=this.cast(e),E=await this.format(h),w=await this.error()||await this.hint(),D=await this.footer();w&&!A.includes(w)&&(E+=" "+w),A+=" "+E,this.clear(r),this.write([p,A,D].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};R0e.exports=M8});var L0e=_((J_t,T0e)=>{"use strict";var Eft=Hk(),U8=class extends Eft{constructor(e){super(e),this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};T0e.exports=U8});var O0e=_((z_t,N0e)=>{"use strict";var Cft=Qh(),Ift=_k(),AE=Ift.prototype,_8=class extends Cft{constructor(e){super({...e,multiple:!0}),this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let o=this.focused,a=o.parent||{};return!o.editable&&!a.editable&&(e==="a"||e==="i")?super[e]():AE.dispatch.call(this,e,r)}append(e,r){return AE.append.call(this,e,r)}delete(e,r){return AE.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?AE.next.call(this):super.next()}prev(){return this.focused.editable?AE.prev.call(this):super.prev()}async indicator(e,r){let o=e.indicator||"",a=e.editable?o:super.indicator(e,r);return await this.resolve(a,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?AE.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let o=r.parent?this.value[r.parent.name]:this.value;if(r.editable?o=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(o=r.enabled===!0),e=await r.validate(o,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};N0e.exports=_8});var Kg=_((X_t,M0e)=>{"use strict";var wft=uE(),Bft=L8(),{isPrimitive:vft}=xo(),H8=class extends wft{constructor(e){super(e),this.initial=vft(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let o=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!o||o.name!=="return")?this.append(` -`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:o}=this.state;this.input=`${o}`.slice(0,r)+e+`${o}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),o=this.input.slice(e),a=r.split(" ");this.state.clipboard.push(a.pop()),this.input=a.join(" "),this.cursor=this.input.length,this.input+=o,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):Bft(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),o=await this.separator(),a=await this.message(),n=[r,a,o].filter(Boolean).join(" ");this.state.prompt=n;let u=await this.header(),A=await this.format(),p=await this.error()||await this.hint(),h=await this.footer();p&&!A.includes(p)&&(A+=" "+p),n+=" "+A,this.clear(e),this.write([u,n,h].filter(Boolean).join(` -`)),this.restore()}};M0e.exports=H8});var _0e=_((Z_t,U0e)=>{"use strict";var Dft=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),qk=t=>Dft(t).filter(Boolean);U0e.exports=(t,e={},r="")=>{let{past:o=[],present:a=""}=e,n,u;switch(t){case"prev":case"undo":return n=o.slice(0,o.length-1),u=o[o.length-1]||"",{past:qk([r,...n]),present:u};case"next":case"redo":return n=o.slice(1),u=o[0]||"",{past:qk([...n,r]),present:u};case"save":return{past:qk([...o,r]),present:""};case"remove":return u=qk(o.filter(A=>A!==r)),a="",u.length&&(a=u.pop()),{past:u,present:a};default:throw new Error(`Invalid action: "${t}"`)}}});var j8=_(($_t,q0e)=>{"use strict";var Sft=Kg(),H0e=_0e(),q8=class extends Sft{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let o=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:o},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=H0e(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){this.store&&(this.data=H0e("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};q0e.exports=q8});var G0e=_((e8t,j0e)=>{"use strict";var Pft=Kg(),G8=class extends Pft{format(){return""}};j0e.exports=G8});var Y0e=_((t8t,W0e)=>{"use strict";var xft=Kg(),W8=class extends xft{constructor(e={}){super(e),this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};W0e.exports=W8});var K0e=_((r8t,V0e)=>{"use strict";var bft=Qh(),Y8=class extends bft{constructor(e){super({...e,multiple:!0})}};V0e.exports=Y8});var K8=_((n8t,J0e)=>{"use strict";var kft=Kg(),V8=class extends kft{constructor(e={}){super({style:"number",...e}),this.min=this.isValue(e.min)?this.toNumber(e.min):-1/0,this.max=this.isValue(e.max)?this.toNumber(e.max):1/0,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,o=this.toNumber(this.input);return o>this.max+r?this.alert():(this.input=`${o+r}`,this.render())}down(e){let r=e||this.minor,o=this.toNumber(this.input);return othis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};J0e.exports=V8});var X0e=_((i8t,z0e)=>{z0e.exports=K8()});var $0e=_((s8t,Z0e)=>{"use strict";var Qft=Kg(),J8=class extends Qft{constructor(e){super(e),this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};Z0e.exports=J8});var rge=_((o8t,tge)=>{"use strict";var Fft=eu(),Rft=b2(),ege=xo(),z8=class extends Rft{constructor(e={}){super(e),this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((o,a)=>({name:a+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let o=0;o=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){return this.scaleKey===!1||this.state.submitted?"":["",...this.scale.map(o=>` ${o.name} - ${o.message}`)].map(o=>this.styles.muted(o)).join(` -`)}renderScaleHeading(e){let r=this.scale.map(p=>p.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let o=this.scaleLength-r.join("").length,a=Math.round(o/(r.length-1)),u=r.map(p=>this.styles.strong(p)).join(" ".repeat(a)),A=" ".repeat(this.widths[0]);return this.margin[3]+A+this.margin[1]+u}scaleIndicator(e,r,o){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,o);let a=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):a?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let o=e.scale.map(n=>this.scaleIndicator(e,n,r)),a=this.term==="Hyper"?"":" ";return o.join(a+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=await this.pointer(e,r),n=await e.hint;n&&!ege.hasColor(n)&&(n=this.styles.muted(n));let u=C=>this.margin[3]+C.replace(/\s+$/,"").padEnd(this.widths[0]," "),A=this.newline,p=this.indent(e),h=await this.resolve(e.message,this.state,e,r),E=await this.renderScale(e,r),w=this.margin[1]+this.margin[3];this.scaleLength=Fft.unstyle(E).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-w.length);let b=ege.wordWrap(h,{width:this.widths[0],newline:A}).split(` -`).map(C=>u(C)+this.margin[1]);return o&&(E=this.styles.info(E),b=b.map(C=>this.styles.info(C))),b[0]+=E,this.linebreak&&b.push(""),[p+a,b.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(a,n)=>await this.renderChoice(a,n)),r=await Promise.all(e),o=await this.renderScaleHeading();return this.margin[0]+[o,...r.map(a=>a.join(" "))].join(` -`)}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u="";this.options.promptLine!==!1&&(u=[o,n,a,""].join(" "),this.state.prompt=u);let A=await this.header(),p=await this.format(),h=await this.renderScaleKey(),E=await this.error()||await this.hint(),w=await this.renderChoices(),D=await this.footer(),b=this.emptyError;p&&(u+=p),E&&!u.includes(E)&&(u+=" "+E),e&&!p&&!w.trim()&&this.multiple&&b!=null&&(u+=this.styles.danger(b)),this.clear(r),this.write([A,u,h,w,D].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};tge.exports=z8});var sge=_((a8t,ige)=>{"use strict";var nge=eu(),Tft=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",Z8=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Tft(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},Lft=async(t={},e={},r=o=>o)=>{let o=new Set,a=t.fields||[],n=t.template,u=[],A=[],p=[],h=1;typeof n=="function"&&(n=await n());let E=-1,w=()=>n[++E],D=()=>n[E+1],b=C=>{C.line=h,u.push(C)};for(b({type:"bos",value:""});Ele.name===U.key);U.field=a.find(le=>le.name===U.key),te||(te=new Z8(U),A.push(te)),te.lines.push(U.line-1);continue}let T=u[u.length-1];T.type==="text"&&T.line===h?T.value+=C:b({type:"text",value:C})}return b({type:"eos",value:""}),{input:n,tabstops:u,unique:o,keys:p,items:A}};ige.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),o={...e.values,...e.initial},{tabstops:a,items:n,keys:u}=await Lft(e,o),A=X8("result",t,e),p=X8("format",t,e),h=X8("validate",t,e,!0),E=t.isValue.bind(t);return async(w={},D=!1)=>{let b=0;w.required=r,w.items=n,w.keys=u,w.output="";let C=async(J,te,le,ce)=>{let ue=await h(J,te,le,ce);return ue===!1?"Invalid field "+le.name:ue};for(let J of a){let te=J.value,le=J.key;if(J.type!=="template"){te&&(w.output+=te);continue}if(J.type==="template"){let ce=n.find(Ee=>Ee.name===le);e.required===!0&&w.required.add(ce.name);let ue=[ce.input,w.values[ce.value],ce.value,te].find(E),he=(ce.field||{}).message||J.inner;if(D){let Ee=await C(w.values[le],w,ce,b);if(Ee&&typeof Ee=="string"||Ee===!1){w.invalid.set(le,Ee);continue}w.invalid.delete(le);let g=await A(w.values[le],w,ce,b);w.output+=nge.unstyle(g);continue}ce.placeholder=!1;let De=te;te=await p(te,w,ce,b),ue!==te?(w.values[le]=ue,te=t.styles.typing(ue),w.missing.delete(he)):(w.values[le]=void 0,ue=`<${he}>`,te=t.styles.primary(ue),ce.placeholder=!0,w.required.has(le)&&w.missing.add(he)),w.missing.has(he)&&w.validating&&(te=t.styles.warning(ue)),w.invalid.has(le)&&w.validating&&(te=t.styles.danger(ue)),b===w.index&&(De!==te?te=t.styles.underline(te):te=t.styles.heading(nge.unstyle(te))),b++}te&&(w.output+=te)}let T=w.output.split(` -`).map(J=>" "+J),N=n.length,U=0;for(let J of n)w.invalid.has(J.name)&&J.lines.forEach(te=>{T[te][0]===" "&&(T[te]=w.styles.danger(w.symbols.bullet)+T[te].slice(1))}),t.isValue(w.values[J.name])&&U++;return w.completed=(U/N*100).toFixed(0),w.output=T.join(` -`),w.output}};function X8(t,e,r,o){return(a,n,u,A)=>typeof u.field[t]=="function"?u.field[t].call(e,a,n,u,A):[o,a].find(p=>e.isValue(p))}});var age=_((l8t,oge)=>{"use strict";var Nft=eu(),Oft=sge(),Mft=uE(),$8=class extends Mft{constructor(e){super(e),this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await Oft(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let o=this.getItem(),a=o.input.slice(0,this.cursor),n=o.input.slice(this.cursor);this.input=o.input=`${a}${e}${n}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),o=e.input.slice(0,this.cursor-1);this.input=e.input=`${o}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:o,size:a}=this.state,n=[this.options.newline,` -`].find(J=>J!=null),u=await this.prefix(),A=await this.separator(),p=await this.message(),h=[u,p,A].filter(Boolean).join(" ");this.state.prompt=h;let E=await this.header(),w=await this.error()||"",D=await this.hint()||"",b=o?"":await this.interpolate(this.state),C=this.state.key=r[e]||"",T=await this.format(C),N=await this.footer();T&&(h+=" "+T),D&&!T&&this.state.completed===0&&(h+=" "+D),this.clear(a);let U=[E,h,b,N,w.trim()];this.write(U.filter(Boolean).join(n)),this.restore()}getItem(e){let{items:r,keys:o,index:a}=this.state,n=r.find(u=>u.name===o[a]);return n&&n.input!=null&&(this.input=n.input,this.cursor=n.cursor),n}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:o,values:a}=this.state;if(e.size){let A="";for(let[p,h]of e)A+=`Invalid ${p}: ${h} -`;return this.state.error=A,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let u=Nft.unstyle(o).split(` -`).map(A=>A.slice(1)).join(` -`);return this.value={values:a,result:u},super.submit()}};oge.exports=$8});var cge=_((c8t,lge)=>{"use strict";var Uft="(Use + to sort)",_ft=Qh(),eH=class extends _ft{constructor(e){super({...e,reorder:!1,sort:!0,multiple:!0}),this.state.hint=[this.options.hint,Uft].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let o=await super.renderChoice(e,r),a=this.symbols.identicalTo+" ",n=this.index===r&&this.sorting?this.styles.muted(a):" ";return this.options.drag===!1&&(n=""),this.options.numbered===!0?n+`${r+1} - `+o:n+o}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};lge.exports=eH});var Age=_((u8t,uge)=>{"use strict";var Hft=b2(),tH=class extends Hft{constructor(e={}){if(super(e),this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(o=>this.styles.muted(o)),this.state.header=r.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let o of r)o.scale=qft(5,this.options),o.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],o=r.selected;return e.scale.forEach(a=>a.selected=!1),r.selected=!o,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let o=this.index===r,a=this.term==="Hyper",n=a?9:8,u=a?"":" ",A=this.symbols.line.repeat(n),p=" ".repeat(n+(a?0:1)),h=te=>(te?this.styles.success("\u25C9"):"\u25EF")+u,E=r+1+".",w=o?this.styles.heading:this.styles.noop,D=await this.resolve(e.message,this.state,e,r),b=this.indent(e),C=b+e.scale.map((te,le)=>h(le===e.scaleIdx)).join(A),T=te=>te===e.scaleIdx?w(te):te,N=b+e.scale.map((te,le)=>T(le)).join(p),U=()=>[E,D].filter(Boolean).join(" "),J=()=>[U(),C,N," "].filter(Boolean).join(` -`);return o&&(C=this.styles.cyan(C),N=this.styles.cyan(N)),J()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(o,a)=>await this.renderChoice(o,a)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` -`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,o=await this.prefix(),a=await this.separator(),n=await this.message(),u=[o,n,a].filter(Boolean).join(" ");this.state.prompt=u;let A=await this.header(),p=await this.format(),h=await this.error()||await this.hint(),E=await this.renderChoices(),w=await this.footer();(p||!h)&&(u+=" "+p),h&&!u.includes(h)&&(u+=" "+h),e&&!p&&!E&&this.multiple&&this.type!=="form"&&(u+=this.styles.danger(this.emptyError)),this.clear(r),this.write([u,A,E,w].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function qft(t,e={}){if(Array.isArray(e.scale))return e.scale.map(o=>({...o}));let r=[];for(let o=1;o{fge.exports=j8()});var gge=_((f8t,hge)=>{"use strict";var jft=Hk(),rH=class extends jft{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=o=>this.styles.primary.underline(o);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),o=await this.prefix(),a=await this.separator(),n=await this.message(),u=await this.format(),A=await this.error()||await this.hint(),p=await this.footer(),h=[o,n,a,u].join(" ");this.state.prompt=h,A&&!h.includes(A)&&(h+=" "+A),this.clear(e),this.write([r,h,p].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};hge.exports=rH});var mge=_((p8t,dge)=>{"use strict";var Gft=Qh(),nH=class extends Gft{constructor(e){if(super(e),typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let o=await super.toChoices(e,r);if(o.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>o.length)throw new Error("Please specify the index of the correct answer from the list of choices");return o}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};dge.exports=nH});var Ege=_(iH=>{"use strict";var yge=xo(),fs=(t,e)=>{yge.defineExport(iH,t,e),yge.defineExport(iH,t.toLowerCase(),e)};fs("AutoComplete",()=>D0e());fs("BasicAuth",()=>F0e());fs("Confirm",()=>L0e());fs("Editable",()=>O0e());fs("Form",()=>_k());fs("Input",()=>j8());fs("Invisible",()=>G0e());fs("List",()=>Y0e());fs("MultiSelect",()=>K0e());fs("Numeral",()=>X0e());fs("Password",()=>$0e());fs("Scale",()=>rge());fs("Select",()=>Qh());fs("Snippet",()=>age());fs("Sort",()=>cge());fs("Survey",()=>Age());fs("Text",()=>pge());fs("Toggle",()=>gge());fs("Quiz",()=>mge())});var Ige=_((g8t,Cge)=>{Cge.exports={ArrayPrompt:b2(),AuthPrompt:O8(),BooleanPrompt:Hk(),NumberPrompt:K8(),StringPrompt:Kg()}});var Q2=_((d8t,Bge)=>{"use strict";var wge=ve("assert"),oH=ve("events"),Fh=xo(),ru=class extends oH{constructor(e,r){super(),this.options=Fh.merge({},e),this.answers={...r}}register(e,r){if(Fh.isObject(e)){for(let a of Object.keys(e))this.register(a,e[a]);return this}wge.equal(typeof r,"function","expected a function");let o=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[o]=r:this.prompts[o]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(Fh.merge({},this.options,r))}catch(o){return Promise.reject(o)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=Fh.merge({},this.options,e),{type:o,name:a}=e,{set:n,get:u}=Fh;if(typeof o=="function"&&(o=await o.call(this,e,this.answers)),!o)return this.answers[a];wge(this.prompts[o],`Prompt "${o}" is not registered`);let A=new this.prompts[o](r),p=u(this.answers,a);A.state.answers=this.answers,A.enquirer=this,a&&A.on("submit",E=>{this.emit("answer",a,E,A),n(this.answers,a,E)});let h=A.emit.bind(A);return A.emit=(...E)=>(this.emit.call(this,...E),h(...E)),this.emit("prompt",A,this),r.autofill&&p!=null?(A.value=A.input=p,r.autofill==="show"&&await A.submit()):p=A.value=await A.run(),p}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||uE()}static get prompts(){return Ege()}static get types(){return Ige()}static get prompt(){let e=(r,...o)=>{let a=new this(...o),n=a.emit.bind(a);return a.emit=(...u)=>(e.emit(...u),n(...u)),a.prompt(r)};return Fh.mixinEmitter(e,new oH),e}};Fh.mixinEmitter(ru,new oH);var sH=ru.prompts;for(let t of Object.keys(sH)){let e=t.toLowerCase(),r=o=>new sH[t](o).run();ru.prompt[e]=r,ru[e]=r,ru[t]||Reflect.defineProperty(ru,t,{get:()=>sH[t]})}var k2=t=>{Fh.defineExport(ru,t,()=>ru.types[t])};k2("ArrayPrompt");k2("AuthPrompt");k2("BooleanPrompt");k2("NumberPrompt");k2("StringPrompt");Bge.exports=ru});var L2=_((Z8t,kge)=>{var zft=bk();function Xft(t,e,r){var o=t==null?void 0:zft(t,e);return o===void 0?r:o}kge.exports=Xft});var Rge=_((iHt,Fge)=>{function Zft(t,e){for(var r=-1,o=t==null?0:t.length;++r{var $ft=Eg(),ept=PP();function tpt(t,e){return t&&$ft(e,ept(e),t)}Tge.exports=tpt});var Oge=_((oHt,Nge)=>{var rpt=Eg(),npt=Km();function ipt(t,e){return t&&rpt(e,npt(e),t)}Nge.exports=ipt});var Uge=_((aHt,Mge)=>{var spt=Eg(),opt=IP();function apt(t,e){return spt(t,opt(t),e)}Mge.exports=apt});var fH=_((lHt,_ge)=>{var lpt=CP(),cpt=FP(),upt=IP(),Apt=bN(),fpt=Object.getOwnPropertySymbols,ppt=fpt?function(t){for(var e=[];t;)lpt(e,upt(t)),t=cpt(t);return e}:Apt;_ge.exports=ppt});var qge=_((cHt,Hge)=>{var hpt=Eg(),gpt=fH();function dpt(t,e){return hpt(t,gpt(t),e)}Hge.exports=dpt});var pH=_((uHt,jge)=>{var mpt=xN(),ypt=fH(),Ept=Km();function Cpt(t){return mpt(t,Ept,ypt)}jge.exports=Cpt});var Wge=_((AHt,Gge)=>{var Ipt=Object.prototype,wpt=Ipt.hasOwnProperty;function Bpt(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&wpt.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Gge.exports=Bpt});var Vge=_((fHt,Yge)=>{var vpt=kP();function Dpt(t,e){var r=e?vpt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Yge.exports=Dpt});var Jge=_((pHt,Kge)=>{var Spt=/\w*$/;function Ppt(t){var e=new t.constructor(t.source,Spt.exec(t));return e.lastIndex=t.lastIndex,e}Kge.exports=Ppt});var ede=_((hHt,$ge)=>{var zge=dg(),Xge=zge?zge.prototype:void 0,Zge=Xge?Xge.valueOf:void 0;function xpt(t){return Zge?Object(Zge.call(t)):{}}$ge.exports=xpt});var rde=_((gHt,tde)=>{var bpt=kP(),kpt=Vge(),Qpt=Jge(),Fpt=ede(),Rpt=jN(),Tpt="[object Boolean]",Lpt="[object Date]",Npt="[object Map]",Opt="[object Number]",Mpt="[object RegExp]",Upt="[object Set]",_pt="[object String]",Hpt="[object Symbol]",qpt="[object ArrayBuffer]",jpt="[object DataView]",Gpt="[object Float32Array]",Wpt="[object Float64Array]",Ypt="[object Int8Array]",Vpt="[object Int16Array]",Kpt="[object Int32Array]",Jpt="[object Uint8Array]",zpt="[object Uint8ClampedArray]",Xpt="[object Uint16Array]",Zpt="[object Uint32Array]";function $pt(t,e,r){var o=t.constructor;switch(e){case qpt:return bpt(t);case Tpt:case Lpt:return new o(+t);case jpt:return kpt(t,r);case Gpt:case Wpt:case Ypt:case Vpt:case Kpt:case Jpt:case zpt:case Xpt:case Zpt:return Rpt(t,r);case Npt:return new o;case Opt:case _pt:return new o(t);case Mpt:return Qpt(t);case Upt:return new o;case Hpt:return Fpt(t)}}tde.exports=$pt});var ide=_((dHt,nde)=>{var eht=a1(),tht=Zu(),rht="[object Map]";function nht(t){return tht(t)&&eht(t)==rht}nde.exports=nht});var lde=_((mHt,ade)=>{var iht=ide(),sht=BP(),sde=vP(),ode=sde&&sde.isMap,oht=ode?sht(ode):iht;ade.exports=oht});var ude=_((yHt,cde)=>{var aht=a1(),lht=Zu(),cht="[object Set]";function uht(t){return lht(t)&&aht(t)==cht}cde.exports=uht});var hde=_((EHt,pde)=>{var Aht=ude(),fht=BP(),Ade=vP(),fde=Ade&&Ade.isSet,pht=fde?fht(fde):Aht;pde.exports=pht});var hH=_((CHt,yde)=>{var hht=yP(),ght=Rge(),dht=RP(),mht=Lge(),yht=Oge(),Eht=qN(),Cht=QP(),Iht=Uge(),wht=qge(),Bht=RN(),vht=pH(),Dht=a1(),Sht=Wge(),Pht=rde(),xht=GN(),bht=jl(),kht=r1(),Qht=lde(),Fht=cl(),Rht=hde(),Tht=PP(),Lht=Km(),Nht=1,Oht=2,Mht=4,gde="[object Arguments]",Uht="[object Array]",_ht="[object Boolean]",Hht="[object Date]",qht="[object Error]",dde="[object Function]",jht="[object GeneratorFunction]",Ght="[object Map]",Wht="[object Number]",mde="[object Object]",Yht="[object RegExp]",Vht="[object Set]",Kht="[object String]",Jht="[object Symbol]",zht="[object WeakMap]",Xht="[object ArrayBuffer]",Zht="[object DataView]",$ht="[object Float32Array]",e0t="[object Float64Array]",t0t="[object Int8Array]",r0t="[object Int16Array]",n0t="[object Int32Array]",i0t="[object Uint8Array]",s0t="[object Uint8ClampedArray]",o0t="[object Uint16Array]",a0t="[object Uint32Array]",Ai={};Ai[gde]=Ai[Uht]=Ai[Xht]=Ai[Zht]=Ai[_ht]=Ai[Hht]=Ai[$ht]=Ai[e0t]=Ai[t0t]=Ai[r0t]=Ai[n0t]=Ai[Ght]=Ai[Wht]=Ai[mde]=Ai[Yht]=Ai[Vht]=Ai[Kht]=Ai[Jht]=Ai[i0t]=Ai[s0t]=Ai[o0t]=Ai[a0t]=!0;Ai[qht]=Ai[dde]=Ai[zht]=!1;function Gk(t,e,r,o,a,n){var u,A=e&Nht,p=e&Oht,h=e&Mht;if(r&&(u=a?r(t,o,a,n):r(t)),u!==void 0)return u;if(!Fht(t))return t;var E=bht(t);if(E){if(u=Sht(t),!A)return Cht(t,u)}else{var w=Dht(t),D=w==dde||w==jht;if(kht(t))return Eht(t,A);if(w==mde||w==gde||D&&!a){if(u=p||D?{}:xht(t),!A)return p?wht(t,yht(u,t)):Iht(t,mht(u,t))}else{if(!Ai[w])return a?t:{};u=Pht(t,w,A)}}n||(n=new hht);var b=n.get(t);if(b)return b;n.set(t,u),Rht(t)?t.forEach(function(N){u.add(Gk(N,e,r,N,t,n))}):Qht(t)&&t.forEach(function(N,U){u.set(U,Gk(N,e,r,U,t,n))});var C=h?p?vht:Bht:p?Lht:Tht,T=E?void 0:C(t);return ght(T||t,function(N,U){T&&(U=N,N=t[U]),dht(u,U,Gk(N,e,r,U,t,n))}),u}yde.exports=Gk});var gH=_((IHt,Ede)=>{var l0t=hH(),c0t=1,u0t=4;function A0t(t){return l0t(t,c0t|u0t)}Ede.exports=A0t});var dH=_((wHt,Cde)=>{var f0t=o8();function p0t(t,e,r){return t==null?t:f0t(t,e,r)}Cde.exports=p0t});var Dde=_((xHt,vde)=>{var h0t=Object.prototype,g0t=h0t.hasOwnProperty;function d0t(t,e){return t!=null&&g0t.call(t,e)}vde.exports=d0t});var Pde=_((bHt,Sde)=>{var m0t=Dde(),y0t=a8();function E0t(t,e){return t!=null&&y0t(t,e,m0t)}Sde.exports=E0t});var bde=_((kHt,xde)=>{function C0t(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}xde.exports=C0t});var Qde=_((QHt,kde)=>{var I0t=bk(),w0t=XU();function B0t(t,e){return e.length<2?t:I0t(t,w0t(e,0,-1))}kde.exports=B0t});var yH=_((FHt,Fde)=>{var v0t=Wg(),D0t=bde(),S0t=Qde(),P0t=nE();function x0t(t,e){return e=v0t(e,t),t=S0t(t,e),t==null||delete t[P0t(D0t(e))]}Fde.exports=x0t});var EH=_((RHt,Rde)=>{var b0t=yH();function k0t(t,e){return t==null?!0:b0t(t,e)}Rde.exports=k0t});var Mde=_((l6t,R0t)=>{R0t.exports={name:"@yarnpkg/cli",version:"4.7.0",license:"BSD-2-Clause",main:"./sources/index.ts",exports:{".":"./sources/index.ts","./polyfills":"./sources/polyfills.ts","./package.json":"./package.json"},dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-constraints":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-exec":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-interactive-tools":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/plugin-stage":"workspace:^","@yarnpkg/plugin-typescript":"workspace:^","@yarnpkg/plugin-version":"workspace:^","@yarnpkg/plugin-workspace-tools":"workspace:^","@yarnpkg/shell":"workspace:^","ci-info":"^4.0.0",clipanion:"^4.0.0-rc.2",semver:"^7.1.2",tslib:"^2.4.0",typanion:"^3.14.0"},devDependencies:{"@types/semver":"^7.1.0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",bin:null,exports:{".":"./lib/index.js","./package.json":"./package.json"}},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"]}},repository:{type:"git",url:"git+https://github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=18.12.0"}}});var xH=_((UGt,zde)=>{"use strict";zde.exports=function(e,r){r===!0&&(r=0);var o="";if(typeof e=="string")try{o=new URL(e).protocol}catch{}else e&&e.constructor===URL&&(o=e.protocol);var a=o.split(/\:|\+/).filter(Boolean);return typeof r=="number"?a[r]:a}});var Zde=_((_Gt,Xde)=>{"use strict";var $0t=xH();function egt(t){var e={protocols:[],protocol:null,port:null,resource:"",host:"",user:"",password:"",pathname:"",hash:"",search:"",href:t,query:{},parse_failed:!1};try{var r=new URL(t);e.protocols=$0t(r),e.protocol=e.protocols[0],e.port=r.port,e.resource=r.hostname,e.host=r.host,e.user=r.username||"",e.password=r.password||"",e.pathname=r.pathname,e.hash=r.hash.slice(1),e.search=r.search.slice(1),e.href=r.href,e.query=Object.fromEntries(r.searchParams)}catch{e.protocols=["file"],e.protocol=e.protocols[0],e.port="",e.resource="",e.user="",e.pathname="",e.hash="",e.search="",e.href=t,e.query={},e.parse_failed=!0}return e}Xde.exports=egt});var tme=_((HGt,eme)=>{"use strict";var tgt=Zde();function rgt(t){return t&&typeof t=="object"&&"default"in t?t:{default:t}}var ngt=rgt(tgt),igt="text/plain",sgt="us-ascii",$de=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),ogt=(t,{stripHash:e})=>{let r=/^data:(?[^,]*?),(?[^#]*?)(?:#(?.*))?$/.exec(t);if(!r)throw new Error(`Invalid URL: ${t}`);let{type:o,data:a,hash:n}=r.groups,u=o.split(";");n=e?"":n;let A=!1;u[u.length-1]==="base64"&&(u.pop(),A=!0);let p=(u.shift()||"").toLowerCase(),E=[...u.map(w=>{let[D,b=""]=w.split("=").map(C=>C.trim());return D==="charset"&&(b=b.toLowerCase(),b===sgt)?"":`${D}${b?`=${b}`:""}`}).filter(Boolean)];return A&&E.push("base64"),(E.length>0||p&&p!==igt)&&E.unshift(p),`data:${E.join(";")},${A?a.trim():a}${n?`#${n}`:""}`};function agt(t,e){if(e={defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripTextFragment:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeSingleSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0,...e},t=t.trim(),/^data:/i.test(t))return ogt(t,e);if(/^view-source:/i.test(t))throw new Error("`view-source:` is not supported as it is a non-standard protocol");let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let a=new URL(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&a.protocol==="https:"&&(a.protocol="http:"),e.forceHttps&&a.protocol==="http:"&&(a.protocol="https:"),e.stripAuthentication&&(a.username="",a.password=""),e.stripHash?a.hash="":e.stripTextFragment&&(a.hash=a.hash.replace(/#?:~:text.*?$/i,"")),a.pathname){let u=/\b[a-z][a-z\d+\-.]{1,50}:\/\//g,A=0,p="";for(;;){let E=u.exec(a.pathname);if(!E)break;let w=E[0],D=E.index,b=a.pathname.slice(A,D);p+=b.replace(/\/{2,}/g,"/"),p+=w,A=D+w.length}let h=a.pathname.slice(A,a.pathname.length);p+=h.replace(/\/{2,}/g,"/"),a.pathname=p}if(a.pathname)try{a.pathname=decodeURI(a.pathname)}catch{}if(e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let u=a.pathname.split("/"),A=u[u.length-1];$de(A,e.removeDirectoryIndex)&&(u=u.slice(0,-1),a.pathname=u.slice(1).join("/")+"/")}if(a.hostname&&(a.hostname=a.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.(?!www\.)[a-z\-\d]{1,63}\.[a-z.\-\d]{2,63}$/.test(a.hostname)&&(a.hostname=a.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let u of[...a.searchParams.keys()])$de(u,e.removeQueryParameters)&&a.searchParams.delete(u);if(e.removeQueryParameters===!0&&(a.search=""),e.sortQueryParameters){a.searchParams.sort();try{a.search=decodeURIComponent(a.search)}catch{}}e.removeTrailingSlash&&(a.pathname=a.pathname.replace(/\/$/,""));let n=t;return t=a.toString(),!e.removeSingleSlash&&a.pathname==="/"&&!n.endsWith("/")&&a.hash===""&&(t=t.replace(/\/$/,"")),(e.removeTrailingSlash||a.pathname==="/")&&a.hash===""&&e.removeSingleSlash&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t}var bH=(t,e=!1)=>{let r=/^(?:([a-z_][a-z0-9_-]{0,31})@|https?:\/\/)([\w\.\-@]+)[\/:]([\~,\.\w,\-,\_,\/]+?(?:\.git|\/)?)$/,o=n=>{let u=new Error(n);throw u.subject_url=t,u};(typeof t!="string"||!t.trim())&&o("Invalid url."),t.length>bH.MAX_INPUT_LENGTH&&o("Input exceeds maximum length. If needed, change the value of parseUrl.MAX_INPUT_LENGTH."),e&&(typeof e!="object"&&(e={stripHash:!1}),t=agt(t,e));let a=ngt.default(t);if(a.parse_failed){let n=a.href.match(r);n?(a.protocols=["ssh"],a.protocol="ssh",a.resource=n[2],a.host=n[2],a.user=n[1],a.pathname=`/${n[3]}`,a.parse_failed=!1):o("URL parsing failed.")}return a};bH.MAX_INPUT_LENGTH=2048;eme.exports=bH});var ime=_((qGt,nme)=>{"use strict";var lgt=xH();function rme(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=lgt(t);if(t=t.substring(t.indexOf("://")+3),rme(e))return!0;var r=new RegExp(".([a-zA-Z\\d]+):(\\d+)/");return!t.match(r)&&t.indexOf("@"){"use strict";var cgt=tme(),sme=ime();function ugt(t){var e=cgt(t);return e.token="",e.password==="x-oauth-basic"?e.token=e.user:e.user==="x-token-auth"&&(e.token=e.password),sme(e.protocols)||e.protocols.length===0&&sme(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:(e.protocol="file",e.protocols=["file"]),e.href=e.href.replace(/\/$/,""),e}ome.exports=ugt});var cme=_((GGt,lme)=>{"use strict";var Agt=ame();function kH(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=/^([a-z\d-]{1,39})\/([-\.\w]{1,100})$/i;e.test(t)&&(t="https://github.com/"+t);var r=Agt(t),o=r.resource.split("."),a=null;switch(r.toString=function(N){return kH.stringify(this,N)},r.source=o.length>2?o.slice(1-o.length).join("."):r.source=r.resource,r.git_suffix=/\.git$/.test(r.pathname),r.name=decodeURIComponent((r.pathname||r.href).replace(/(^\/)|(\/$)/g,"").replace(/\.git$/,"")),r.owner=decodeURIComponent(r.user),r.source){case"git.cloudforge.com":r.owner=r.user,r.organization=o[0],r.source="cloudforge.com";break;case"visualstudio.com":if(r.resource==="vs-ssh.visualstudio.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3],r.full_name=a[2]+"/"+a[3]);break}else{a=r.name.split("/"),a.length===2?(r.owner=a[1],r.name=a[1],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name);break}case"dev.azure.com":case"azure.com":if(r.resource==="ssh.dev.azure.com"){a=r.name.split("/"),a.length===4&&(r.organization=a[1],r.owner=a[2],r.name=a[3]);break}else{a=r.name.split("/"),a.length===5?(r.organization=a[0],r.owner=a[1],r.name=a[4],r.full_name="_git/"+r.name):a.length===3?(r.name=a[2],a[0]==="DefaultCollection"?(r.owner=a[2],r.organization=a[0],r.full_name=r.organization+"/_git/"+r.name):(r.owner=a[0],r.full_name=r.owner+"/_git/"+r.name)):a.length===4&&(r.organization=a[0],r.owner=a[1],r.name=a[3],r.full_name=r.organization+"/"+r.owner+"/_git/"+r.name),r.query&&r.query.path&&(r.filepath=r.query.path.replace(/^\/+/g,"")),r.query&&r.query.version&&(r.ref=r.query.version.replace(/^GB/,""));break}default:a=r.name.split("/");var n=a.length-1;if(a.length>=2){var u=a.indexOf("-",2),A=a.indexOf("blob",2),p=a.indexOf("tree",2),h=a.indexOf("commit",2),E=a.indexOf("src",2),w=a.indexOf("raw",2),D=a.indexOf("edit",2);n=u>0?u-1:A>0?A-1:p>0?p-1:h>0?h-1:E>0?E-1:w>0?w-1:D>0?D-1:n,r.owner=a.slice(0,n).join("/"),r.name=a[n],h&&(r.commit=a[n+2])}r.ref="",r.filepathtype="",r.filepath="";var b=a.length>n&&a[n+1]==="-"?n+1:n;a.length>b+2&&["raw","src","blob","tree","edit"].indexOf(a[b+1])>=0&&(r.filepathtype=a[b+1],r.ref=a[b+2],a.length>b+3&&(r.filepath=a.slice(b+3).join("/"))),r.organization=r.owner;break}r.full_name||(r.full_name=r.owner,r.name&&(r.full_name&&(r.full_name+="/"),r.full_name+=r.name)),r.owner.startsWith("scm/")&&(r.source="bitbucket-server",r.owner=r.owner.replace("scm/",""),r.organization=r.owner,r.full_name=r.owner+"/"+r.name);var C=/(projects|users)\/(.*?)\/repos\/(.*?)((\/.*$)|$)/,T=C.exec(r.pathname);return T!=null&&(r.source="bitbucket-server",T[1]==="users"?r.owner="~"+T[2]:r.owner=T[2],r.organization=r.owner,r.name=T[3],a=T[4].split("/"),a.length>1&&(["raw","browse"].indexOf(a[1])>=0?(r.filepathtype=a[1],a.length>2&&(r.filepath=a.slice(2).join("/"))):a[1]==="commits"&&a.length>2&&(r.commit=a[2])),r.full_name=r.owner+"/"+r.name,r.query.at?r.ref=r.query.at:r.ref=""),r}kH.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",o=t.user||"git",a=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+o+"@"+t.resource+r+"/"+t.full_name+a:o+"@"+t.resource+":"+t.full_name+a;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+o+"@"+t.resource+r+"/"+t.full_name+a;case"http":case"https":var n=t.token?fgt(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+n+t.resource+r+"/"+pgt(t)+a;default:return t.href}};function fgt(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}function pgt(t){switch(t.source){case"bitbucket-server":return"scm/"+t.full_name;default:return""+t.full_name}}lme.exports=kH});var Dme=_((B9t,vme)=>{var vgt=Cb(),Dgt=QP(),Sgt=jl(),Pgt=fy(),xgt=s8(),bgt=nE(),kgt=t2();function Qgt(t){return Sgt(t)?vgt(t,bgt):Pgt(t)?[t]:Dgt(xgt(kgt(t)))}vme.exports=Qgt});function Lgt(t,e){return e===1&&Tgt.has(t[0])}function q2(t){let e=Array.isArray(t)?t:(0,xme.default)(t);return e.map((o,a)=>Fgt.test(o)?`[${o}]`:Rgt.test(o)&&!Lgt(e,a)?`.${o}`:`[${JSON.stringify(o)}]`).join("").replace(/^\./,"")}function Ngt(t,e){let r=[];if(e.methodName!==null&&r.push(pe.pretty(t,e.methodName,pe.Type.CODE)),e.file!==null){let o=[];o.push(pe.pretty(t,e.file,pe.Type.PATH)),e.line!==null&&(o.push(pe.pretty(t,e.line,pe.Type.NUMBER)),e.column!==null&&o.push(pe.pretty(t,e.column,pe.Type.NUMBER))),r.push(`(${o.join(pe.pretty(t,":","grey"))})`)}return r.join(" ")}function Kk(t,{manifestUpdates:e,reportedErrors:r},{fix:o}={}){let a=new Map,n=new Map,u=[...r.keys()].map(A=>[A,new Map]);for(let[A,p]of[...u,...e]){let h=r.get(A)?.map(b=>({text:b,fixable:!1}))??[],E=!1,w=t.getWorkspaceByCwd(A),D=w.manifest.exportTo({});for(let[b,C]of p){if(C.size>1){let T=[...C].map(([N,U])=>{let J=pe.pretty(t.configuration,N,pe.Type.INSPECT),te=U.size>0?Ngt(t.configuration,U.values().next().value):null;return te!==null?` -${J} at ${te}`:` -${J}`}).join("");h.push({text:`Conflict detected in constraint targeting ${pe.pretty(t.configuration,b,pe.Type.CODE)}; conflicting values are:${T}`,fixable:!1})}else{let[[T]]=C,N=(0,Sme.default)(D,b);if(JSON.stringify(N)===JSON.stringify(T))continue;if(!o){let U=typeof N>"u"?`Missing field ${pe.pretty(t.configuration,b,pe.Type.CODE)}; expected ${pe.pretty(t.configuration,T,pe.Type.INSPECT)}`:typeof T>"u"?`Extraneous field ${pe.pretty(t.configuration,b,pe.Type.CODE)} currently set to ${pe.pretty(t.configuration,N,pe.Type.INSPECT)}`:`Invalid field ${pe.pretty(t.configuration,b,pe.Type.CODE)}; expected ${pe.pretty(t.configuration,T,pe.Type.INSPECT)}, found ${pe.pretty(t.configuration,N,pe.Type.INSPECT)}`;h.push({text:U,fixable:!0});continue}typeof T>"u"?(0,bme.default)(D,b):(0,Pme.default)(D,b,T),E=!0}E&&a.set(w,D)}h.length>0&&n.set(w,h)}return{changedWorkspaces:a,remainingErrors:n}}function kme(t,{configuration:e}){let r={children:[]};for(let[o,a]of t){let n=[];for(let A of a){let p=A.text.split(/\n/);A.fixable&&(p[0]=`${pe.pretty(e,"\u2699","gray")} ${p[0]}`),n.push({value:pe.tuple(pe.Type.NO_HINT,p[0]),children:p.slice(1).map(h=>({value:pe.tuple(pe.Type.NO_HINT,h)}))})}let u={value:pe.tuple(pe.Type.LOCATOR,o.anchoredLocator),children:qe.sortMap(n,A=>A.value[1])};r.children.push(u)}return r.children=qe.sortMap(r.children,o=>o.value[1]),r}var Sme,Pme,xme,bme,ZE,Fgt,Rgt,Tgt,j2=It(()=>{Ve();Sme=et(L2()),Pme=et(dH()),xme=et(Dme()),bme=et(EH()),ZE=class{constructor(e){this.indexedFields=e;this.items=[];this.indexes={};this.clear()}clear(){this.items=[];for(let e of this.indexedFields)this.indexes[e]=new Map}insert(e){this.items.push(e);for(let r of this.indexedFields){let o=Object.hasOwn(e,r)?e[r]:void 0;if(typeof o>"u")continue;qe.getArrayWithDefault(this.indexes[r],o).push(e)}return e}find(e){if(typeof e>"u")return this.items;let r=Object.entries(e);if(r.length===0)return this.items;let o=[],a;for(let[u,A]of r){let p=u,h=Object.hasOwn(this.indexes,p)?this.indexes[p]:void 0;if(typeof h>"u"){o.push([p,A]);continue}let E=new Set(h.get(A)??[]);if(E.size===0)return[];if(typeof a>"u")a=E;else for(let w of a)E.has(w)||a.delete(w);if(a.size===0)break}let n=[...a??[]];return o.length>0&&(n=n.filter(u=>{for(let[A,p]of o)if(!(typeof p<"u"?Object.hasOwn(u,A)&&u[A]===p:Object.hasOwn(u,A)===!1))return!1;return!0})),n}},Fgt=/^[0-9]+$/,Rgt=/^[a-zA-Z0-9_]+$/,Tgt=new Set(["scripts",..._t.allDependencies])});var Qme=_((L9t,GH)=>{var Ogt;(function(t){var e=function(){return{"append/2":[new t.type.Rule(new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("L")]),new t.type.Term("foldl",[new t.type.Term("append",[]),new t.type.Var("X"),new t.type.Term("[]",[]),new t.type.Var("L")]))],"append/3":[new t.type.Rule(new t.type.Term("append",[new t.type.Term("[]",[]),new t.type.Var("X"),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("append",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("append",[new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("S")]))],"member/2":[new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("_")])]),null),new t.type.Rule(new t.type.Term("member",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")])]),new t.type.Term("member",[new t.type.Var("X"),new t.type.Var("Xs")]))],"permutation/2":[new t.type.Rule(new t.type.Term("permutation",[new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("permutation",[new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("permutation",[new t.type.Var("T"),new t.type.Var("P")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("P")]),new t.type.Term("append",[new t.type.Var("X"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("Y")]),new t.type.Var("S")])])]))],"maplist/2":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("X")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("Xs")])]))],"maplist/3":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs")])]))],"maplist/4":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs")])]))],"maplist/5":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds")])]))],"maplist/6":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es")])]))],"maplist/7":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs")])]))],"maplist/8":[new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("A"),new t.type.Var("As")]),new t.type.Term(".",[new t.type.Var("B"),new t.type.Var("Bs")]),new t.type.Term(".",[new t.type.Var("C"),new t.type.Var("Cs")]),new t.type.Term(".",[new t.type.Var("D"),new t.type.Var("Ds")]),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Es")]),new t.type.Term(".",[new t.type.Var("F"),new t.type.Var("Fs")]),new t.type.Term(".",[new t.type.Var("G"),new t.type.Var("Gs")])]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P"),new t.type.Var("A"),new t.type.Var("B"),new t.type.Var("C"),new t.type.Var("D"),new t.type.Var("E"),new t.type.Var("F"),new t.type.Var("G")]),new t.type.Term("maplist",[new t.type.Var("P"),new t.type.Var("As"),new t.type.Var("Bs"),new t.type.Var("Cs"),new t.type.Var("Ds"),new t.type.Var("Es"),new t.type.Var("Fs"),new t.type.Var("Gs")])]))],"include/3":[new t.type.Rule(new t.type.Term("include",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("include",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("A")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("A"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("F"),new t.type.Var("B")]),new t.type.Term(",",[new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("F")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("S")])]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("L"),new t.type.Var("S")])]),new t.type.Term("include",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("S")])])])])]))],"exclude/3":[new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Term("[]",[])]),null),new t.type.Rule(new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("exclude",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("E")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term("[]",[])]),new t.type.Var("Q")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("R"),new t.type.Var("Q")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("!",[]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("E")])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("E")])])])])])])]))],"foldl/4":[new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("_"),new t.type.Term("[]",[]),new t.type.Var("I"),new t.type.Var("I")]),null),new t.type.Rule(new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Var("T")]),new t.type.Var("I"),new t.type.Var("R")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P"),new t.type.Var("L")]),new t.type.Term(",",[new t.type.Term("append",[new t.type.Var("L"),new t.type.Term(".",[new t.type.Var("I"),new t.type.Term(".",[new t.type.Var("H"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])])])]),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("=..",[new t.type.Var("P2"),new t.type.Var("L2")]),new t.type.Term(",",[new t.type.Term("call",[new t.type.Var("P2")]),new t.type.Term("foldl",[new t.type.Var("P"),new t.type.Var("T"),new t.type.Var("X"),new t.type.Var("R")])])])])]))],"select/3":[new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("E"),new t.type.Var("Xs")]),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("select",[new t.type.Var("E"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term("select",[new t.type.Var("E"),new t.type.Var("Xs"),new t.type.Var("Ys")]))],"sum_list/2":[new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term("[]",[]),new t.type.Num(0,!1)]),null),new t.type.Rule(new t.type.Term("sum_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("sum_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("+",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"max_list/2":[new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("max_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("max_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"min_list/2":[new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("min_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("min_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term(";",[new t.type.Term(",",[new t.type.Term("=<",[new t.type.Var("X"),new t.type.Var("Y")]),new t.type.Term(",",[new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("X")]),new t.type.Term("!",[])])]),new t.type.Term("=",[new t.type.Var("S"),new t.type.Var("Y")])])]))],"prod_list/2":[new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term("[]",[]),new t.type.Num(1,!1)]),null),new t.type.Rule(new t.type.Term("prod_list",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("S")]),new t.type.Term(",",[new t.type.Term("prod_list",[new t.type.Var("Xs"),new t.type.Var("Y")]),new t.type.Term("is",[new t.type.Var("S"),new t.type.Term("*",[new t.type.Var("X"),new t.type.Var("Y")])])]))],"last/2":[new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("X"),new t.type.Term("[]",[])]),new t.type.Var("X")]),null),new t.type.Rule(new t.type.Term("last",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("Xs")]),new t.type.Var("X")]),new t.type.Term("last",[new t.type.Var("Xs"),new t.type.Var("X")]))],"prefix/2":[new t.type.Rule(new t.type.Term("prefix",[new t.type.Var("Part"),new t.type.Var("Whole")]),new t.type.Term("append",[new t.type.Var("Part"),new t.type.Var("_"),new t.type.Var("Whole")]))],"nth0/3":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth1/3":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("_")]),new t.type.Term("!",[])])])]))],"nth0/4":[new t.type.Rule(new t.type.Term("nth0",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">=",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(0,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth1/4":[new t.type.Rule(new t.type.Term("nth1",[new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term(";",[new t.type.Term("->",[new t.type.Term("var",[new t.type.Var("X")]),new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")])]),new t.type.Term(",",[new t.type.Term(">",[new t.type.Var("X"),new t.type.Num(0,!1)]),new t.type.Term(",",[new t.type.Term("nth",[new t.type.Num(1,!1),new t.type.Var("X"),new t.type.Var("Y"),new t.type.Var("Z"),new t.type.Var("W")]),new t.type.Term("!",[])])])]))],"nth/5":[new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("N"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("X"),new t.type.Var("Xs")]),null),new t.type.Rule(new t.type.Term("nth",[new t.type.Var("N"),new t.type.Var("O"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Xs")]),new t.type.Var("Y"),new t.type.Term(".",[new t.type.Var("X"),new t.type.Var("Ys")])]),new t.type.Term(",",[new t.type.Term("is",[new t.type.Var("M"),new t.type.Term("+",[new t.type.Var("N"),new t.type.Num(1,!1)])]),new t.type.Term("nth",[new t.type.Var("M"),new t.type.Var("O"),new t.type.Var("Xs"),new t.type.Var("Y"),new t.type.Var("Ys")])]))],"length/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(!t.type.is_variable(A)&&!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(t.type.is_integer(A)&&A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else{var p=new t.type.Term("length",[u,new t.type.Num(0,!1),A]);t.type.is_integer(A)&&(p=new t.type.Term(",",[p,new t.type.Term("!",[])])),o.prepend([new t.type.State(a.goal.replace(p),a.substitution,a)])}},"length/3":[new t.type.Rule(new t.type.Term("length",[new t.type.Term("[]",[]),new t.type.Var("N"),new t.type.Var("N")]),null),new t.type.Rule(new t.type.Term("length",[new t.type.Term(".",[new t.type.Var("_"),new t.type.Var("X")]),new t.type.Var("A"),new t.type.Var("N")]),new t.type.Term(",",[new t.type.Term("succ",[new t.type.Var("A"),new t.type.Var("B")]),new t.type.Term("length",[new t.type.Var("X"),new t.type.Var("B"),new t.type.Var("N")])]))],"replicate/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_integer(A))o.throw_error(t.error.type("integer",A,n.indicator));else if(A.value<0)o.throw_error(t.error.domain("not_less_than_zero",A,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=new t.type.Term("[]"),E=0;E0;w--)E[w].equals(E[w-1])&&E.splice(w,1);for(var D=new t.type.Term("[]"),w=E.length-1;w>=0;w--)D=new t.type.Term(".",[E[w],D]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[D,A])),a.substitution,a)])}}},"msort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h=u;h.indicator==="./2";)p.push(h.args[0]),h=h.args[1];if(t.type.is_variable(h))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(h))o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=p.sort(t.compare),w=new t.type.Term("[]"),D=E.length-1;D>=0;D--)w=new t.type.Term(".",[E[D],w]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,A])),a.substitution,a)])}}},"keysort/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else{for(var p=[],h,E=u;E.indicator==="./2";){if(h=E.args[0],t.type.is_variable(h)){o.throw_error(t.error.instantiation(n.indicator));return}else if(!t.type.is_term(h)||h.indicator!=="-/2"){o.throw_error(t.error.type("pair",h,n.indicator));return}h.args[0].pair=h.args[1],p.push(h.args[0]),E=E.args[1]}if(t.type.is_variable(E))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_empty_list(E))o.throw_error(t.error.type("list",u,n.indicator));else{for(var w=p.sort(t.compare),D=new t.type.Term("[]"),b=w.length-1;b>=0;b--)D=new t.type.Term(".",[new t.type.Term("-",[w[b],w[b].pair]),D]),delete w[b].pair;o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[D,A])),a.substitution,a)])}}},"take/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],w=A;h>0&&w.indicator==="./2";)E.push(w.args[0]),w=w.args[1],h--;if(h===0){for(var D=new t.type.Term("[]"),h=E.length-1;h>=0;h--)D=new t.type.Term(".",[E[h],D]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[D,p])),a.substitution,a)])}}},"drop/3":function(o,a,n){var u=n.args[0],A=n.args[1],p=n.args[2];if(t.type.is_variable(A)||t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!t.type.is_integer(u))o.throw_error(t.error.type("integer",u,n.indicator));else if(!t.type.is_variable(p)&&!t.type.is_list(p))o.throw_error(t.error.type("list",p,n.indicator));else{for(var h=u.value,E=[],w=A;h>0&&w.indicator==="./2";)E.push(w.args[0]),w=w.args[1],h--;h===0&&o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,p])),a.substitution,a)])}},"reverse/2":function(o,a,n){var u=n.args[0],A=n.args[1],p=t.type.is_instantiated_list(u),h=t.type.is_instantiated_list(A);if(t.type.is_variable(u)&&t.type.is_variable(A))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_variable(u)&&!t.type.is_fully_list(u))o.throw_error(t.error.type("list",u,n.indicator));else if(!t.type.is_variable(A)&&!t.type.is_fully_list(A))o.throw_error(t.error.type("list",A,n.indicator));else if(!p&&!h)o.throw_error(t.error.instantiation(n.indicator));else{for(var E=p?u:A,w=new t.type.Term("[]",[]);E.indicator==="./2";)w=new t.type.Term(".",[E.args[0],w]),E=E.args[1];o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[w,p?A:u])),a.substitution,a)])}},"list_to_set/2":function(o,a,n){var u=n.args[0],A=n.args[1];if(t.type.is_variable(u))o.throw_error(t.error.instantiation(n.indicator));else{for(var p=u,h=[];p.indicator==="./2";)h.push(p.args[0]),p=p.args[1];if(t.type.is_variable(p))o.throw_error(t.error.instantiation(n.indicator));else if(!t.type.is_term(p)||p.indicator!=="[]/0")o.throw_error(t.error.type("list",u,n.indicator));else{for(var E=[],w=new t.type.Term("[]",[]),D,b=0;b=0;b--)w=new t.type.Term(".",[E[b],w]);o.prepend([new t.type.State(a.goal.replace(new t.type.Term("=",[A,w])),a.substitution,a)])}}}}},r=["append/2","append/3","member/2","permutation/2","maplist/2","maplist/3","maplist/4","maplist/5","maplist/6","maplist/7","maplist/8","include/3","exclude/3","foldl/4","sum_list/2","max_list/2","min_list/2","prod_list/2","last/2","prefix/2","nth0/3","nth1/3","nth0/4","nth1/4","length/2","replicate/3","select/3","sort/2","msort/2","keysort/2","take/3","drop/3","reverse/2","list_to_set/2"];typeof GH<"u"?GH.exports=function(o){t=o,new t.type.Module("lists",e(),r)}:new t.type.Module("lists",e(),r)})(Ogt)});var Yme=_(Kr=>{"use strict";var Xg=process.platform==="win32",WH="aes-256-cbc",Mgt="sha256",Tme="The current environment doesn't support interactive reading from TTY.",Xn=ve("fs"),Fme=process.binding("tty_wrap").TTY,VH=ve("child_process"),Lh=ve("path"),KH={prompt:"> ",hideEchoBack:!1,mask:"*",limit:[],limitMessage:"Input another, please.$<( [)limit(])>",defaultInput:"",trueValue:[],falseValue:[],caseSensitive:!1,keepWhitespace:!1,encoding:"utf8",bufferSize:1024,print:void 0,history:!0,cd:!1,phContent:void 0,preCheck:void 0},Vf="none",iu,eC,Rme=!1,Th,zk,YH,Ugt=0,$H="",zg=[],Xk,Lme=!1,JH=!1,G2=!1;function Nme(t){function e(r){return r.replace(/[^\w\u0080-\uFFFF]/g,function(o){return"#"+o.charCodeAt(0)+";"})}return zk.concat(function(r){var o=[];return Object.keys(r).forEach(function(a){r[a]==="boolean"?t[a]&&o.push("--"+a):r[a]==="string"&&t[a]&&o.push("--"+a,e(t[a]))}),o}({display:"string",displayOnly:"boolean",keyIn:"boolean",hideEchoBack:"boolean",mask:"string",limit:"string",caseSensitive:"boolean"}))}function _gt(t,e){function r(U){var J,te="",le;for(YH=YH||ve("os").tmpdir();;){J=Lh.join(YH,U+te);try{le=Xn.openSync(J,"wx")}catch(ce){if(ce.code==="EEXIST"){te++;continue}else throw ce}Xn.closeSync(le);break}return J}var o,a,n,u={},A,p,h=r("readline-sync.stdout"),E=r("readline-sync.stderr"),w=r("readline-sync.exit"),D=r("readline-sync.done"),b=ve("crypto"),C,T,N;C=b.createHash(Mgt),C.update(""+process.pid+Ugt+++Math.random()),N=C.digest("hex"),T=b.createDecipher(WH,N),o=Nme(t),Xg?(a=process.env.ComSpec||"cmd.exe",process.env.Q='"',n=["/V:ON","/S","/C","(%Q%"+a+"%Q% /V:ON /S /C %Q%%Q%"+Th+"%Q%"+o.map(function(U){return" %Q%"+U+"%Q%"}).join("")+" & (echo !ERRORLEVEL!)>%Q%"+w+"%Q%%Q%) 2>%Q%"+E+"%Q% |%Q%"+process.execPath+"%Q% %Q%"+__dirname+"\\encrypt.js%Q% %Q%"+WH+"%Q% %Q%"+N+"%Q% >%Q%"+h+"%Q% & (echo 1)>%Q%"+D+"%Q%"]):(a="/bin/sh",n=["-c",'("'+Th+'"'+o.map(function(U){return" '"+U.replace(/'/g,"'\\''")+"'"}).join("")+'; echo $?>"'+w+'") 2>"'+E+'" |"'+process.execPath+'" "'+__dirname+'/encrypt.js" "'+WH+'" "'+N+'" >"'+h+'"; echo 1 >"'+D+'"']),G2&&G2("_execFileSync",o);try{VH.spawn(a,n,e)}catch(U){u.error=new Error(U.message),u.error.method="_execFileSync - spawn",u.error.program=a,u.error.args=n}for(;Xn.readFileSync(D,{encoding:t.encoding}).trim()!=="1";);return(A=Xn.readFileSync(w,{encoding:t.encoding}).trim())==="0"?u.input=T.update(Xn.readFileSync(h,{encoding:"binary"}),"hex",t.encoding)+T.final(t.encoding):(p=Xn.readFileSync(E,{encoding:t.encoding}).trim(),u.error=new Error(Tme+(p?` -`+p:"")),u.error.method="_execFileSync",u.error.program=a,u.error.args=n,u.error.extMessage=p,u.error.exitCode=+A),Xn.unlinkSync(h),Xn.unlinkSync(E),Xn.unlinkSync(w),Xn.unlinkSync(D),u}function Hgt(t){var e,r={},o,a={env:process.env,encoding:t.encoding};if(Th||(Xg?process.env.PSModulePath?(Th="powershell.exe",zk=["-ExecutionPolicy","Bypass","-File",__dirname+"\\read.ps1"]):(Th="cscript.exe",zk=["//nologo",__dirname+"\\read.cs.js"]):(Th="/bin/sh",zk=[__dirname+"/read.sh"])),Xg&&!process.env.PSModulePath&&(a.stdio=[process.stdin]),VH.execFileSync){e=Nme(t),G2&&G2("execFileSync",e);try{r.input=VH.execFileSync(Th,e,a)}catch(n){o=n.stderr?(n.stderr+"").trim():"",r.error=new Error(Tme+(o?` -`+o:"")),r.error.method="execFileSync",r.error.program=Th,r.error.args=e,r.error.extMessage=o,r.error.exitCode=n.status,r.error.code=n.code,r.error.signal=n.signal}}else r=_gt(t,a);return r.error||(r.input=r.input.replace(/^\s*'|'\s*$/g,""),t.display=""),r}function zH(t){var e="",r=t.display,o=!t.display&&t.keyIn&&t.hideEchoBack&&!t.mask;function a(){var n=Hgt(t);if(n.error)throw n.error;return n.input}return JH&&JH(t),function(){var n,u,A;function p(){return n||(n=process.binding("fs"),u=process.binding("constants")),n}if(typeof Vf=="string")if(Vf=null,Xg){if(A=function(h){var E=h.replace(/^\D+/,"").split("."),w=0;return(E[0]=+E[0])&&(w+=E[0]*1e4),(E[1]=+E[1])&&(w+=E[1]*100),(E[2]=+E[2])&&(w+=E[2]),w}(process.version),!(A>=20302&&A<40204||A>=5e4&&A<50100||A>=50600&&A<60200)&&process.stdin.isTTY)process.stdin.pause(),Vf=process.stdin.fd,eC=process.stdin._handle;else try{Vf=p().open("CONIN$",u.O_RDWR,parseInt("0666",8)),eC=new Fme(Vf,!0)}catch{}if(process.stdout.isTTY)iu=process.stdout.fd;else{try{iu=Xn.openSync("\\\\.\\CON","w")}catch{}if(typeof iu!="number")try{iu=p().open("CONOUT$",u.O_RDWR,parseInt("0666",8))}catch{}}}else{if(process.stdin.isTTY){process.stdin.pause();try{Vf=Xn.openSync("/dev/tty","r"),eC=process.stdin._handle}catch{}}else try{Vf=Xn.openSync("/dev/tty","r"),eC=new Fme(Vf,!1)}catch{}if(process.stdout.isTTY)iu=process.stdout.fd;else try{iu=Xn.openSync("/dev/tty","w")}catch{}}}(),function(){var n,u,A=!t.hideEchoBack&&!t.keyIn,p,h,E,w,D;Xk="";function b(C){return C===Rme?!0:eC.setRawMode(C)!==0?!1:(Rme=C,!0)}if(Lme||!eC||typeof iu!="number"&&(t.display||!A)){e=a();return}if(t.display&&(Xn.writeSync(iu,t.display),t.display=""),!t.displayOnly){if(!b(!A)){e=a();return}for(h=t.keyIn?1:t.bufferSize,p=Buffer.allocUnsafe&&Buffer.alloc?Buffer.alloc(h):new Buffer(h),t.keyIn&&t.limit&&(u=new RegExp("[^"+t.limit+"]","g"+(t.caseSensitive?"":"i")));;){E=0;try{E=Xn.readSync(Vf,p,0,h)}catch(C){if(C.code!=="EOF"){b(!1),e+=a();return}}if(E>0?(w=p.toString(t.encoding,0,E),Xk+=w):(w=` -`,Xk+="\0"),w&&typeof(D=(w.match(/^(.*?)[\r\n]/)||[])[1])=="string"&&(w=D,n=!0),w&&(w=w.replace(/[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g,"")),w&&u&&(w=w.replace(u,"")),w&&(A||(t.hideEchoBack?t.mask&&Xn.writeSync(iu,new Array(w.length+1).join(t.mask)):Xn.writeSync(iu,w)),e+=w),!t.keyIn&&n||t.keyIn&&e.length>=h)break}!A&&!o&&Xn.writeSync(iu,` -`),b(!1)}}(),t.print&&!o&&t.print(r+(t.displayOnly?"":(t.hideEchoBack?new Array(e.length+1).join(t.mask):e)+` -`),t.encoding),t.displayOnly?"":$H=t.keepWhitespace||t.keyIn?e:e.trim()}function qgt(t,e){var r=[];function o(a){a!=null&&(Array.isArray(a)?a.forEach(o):(!e||e(a))&&r.push(a))}return o(t),r}function e6(t){return t.replace(/[\x00-\x7f]/g,function(e){return"\\x"+("00"+e.charCodeAt().toString(16)).substr(-2)})}function bs(){var t=Array.prototype.slice.call(arguments),e,r;return t.length&&typeof t[0]=="boolean"&&(r=t.shift(),r&&(e=Object.keys(KH),t.unshift(KH))),t.reduce(function(o,a){return a==null||(a.hasOwnProperty("noEchoBack")&&!a.hasOwnProperty("hideEchoBack")&&(a.hideEchoBack=a.noEchoBack,delete a.noEchoBack),a.hasOwnProperty("noTrim")&&!a.hasOwnProperty("keepWhitespace")&&(a.keepWhitespace=a.noTrim,delete a.noTrim),r||(e=Object.keys(a)),e.forEach(function(n){var u;if(a.hasOwnProperty(n))switch(u=a[n],n){case"mask":case"limitMessage":case"defaultInput":case"encoding":u=u!=null?u+"":"",u&&n!=="limitMessage"&&(u=u.replace(/[\r\n]/g,"")),o[n]=u;break;case"bufferSize":!isNaN(u=parseInt(u,10))&&typeof u=="number"&&(o[n]=u);break;case"displayOnly":case"keyIn":case"hideEchoBack":case"caseSensitive":case"keepWhitespace":case"history":case"cd":o[n]=!!u;break;case"limit":case"trueValue":case"falseValue":o[n]=qgt(u,function(A){var p=typeof A;return p==="string"||p==="number"||p==="function"||A instanceof RegExp}).map(function(A){return typeof A=="string"?A.replace(/[\r\n]/g,""):A});break;case"print":case"phContent":case"preCheck":o[n]=typeof u=="function"?u:void 0;break;case"prompt":case"display":o[n]=u??"";break}})),o},{})}function XH(t,e,r){return e.some(function(o){var a=typeof o;return a==="string"?r?t===o:t.toLowerCase()===o.toLowerCase():a==="number"?parseFloat(t)===o:a==="function"?o(t):o instanceof RegExp?o.test(t):!1})}function t6(t,e){var r=Lh.normalize(Xg?(process.env.HOMEDRIVE||"")+(process.env.HOMEPATH||""):process.env.HOME||"").replace(/[\/\\]+$/,"");return t=Lh.normalize(t),e?t.replace(/^~(?=\/|\\|$)/,r):t.replace(new RegExp("^"+e6(r)+"(?=\\/|\\\\|$)",Xg?"i":""),"~")}function tC(t,e){var r="(?:\\(([\\s\\S]*?)\\))?(\\w+|.-.)(?:\\(([\\s\\S]*?)\\))?",o=new RegExp("(\\$)?(\\$<"+r+">)","g"),a=new RegExp("(\\$)?(\\$\\{"+r+"\\})","g");function n(u,A,p,h,E,w){var D;return A||typeof(D=e(E))!="string"?p:D?(h||"")+D+(w||""):""}return t.replace(o,n).replace(a,n)}function Ome(t,e,r){var o,a=[],n=-1,u=0,A="",p;function h(E,w){return w.length>3?(E.push(w[0]+"..."+w[w.length-1]),p=!0):w.length&&(E=E.concat(w)),E}return o=t.reduce(function(E,w){return E.concat((w+"").split(""))},[]).reduce(function(E,w){var D,b;return e||(w=w.toLowerCase()),D=/^\d$/.test(w)?1:/^[A-Z]$/.test(w)?2:/^[a-z]$/.test(w)?3:0,r&&D===0?A+=w:(b=w.charCodeAt(0),D&&D===n&&b===u+1?a.push(w):(E=h(E,a),a=[w],n=D),u=b),E},[]),o=h(o,a),A&&(o.push(A),p=!0),{values:o,suppressed:p}}function Mme(t,e){return t.join(t.length>2?", ":e?" / ":"/")}function Ume(t,e){var r,o,a={},n;if(e.phContent&&(r=e.phContent(t,e)),typeof r!="string")switch(t){case"hideEchoBack":case"mask":case"defaultInput":case"caseSensitive":case"keepWhitespace":case"encoding":case"bufferSize":case"history":case"cd":r=e.hasOwnProperty(t)?typeof e[t]=="boolean"?e[t]?"on":"off":e[t]+"":"";break;case"limit":case"trueValue":case"falseValue":o=e[e.hasOwnProperty(t+"Src")?t+"Src":t],e.keyIn?(a=Ome(o,e.caseSensitive),o=a.values):o=o.filter(function(u){var A=typeof u;return A==="string"||A==="number"}),r=Mme(o,a.suppressed);break;case"limitCount":case"limitCountNotZero":r=e[e.hasOwnProperty("limitSrc")?"limitSrc":"limit"].length,r=r||t!=="limitCountNotZero"?r+"":"";break;case"lastInput":r=$H;break;case"cwd":case"CWD":case"cwdHome":r=process.cwd(),t==="CWD"?r=Lh.basename(r):t==="cwdHome"&&(r=t6(r));break;case"date":case"time":case"localeDate":case"localeTime":r=new Date()["to"+t.replace(/^./,function(u){return u.toUpperCase()})+"String"]();break;default:typeof(n=(t.match(/^history_m(\d+)$/)||[])[1])=="string"&&(r=zg[zg.length-n]||"")}return r}function _me(t){var e=/^(.)-(.)$/.exec(t),r="",o,a,n,u;if(!e)return null;for(o=e[1].charCodeAt(0),a=e[2].charCodeAt(0),u=o -And the length must be: $`,trueValue:null,falseValue:null,caseSensitive:!0},e,{history:!1,cd:!1,phContent:function(b){return b==="charlist"?r.text:b==="length"?o+"..."+a:null}}),u,A,p,h,E,w,D;for(e=e||{},u=tC(e.charlist?e.charlist+"":"$",_me),(isNaN(o=parseInt(e.min,10))||typeof o!="number")&&(o=12),(isNaN(a=parseInt(e.max,10))||typeof a!="number")&&(a=24),h=new RegExp("^["+e6(u)+"]{"+o+","+a+"}$"),r=Ome([u],n.caseSensitive,!0),r.text=Mme(r.values,r.suppressed),A=e.confirmMessage!=null?e.confirmMessage:"Reinput a same one to confirm it: ",p=e.unmatchMessage!=null?e.unmatchMessage:"It differs from first one. Hit only the Enter key if you want to retry from first one.",t==null&&(t="Input new password: "),E=n.limitMessage;!D;)n.limit=h,n.limitMessage=E,w=Kr.question(t,n),n.limit=[w,""],n.limitMessage=p,D=Kr.question(A,n);return w};function jme(t,e,r){var o;function a(n){return o=r(n),!isNaN(o)&&typeof o=="number"}return Kr.question(t,bs({limitMessage:"Input valid number, please."},e,{limit:a,cd:!1})),o}Kr.questionInt=function(t,e){return jme(t,e,function(r){return parseInt(r,10)})};Kr.questionFloat=function(t,e){return jme(t,e,parseFloat)};Kr.questionPath=function(t,e){var r,o="",a=bs({hideEchoBack:!1,limitMessage:`$Input valid path, please.$<( Min:)min>$<( Max:)max>`,history:!0,cd:!0},e,{keepWhitespace:!1,limit:function(n){var u,A,p;n=t6(n,!0),o="";function h(E){E.split(/\/|\\/).reduce(function(w,D){var b=Lh.resolve(w+=D+Lh.sep);if(!Xn.existsSync(b))Xn.mkdirSync(b);else if(!Xn.statSync(b).isDirectory())throw new Error("Non directory already exists: "+b);return w},"")}try{if(u=Xn.existsSync(n),r=u?Xn.realpathSync(n):Lh.resolve(n),!e.hasOwnProperty("exists")&&!u||typeof e.exists=="boolean"&&e.exists!==u)return o=(u?"Already exists":"No such file or directory")+": "+r,!1;if(!u&&e.create&&(e.isDirectory?h(r):(h(Lh.dirname(r)),Xn.closeSync(Xn.openSync(r,"w"))),r=Xn.realpathSync(r)),u&&(e.min||e.max||e.isFile||e.isDirectory)){if(A=Xn.statSync(r),e.isFile&&!A.isFile())return o="Not file: "+r,!1;if(e.isDirectory&&!A.isDirectory())return o="Not directory: "+r,!1;if(e.min&&A.size<+e.min||e.max&&A.size>+e.max)return o="Size "+A.size+" is out of range: "+r,!1}if(typeof e.validate=="function"&&(p=e.validate(r))!==!0)return typeof p=="string"&&(o=p),!1}catch(E){return o=E+"",!1}return!0},phContent:function(n){return n==="error"?o:n!=="min"&&n!=="max"?null:e.hasOwnProperty(n)?e[n]+"":""}});return e=e||{},t==null&&(t='Input path (you can "cd" and "pwd"): '),Kr.question(t,a),r};function Gme(t,e){var r={},o={};return typeof t=="object"?(Object.keys(t).forEach(function(a){typeof t[a]=="function"&&(o[e.caseSensitive?a:a.toLowerCase()]=t[a])}),r.preCheck=function(a){var n;return r.args=ZH(a),n=r.args[0]||"",e.caseSensitive||(n=n.toLowerCase()),r.hRes=n!=="_"&&o.hasOwnProperty(n)?o[n].apply(a,r.args.slice(1)):o.hasOwnProperty("_")?o._.apply(a,r.args):null,{res:a,forceNext:!1}},o.hasOwnProperty("_")||(r.limit=function(){var a=r.args[0]||"";return e.caseSensitive||(a=a.toLowerCase()),o.hasOwnProperty(a)})):r.preCheck=function(a){return r.args=ZH(a),r.hRes=typeof t=="function"?t.apply(a,r.args):!0,{res:a,forceNext:!1}},r}Kr.promptCL=function(t,e){var r=bs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=Gme(t,r);return r.limit=o.limit,r.preCheck=o.preCheck,Kr.prompt(r),o.args};Kr.promptLoop=function(t,e){for(var r=bs({hideEchoBack:!1,trueValue:null,falseValue:null,caseSensitive:!1,history:!0},e);!t(Kr.prompt(r)););};Kr.promptCLLoop=function(t,e){var r=bs({hideEchoBack:!1,limitMessage:"Requested command is not available.",caseSensitive:!1,history:!0},e),o=Gme(t,r);for(r.limit=o.limit,r.preCheck=o.preCheck;Kr.prompt(r),!o.hRes;);};Kr.promptSimShell=function(t){return Kr.prompt(bs({hideEchoBack:!1,history:!0},t,{prompt:function(){return Xg?"$>":(process.env.USER||"")+(process.env.HOSTNAME?"@"+process.env.HOSTNAME.replace(/\..*$/,""):"")+":$$ "}()}))};function Wme(t,e,r){var o;return t==null&&(t="Are you sure? "),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s*:?\s*$/,"")+" [y/n]: "),o=Kr.keyIn(t,bs(e,{hideEchoBack:!1,limit:r,trueValue:"y",falseValue:"n",caseSensitive:!1})),typeof o=="boolean"?o:""}Kr.keyInYN=function(t,e){return Wme(t,e)};Kr.keyInYNStrict=function(t,e){return Wme(t,e,"yn")};Kr.keyInPause=function(t,e){t==null&&(t="Continue..."),(!e||e.guide!==!1)&&(t+="")&&(t=t.replace(/\s+$/,"")+" (Hit any key)"),Kr.keyIn(t,bs({limit:null},e,{hideEchoBack:!0,mask:""}))};Kr.keyInSelect=function(t,e,r){var o=bs({hideEchoBack:!1},r,{trueValue:null,falseValue:null,caseSensitive:!1,phContent:function(p){return p==="itemsCount"?t.length+"":p==="firstItem"?(t[0]+"").trim():p==="lastItem"?(t[t.length-1]+"").trim():null}}),a="",n={},u=49,A=` -`;if(!Array.isArray(t)||!t.length||t.length>35)throw"`items` must be Array (max length: 35).";return t.forEach(function(p,h){var E=String.fromCharCode(u);a+=E,n[E]=h,A+="["+E+"] "+(p+"").trim()+` -`,u=u===57?97:u+1}),(!r||r.cancel!==!1)&&(a+="0",n[0]=-1,A+="[0] "+(r&&r.cancel!=null&&typeof r.cancel!="boolean"?(r.cancel+"").trim():"CANCEL")+` -`),o.limit=a,A+=` -`,e==null&&(e="Choose one from list: "),(e+="")&&((!r||r.guide!==!1)&&(e=e.replace(/\s*:?\s*$/,"")+" [$]: "),A+=e),n[Kr.keyIn(A,o).toLowerCase()]};Kr.getRawInput=function(){return Xk};function W2(t,e){var r;return e.length&&(r={},r[t]=e[0]),Kr.setDefaultOptions(r)[t]}Kr.setPrint=function(){return W2("print",arguments)};Kr.setPrompt=function(){return W2("prompt",arguments)};Kr.setEncoding=function(){return W2("encoding",arguments)};Kr.setMask=function(){return W2("mask",arguments)};Kr.setBufferSize=function(){return W2("bufferSize",arguments)}});var r6=_((O9t,El)=>{(function(){var t={major:0,minor:2,patch:66,status:"beta"};tau_file_system={files:{},open:function(I,P,y){var R=tau_file_system.files[I];if(!R){if(y==="read")return null;R={path:I,text:"",type:P,get:function(z,X){return X===this.text.length||X>this.text.length?"end_of_file":this.text.substring(X,X+z)},put:function(z,X){return X==="end_of_file"?(this.text+=z,!0):X==="past_end_of_file"?null:(this.text=this.text.substring(0,X)+z+this.text.substring(X+z.length),!0)},get_byte:function(z){if(z==="end_of_stream")return-1;var X=Math.floor(z/2);if(this.text.length<=X)return-1;var $=n(this.text[Math.floor(z/2)],0);return z%2===0?$&255:$/256>>>0},put_byte:function(z,X){var $=X==="end_of_stream"?this.text.length:Math.floor(X/2);if(this.text.length<$)return null;var se=this.text.length===$?-1:n(this.text[Math.floor(X/2)],0);return X%2===0?(se=se/256>>>0,se=(se&255)<<8|z&255):(se=se&255,se=(z&255)<<8|se&255),this.text.length===$?this.text+=u(se):this.text=this.text.substring(0,$)+u(se)+this.text.substring($+1),!0},flush:function(){return!0},close:function(){var z=tau_file_system.files[this.path];return z?!0:null}},tau_file_system.files[I]=R}return y==="write"&&(R.text=""),R}},tau_user_input={buffer:"",get:function(I,P){for(var y;tau_user_input.buffer.length\?\@\^\~\\]+|'(?:[^']*?(?:\\(?:x?\d+)?\\)*(?:'')*(?:\\')*)*')/,number:/^(?:0o[0-7]+|0x[0-9a-fA-F]+|0b[01]+|0'(?:''|\\[abfnrtv\\'"`]|\\x?\d+\\|[^\\])|\d+(?:\.\d+(?:[eE][+-]?\d+)?)?)/,string:/^(?:"([^"]|""|\\")*"|`([^`]|``|\\`)*`)/,l_brace:/^(?:\[)/,r_brace:/^(?:\])/,l_bracket:/^(?:\{)/,r_bracket:/^(?:\})/,bar:/^(?:\|)/,l_paren:/^(?:\()/,r_paren:/^(?:\))/};function N(I,P){return I.get_flag("char_conversion").id==="on"?P.replace(/./g,function(y){return I.get_char_conversion(y)}):P}function U(I){this.thread=I,this.text="",this.tokens=[]}U.prototype.set_last_tokens=function(I){return this.tokens=I},U.prototype.new_text=function(I){this.text=I,this.tokens=[]},U.prototype.get_tokens=function(I){var P,y=0,R=0,z=0,X=[],$=!1;if(I){var se=this.tokens[I-1];y=se.len,P=N(this.thread,this.text.substr(se.len)),R=se.line,z=se.start}else P=this.text;if(/^\s*$/.test(P))return null;for(;P!=="";){var be=[],Fe=!1;if(/^\n/.exec(P)!==null){R++,z=0,y++,P=P.replace(/\n/,""),$=!0;continue}for(var lt in T)if(T.hasOwnProperty(lt)){var Et=T[lt].exec(P);Et&&be.push({value:Et[0],name:lt,matches:Et})}if(!be.length)return this.set_last_tokens([{value:P,matches:[],name:"lexical",line:R,start:z}]);var se=r(be,function(Sr,yr){return Sr.value.length>=yr.value.length?Sr:yr});switch(se.start=z,se.line=R,P=P.replace(se.value,""),z+=se.value.length,y+=se.value.length,se.name){case"atom":se.raw=se.value,se.value.charAt(0)==="'"&&(se.value=D(se.value.substr(1,se.value.length-2),"'"),se.value===null&&(se.name="lexical",se.value="unknown escape sequence"));break;case"number":se.float=se.value.substring(0,2)!=="0x"&&se.value.match(/[.eE]/)!==null&&se.value!=="0'.",se.value=C(se.value),se.blank=Fe;break;case"string":var qt=se.value.charAt(0);se.value=D(se.value.substr(1,se.value.length-2),qt),se.value===null&&(se.name="lexical",se.value="unknown escape sequence");break;case"whitespace":var nr=X[X.length-1];nr&&(nr.space=!0),Fe=!0;continue;case"r_bracket":X.length>0&&X[X.length-1].name==="l_bracket"&&(se=X.pop(),se.name="atom",se.value="{}",se.raw="{}",se.space=!1);break;case"r_brace":X.length>0&&X[X.length-1].name==="l_brace"&&(se=X.pop(),se.name="atom",se.value="[]",se.raw="[]",se.space=!1);break}se.len=y,X.push(se),Fe=!1}var Pt=this.set_last_tokens(X);return Pt.length===0?null:Pt};function J(I,P,y,R,z){if(!P[y])return{type:A,value:x.error.syntax(P[y-1],"expression expected",!0)};var X;if(R==="0"){var $=P[y];switch($.name){case"number":return{type:p,len:y+1,value:new x.type.Num($.value,$.float)};case"variable":return{type:p,len:y+1,value:new x.type.Var($.value)};case"string":var se;switch(I.get_flag("double_quotes").id){case"atom":se=new q($.value,[]);break;case"codes":se=new q("[]",[]);for(var be=$.value.length-1;be>=0;be--)se=new q(".",[new x.type.Num(n($.value,be),!1),se]);break;case"chars":se=new q("[]",[]);for(var be=$.value.length-1;be>=0;be--)se=new q(".",[new x.type.Term($.value.charAt(be),[]),se]);break}return{type:p,len:y+1,value:se};case"l_paren":var Pt=J(I,P,y+1,I.__get_max_priority(),!0);return Pt.type!==p?Pt:P[Pt.len]&&P[Pt.len].name==="r_paren"?(Pt.len++,Pt):{type:A,derived:!0,value:x.error.syntax(P[Pt.len]?P[Pt.len]:P[Pt.len-1],") or operator expected",!P[Pt.len])};case"l_bracket":var Pt=J(I,P,y+1,I.__get_max_priority(),!0);return Pt.type!==p?Pt:P[Pt.len]&&P[Pt.len].name==="r_bracket"?(Pt.len++,Pt.value=new q("{}",[Pt.value]),Pt):{type:A,derived:!0,value:x.error.syntax(P[Pt.len]?P[Pt.len]:P[Pt.len-1],"} or operator expected",!P[Pt.len])}}var Fe=te(I,P,y,z);return Fe.type===p||Fe.derived||(Fe=le(I,P,y),Fe.type===p||Fe.derived)?Fe:{type:A,derived:!1,value:x.error.syntax(P[y],"unexpected token")}}var lt=I.__get_max_priority(),Et=I.__get_next_priority(R),qt=y;if(P[y].name==="atom"&&P[y+1]&&(P[y].space||P[y+1].name!=="l_paren")){var $=P[y++],nr=I.__lookup_operator_classes(R,$.value);if(nr&&nr.indexOf("fy")>-1){var Pt=J(I,P,y,R,z);if(Pt.type!==A)return $.value==="-"&&!$.space&&x.type.is_number(Pt.value)?{value:new x.type.Num(-Pt.value.value,Pt.value.is_float),len:Pt.len,type:p}:{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}else if(nr&&nr.indexOf("fx")>-1){var Pt=J(I,P,y,Et,z);if(Pt.type!==A)return{value:new x.type.Term($.value,[Pt.value]),len:Pt.len,type:p};X=Pt}}y=qt;var Pt=J(I,P,y,Et,z);if(Pt.type===p){y=Pt.len;var $=P[y];if(P[y]&&(P[y].name==="atom"&&I.__lookup_operator_classes(R,$.value)||P[y].name==="bar"&&I.__lookup_operator_classes(R,"|"))){var cn=Et,Sr=R,nr=I.__lookup_operator_classes(R,$.value);if(nr.indexOf("xf")>-1)return{value:new x.type.Term($.value,[Pt.value]),len:++Pt.len,type:p};if(nr.indexOf("xfx")>-1){var yr=J(I,P,y+1,cn,z);return yr.type===p?{value:new x.type.Term($.value,[Pt.value,yr.value]),len:yr.len,type:p}:(yr.derived=!0,yr)}else if(nr.indexOf("xfy")>-1){var yr=J(I,P,y+1,Sr,z);return yr.type===p?{value:new x.type.Term($.value,[Pt.value,yr.value]),len:yr.len,type:p}:(yr.derived=!0,yr)}else if(Pt.type!==A)for(;;){y=Pt.len;var $=P[y];if($&&$.name==="atom"&&I.__lookup_operator_classes(R,$.value)){var nr=I.__lookup_operator_classes(R,$.value);if(nr.indexOf("yf")>-1)Pt={value:new x.type.Term($.value,[Pt.value]),len:++y,type:p};else if(nr.indexOf("yfx")>-1){var yr=J(I,P,++y,cn,z);if(yr.type===A)return yr.derived=!0,yr;y=yr.len,Pt={value:new x.type.Term($.value,[Pt.value,yr.value]),len:y,type:p}}else break}else break}}else X={type:A,value:x.error.syntax(P[Pt.len-1],"operator expected")};return Pt}return Pt}function te(I,P,y,R){if(!P[y]||P[y].name==="atom"&&P[y].raw==="."&&!R&&(P[y].space||!P[y+1]||P[y+1].name!=="l_paren"))return{type:A,derived:!1,value:x.error.syntax(P[y-1],"unfounded token")};var z=P[y],X=[];if(P[y].name==="atom"&&P[y].raw!==","){if(y++,P[y-1].space)return{type:p,len:y,value:new x.type.Term(z.value,X)};if(P[y]&&P[y].name==="l_paren"){if(P[y+1]&&P[y+1].name==="r_paren")return{type:A,derived:!0,value:x.error.syntax(P[y+1],"argument expected")};var $=J(I,P,++y,"999",!0);if($.type===A)return $.derived?$:{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],"argument expected",!P[y])};for(X.push($.value),y=$.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if($=J(I,P,y+1,"999",!0),$.type===A)return $.derived?$:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};X.push($.value),y=$.len}if(P[y]&&P[y].name==="r_paren")y++;else return{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],", or ) expected",!P[y])}}return{type:p,len:y,value:new x.type.Term(z.value,X)}}return{type:A,derived:!1,value:x.error.syntax(P[y],"term expected")}}function le(I,P,y){if(!P[y])return{type:A,derived:!1,value:x.error.syntax(P[y-1],"[ expected")};if(P[y]&&P[y].name==="l_brace"){var R=J(I,P,++y,"999",!0),z=[R.value],X=void 0;if(R.type===A)return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:new x.type.Term("[]",[])}:{type:A,derived:!0,value:x.error.syntax(P[y],"] expected")};for(y=R.len;P[y]&&P[y].name==="atom"&&P[y].value===",";){if(R=J(I,P,y+1,"999",!0),R.type===A)return R.derived?R:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};z.push(R.value),y=R.len}var $=!1;if(P[y]&&P[y].name==="bar"){if($=!0,R=J(I,P,y+1,"999",!0),R.type===A)return R.derived?R:{type:A,derived:!0,value:x.error.syntax(P[y+1]?P[y+1]:P[y],"argument expected",!P[y+1])};X=R.value,y=R.len}return P[y]&&P[y].name==="r_brace"?{type:p,len:y+1,value:g(z,X)}:{type:A,derived:!0,value:x.error.syntax(P[y]?P[y]:P[y-1],$?"] expected":", or | or ] expected",!P[y])}}return{type:A,derived:!1,value:x.error.syntax(P[y],"list expected")}}function ce(I,P,y){var R=P[y].line,z=J(I,P,y,I.__get_max_priority(),!1),X=null,$;if(z.type!==A)if(y=z.len,P[y]&&P[y].name==="atom"&&P[y].raw===".")if(y++,x.type.is_term(z.value)){if(z.value.indicator===":-/2"?(X=new x.type.Rule(z.value.args[0],Ee(z.value.args[1])),$={value:X,len:y,type:p}):z.value.indicator==="-->/2"?(X=he(new x.type.Rule(z.value.args[0],z.value.args[1]),I),X.body=Ee(X.body),$={value:X,len:y,type:x.type.is_rule(X)?p:A}):(X=new x.type.Rule(z.value,null),$={value:X,len:y,type:p}),X){var se=X.singleton_variables();se.length>0&&I.throw_warning(x.warning.singleton(se,X.head.indicator,R))}return $}else return{type:A,value:x.error.syntax(P[y],"callable expected")};else return{type:A,value:x.error.syntax(P[y]?P[y]:P[y-1],". or operator expected")};return z}function ue(I,P,y){y=y||{},y.from=y.from?y.from:"$tau-js",y.reconsult=y.reconsult!==void 0?y.reconsult:!0;var R=new U(I),z={},X;R.new_text(P);var $=0,se=R.get_tokens($);do{if(se===null||!se[$])break;var be=ce(I,se,$);if(be.type===A)return new q("throw",[be.value]);if(be.value.body===null&&be.value.head.indicator==="?-/1"){var Fe=new tt(I.session);Fe.add_goal(be.value.head.args[0]),Fe.answer(function(Et){x.type.is_error(Et)?I.throw_warning(Et.args[0]):(Et===!1||Et===null)&&I.throw_warning(x.warning.failed_goal(be.value.head.args[0],be.len))}),$=be.len;var lt=!0}else if(be.value.body===null&&be.value.head.indicator===":-/1"){var lt=I.run_directive(be.value.head.args[0]);$=be.len,be.value.head.args[0].indicator==="char_conversion/2"&&(se=R.get_tokens($),$=0)}else{X=be.value.head.indicator,y.reconsult!==!1&&z[X]!==!0&&!I.is_multifile_predicate(X)&&(I.session.rules[X]=a(I.session.rules[X]||[],function(qt){return qt.dynamic}),z[X]=!0);var lt=I.add_rule(be.value,y);$=be.len}if(!lt)return lt}while(!0);return!0}function Ie(I,P){var y=new U(I);y.new_text(P);var R=0;do{var z=y.get_tokens(R);if(z===null)break;var X=J(I,z,0,I.__get_max_priority(),!1);if(X.type!==A){var $=X.len,se=$;if(z[$]&&z[$].name==="atom"&&z[$].raw===".")I.add_goal(Ee(X.value));else{var be=z[$];return new q("throw",[x.error.syntax(be||z[$-1],". or operator expected",!be)])}R=X.len+1}else return new q("throw",[X.value])}while(!0);return!0}function he(I,P){I=I.rename(P);var y=P.next_free_variable(),R=De(I.body,y,P);return R.error?R.value:(I.body=R.value,I.head.args=I.head.args.concat([y,R.variable]),I.head=new q(I.head.id,I.head.args),I)}function De(I,P,y){var R;if(x.type.is_term(I)&&I.indicator==="!/0")return{value:I,variable:P,error:!1};if(x.type.is_term(I)&&I.indicator===",/2"){var z=De(I.args[0],P,y);if(z.error)return z;var X=De(I.args[1],z.variable,y);return X.error?X:{value:new q(",",[z.value,X.value]),variable:X.variable,error:!1}}else{if(x.type.is_term(I)&&I.indicator==="{}/1")return{value:I.args[0],variable:P,error:!1};if(x.type.is_empty_list(I))return{value:new q("true",[]),variable:P,error:!1};if(x.type.is_list(I)){R=y.next_free_variable();for(var $=I,se;$.indicator==="./2";)se=$,$=$.args[1];return x.type.is_variable($)?{value:x.error.instantiation("DCG"),variable:P,error:!0}:x.type.is_empty_list($)?(se.args[1]=R,{value:new q("=",[P,I]),variable:R,error:!1}):{value:x.error.type("list",I,"DCG"),variable:P,error:!0}}else return x.type.is_callable(I)?(R=y.next_free_variable(),I.args=I.args.concat([P,R]),I=new q(I.id,I.args),{value:I,variable:R,error:!1}):{value:x.error.type("callable",I,"DCG"),variable:P,error:!0}}}function Ee(I){return x.type.is_variable(I)?new q("call",[I]):x.type.is_term(I)&&[",/2",";/2","->/2"].indexOf(I.indicator)!==-1?new q(I.id,[Ee(I.args[0]),Ee(I.args[1])]):I}function g(I,P){for(var y=P||new x.type.Term("[]",[]),R=I.length-1;R>=0;R--)y=new x.type.Term(".",[I[R],y]);return y}function me(I,P){for(var y=I.length-1;y>=0;y--)I[y]===P&&I.splice(y,1)}function Ce(I){for(var P={},y=[],R=0;R=0;P--)if(I.charAt(P)==="/")return new q("/",[new q(I.substring(0,P)),new Re(parseInt(I.substring(P+1)),!1)])}function Se(I){this.id=I}function Re(I,P){this.is_float=P!==void 0?P:parseInt(I)!==I,this.value=this.is_float?I:parseInt(I)}var ht=0;function q(I,P,y){this.ref=y||++ht,this.id=I,this.args=P||[],this.indicator=I+"/"+this.args.length}var nt=0;function Le(I,P,y,R,z,X){this.id=nt++,this.stream=I,this.mode=P,this.alias=y,this.type=R!==void 0?R:"text",this.reposition=z!==void 0?z:!0,this.eof_action=X!==void 0?X:"eof_code",this.position=this.mode==="append"?"end_of_stream":0,this.output=this.mode==="write"||this.mode==="append",this.input=this.mode==="read"}function Te(I){I=I||{},this.links=I}function ke(I,P,y){P=P||new Te,y=y||null,this.goal=I,this.substitution=P,this.parent=y}function Ke(I,P,y){this.head=I,this.body=P,this.dynamic=y||!1}function xe(I){I=I===void 0||I<=0?1e3:I,this.rules={},this.src_predicates={},this.rename=0,this.modules=[],this.thread=new tt(this),this.total_threads=1,this.renamed_variables={},this.public_predicates={},this.multifile_predicates={},this.limit=I,this.streams={user_input:new Le(typeof El<"u"&&El.exports?nodejs_user_input:tau_user_input,"read","user_input","text",!1,"reset"),user_output:new Le(typeof El<"u"&&El.exports?nodejs_user_output:tau_user_output,"write","user_output","text",!1,"eof_code")},this.file_system=typeof El<"u"&&El.exports?nodejs_file_system:tau_file_system,this.standard_input=this.streams.user_input,this.standard_output=this.streams.user_output,this.current_input=this.streams.user_input,this.current_output=this.streams.user_output,this.format_success=function(P){return P.substitution},this.format_error=function(P){return P.goal},this.flag={bounded:x.flag.bounded.value,max_integer:x.flag.max_integer.value,min_integer:x.flag.min_integer.value,integer_rounding_function:x.flag.integer_rounding_function.value,char_conversion:x.flag.char_conversion.value,debug:x.flag.debug.value,max_arity:x.flag.max_arity.value,unknown:x.flag.unknown.value,double_quotes:x.flag.double_quotes.value,occurs_check:x.flag.occurs_check.value,dialect:x.flag.dialect.value,version_data:x.flag.version_data.value,nodejs:x.flag.nodejs.value},this.__loaded_modules=[],this.__char_conversion={},this.__operators={1200:{":-":["fx","xfx"],"-->":["xfx"],"?-":["fx"]},1100:{";":["xfy"]},1050:{"->":["xfy"]},1e3:{",":["xfy"]},900:{"\\+":["fy"]},700:{"=":["xfx"],"\\=":["xfx"],"==":["xfx"],"\\==":["xfx"],"@<":["xfx"],"@=<":["xfx"],"@>":["xfx"],"@>=":["xfx"],"=..":["xfx"],is:["xfx"],"=:=":["xfx"],"=\\=":["xfx"],"<":["xfx"],"=<":["xfx"],">":["xfx"],">=":["xfx"]},600:{":":["xfy"]},500:{"+":["yfx"],"-":["yfx"],"/\\":["yfx"],"\\/":["yfx"]},400:{"*":["yfx"],"/":["yfx"],"//":["yfx"],rem:["yfx"],mod:["yfx"],"<<":["yfx"],">>":["yfx"]},200:{"**":["xfx"],"^":["xfy"],"-":["fy"],"+":["fy"],"\\":["fy"]}}}function tt(I){this.epoch=Date.now(),this.session=I,this.session.total_threads++,this.total_steps=0,this.cpu_time=0,this.cpu_time_last=0,this.points=[],this.debugger=!1,this.debugger_states=[],this.level="top_level/0",this.__calls=[],this.current_limit=this.session.limit,this.warnings=[]}function He(I,P,y){this.id=I,this.rules=P,this.exports=y,x.module[I]=this}He.prototype.exports_predicate=function(I){return this.exports.indexOf(I)!==-1},Se.prototype.unify=function(I,P){if(P&&e(I.variables(),this.id)!==-1&&!x.type.is_variable(I))return null;var y={};return y[this.id]=I,new Te(y)},Re.prototype.unify=function(I,P){return x.type.is_number(I)&&this.value===I.value&&this.is_float===I.is_float?new Te:null},q.prototype.unify=function(I,P){if(x.type.is_term(I)&&this.indicator===I.indicator){for(var y=new Te,R=0;R=0){var R=this.args[0].value,z=Math.floor(R/26),X=R%26;return"ABCDEFGHIJKLMNOPQRSTUVWXYZ"[X]+(z!==0?z:"")}switch(this.indicator){case"[]/0":case"{}/0":case"!/0":return this.id;case"{}/1":return"{"+this.args[0].toString(I)+"}";case"./2":for(var $="["+this.args[0].toString(I),se=this.args[1];se.indicator==="./2";)$+=", "+se.args[0].toString(I),se=se.args[1];return se.indicator!=="[]/0"&&($+="|"+se.toString(I)),$+="]",$;case",/2":return"("+this.args[0].toString(I)+", "+this.args[1].toString(I)+")";default:var be=this.id,Fe=I.session?I.session.lookup_operator(this.id,this.args.length):null;if(I.session===void 0||I.ignore_ops||Fe===null)return I.quoted&&!/^(!|,|;|[a-z][0-9a-zA-Z_]*)$/.test(be)&&be!=="{}"&&be!=="[]"&&(be="'"+b(be)+"'"),be+(this.args.length?"("+o(this.args,function(nr){return nr.toString(I)}).join(", ")+")":"");var lt=Fe.priority>P.priority||Fe.priority===P.priority&&(Fe.class==="xfy"&&this.indicator!==P.indicator||Fe.class==="yfx"&&this.indicator!==P.indicator||this.indicator===P.indicator&&Fe.class==="yfx"&&y==="right"||this.indicator===P.indicator&&Fe.class==="xfy"&&y==="left");Fe.indicator=this.indicator;var Et=lt?"(":"",qt=lt?")":"";return this.args.length===0?"("+this.id+")":["fy","fx"].indexOf(Fe.class)!==-1?Et+be+" "+this.args[0].toString(I,Fe)+qt:["yf","xf"].indexOf(Fe.class)!==-1?Et+this.args[0].toString(I,Fe)+" "+be+qt:Et+this.args[0].toString(I,Fe,"left")+" "+this.id+" "+this.args[1].toString(I,Fe,"right")+qt}},Le.prototype.toString=function(I){return"("+this.id+")"},Te.prototype.toString=function(I){var P="{";for(var y in this.links)this.links.hasOwnProperty(y)&&(P!=="{"&&(P+=", "),P+=y+"/"+this.links[y].toString(I));return P+="}",P},ke.prototype.toString=function(I){return this.goal===null?"<"+this.substitution.toString(I)+">":"<"+this.goal.toString(I)+", "+this.substitution.toString(I)+">"},Ke.prototype.toString=function(I){return this.body?this.head.toString(I)+" :- "+this.body.toString(I)+".":this.head.toString(I)+"."},xe.prototype.toString=function(I){for(var P="",y=0;y=0;z--)R=new q(".",[P[z],R]);return R}return new q(this.id,o(this.args,function(X){return X.apply(I)}),this.ref)},Le.prototype.apply=function(I){return this},Ke.prototype.apply=function(I){return new Ke(this.head.apply(I),this.body!==null?this.body.apply(I):null)},Te.prototype.apply=function(I){var P,y={};for(P in this.links)this.links.hasOwnProperty(P)&&(y[P]=this.links[P].apply(I));return new Te(y)},q.prototype.select=function(){for(var I=this;I.indicator===",/2";)I=I.args[0];return I},q.prototype.replace=function(I){return this.indicator===",/2"?this.args[0].indicator===",/2"?new q(",",[this.args[0].replace(I),this.args[1]]):I===null?this.args[1]:new q(",",[I,this.args[1]]):I},q.prototype.search=function(I){if(x.type.is_term(I)&&I.ref!==void 0&&this.ref===I.ref)return!0;for(var P=0;PP&&R0&&(P=this.head_point().substitution.domain());e(P,x.format_variable(this.session.rename))!==-1;)this.session.rename++;if(I.id==="_")return new Se(x.format_variable(this.session.rename));this.session.renamed_variables[I.id]=x.format_variable(this.session.rename)}return new Se(this.session.renamed_variables[I.id])},xe.prototype.next_free_variable=function(){return this.thread.next_free_variable()},tt.prototype.next_free_variable=function(){this.session.rename++;var I=[];for(this.points.length>0&&(I=this.head_point().substitution.domain());e(I,x.format_variable(this.session.rename))!==-1;)this.session.rename++;return new Se(x.format_variable(this.session.rename))},xe.prototype.is_public_predicate=function(I){return!this.public_predicates.hasOwnProperty(I)||this.public_predicates[I]===!0},tt.prototype.is_public_predicate=function(I){return this.session.is_public_predicate(I)},xe.prototype.is_multifile_predicate=function(I){return this.multifile_predicates.hasOwnProperty(I)&&this.multifile_predicates[I]===!0},tt.prototype.is_multifile_predicate=function(I){return this.session.is_multifile_predicate(I)},xe.prototype.prepend=function(I){return this.thread.prepend(I)},tt.prototype.prepend=function(I){for(var P=I.length-1;P>=0;P--)this.points.push(I[P])},xe.prototype.success=function(I,P){return this.thread.success(I,P)},tt.prototype.success=function(I,y){var y=typeof y>"u"?I:y;this.prepend([new ke(I.goal.replace(null),I.substitution,y)])},xe.prototype.throw_error=function(I){return this.thread.throw_error(I)},tt.prototype.throw_error=function(I){this.prepend([new ke(new q("throw",[I]),new Te,null,null)])},xe.prototype.step_rule=function(I,P){return this.thread.step_rule(I,P)},tt.prototype.step_rule=function(I,P){var y=P.indicator;if(I==="user"&&(I=null),I===null&&this.session.rules.hasOwnProperty(y))return this.session.rules[y];for(var R=I===null?this.session.modules:e(this.session.modules,I)===-1?[]:[I],z=0;z1)&&this.again()},xe.prototype.answers=function(I,P,y){return this.thread.answers(I,P,y)},tt.prototype.answers=function(I,P,y){var R=P||1e3,z=this;if(P<=0){y&&y();return}this.answer(function(X){I(X),X!==!1?setTimeout(function(){z.answers(I,P-1,y)},1):y&&y()})},xe.prototype.again=function(I){return this.thread.again(I)},tt.prototype.again=function(I){for(var P,y=Date.now();this.__calls.length>0;){for(this.warnings=[],I!==!1&&(this.current_limit=this.session.limit);this.current_limit>0&&this.points.length>0&&this.head_point().goal!==null&&!x.type.is_error(this.head_point().goal);)if(this.current_limit--,this.step()===!0)return;var R=Date.now();this.cpu_time_last=R-y,this.cpu_time+=this.cpu_time_last;var z=this.__calls.shift();this.current_limit<=0?z(null):this.points.length===0?z(!1):x.type.is_error(this.head_point().goal)?(P=this.session.format_error(this.points.pop()),this.points=[],z(P)):(this.debugger&&this.debugger_states.push(this.head_point()),P=this.session.format_success(this.points.pop()),z(P))}},xe.prototype.unfold=function(I){if(I.body===null)return!1;var P=I.head,y=I.body,R=y.select(),z=new tt(this),X=[];z.add_goal(R),z.step();for(var $=z.points.length-1;$>=0;$--){var se=z.points[$],be=P.apply(se.substitution),Fe=y.replace(se.goal);Fe!==null&&(Fe=Fe.apply(se.substitution)),X.push(new Ke(be,Fe))}var lt=this.rules[P.indicator],Et=e(lt,I);return X.length>0&&Et!==-1?(lt.splice.apply(lt,[Et,1].concat(X)),!0):!1},tt.prototype.unfold=function(I){return this.session.unfold(I)},Se.prototype.interpret=function(I){return x.error.instantiation(I.level)},Re.prototype.interpret=function(I){return this},q.prototype.interpret=function(I){return x.type.is_unitary_list(this)?this.args[0].interpret(I):x.operate(I,this)},Se.prototype.compare=function(I){return this.idI.id?1:0},Re.prototype.compare=function(I){if(this.value===I.value&&this.is_float===I.is_float)return 0;if(this.valueI.value)return 1},q.prototype.compare=function(I){if(this.args.lengthI.args.length||this.args.length===I.args.length&&this.id>I.id)return 1;for(var P=0;PR)return 1;if(I.constructor===Re){if(I.is_float&&P.is_float)return 0;if(I.is_float)return-1;if(P.is_float)return 1}return 0},is_substitution:function(I){return I instanceof Te},is_state:function(I){return I instanceof ke},is_rule:function(I){return I instanceof Ke},is_variable:function(I){return I instanceof Se},is_stream:function(I){return I instanceof Le},is_anonymous_var:function(I){return I instanceof Se&&I.id==="_"},is_callable:function(I){return I instanceof q},is_number:function(I){return I instanceof Re},is_integer:function(I){return I instanceof Re&&!I.is_float},is_float:function(I){return I instanceof Re&&I.is_float},is_term:function(I){return I instanceof q},is_atom:function(I){return I instanceof q&&I.args.length===0},is_ground:function(I){if(I instanceof Se)return!1;if(I instanceof q){for(var P=0;P0},is_list:function(I){return I instanceof q&&(I.indicator==="[]/0"||I.indicator==="./2")},is_empty_list:function(I){return I instanceof q&&I.indicator==="[]/0"},is_non_empty_list:function(I){return I instanceof q&&I.indicator==="./2"},is_fully_list:function(I){for(;I instanceof q&&I.indicator==="./2";)I=I.args[1];return I instanceof Se||I instanceof q&&I.indicator==="[]/0"},is_instantiated_list:function(I){for(;I instanceof q&&I.indicator==="./2";)I=I.args[1];return I instanceof q&&I.indicator==="[]/0"},is_unitary_list:function(I){return I instanceof q&&I.indicator==="./2"&&I.args[1]instanceof q&&I.args[1].indicator==="[]/0"},is_character:function(I){return I instanceof q&&(I.id.length===1||I.id.length>0&&I.id.length<=2&&n(I.id,0)>=65536)},is_character_code:function(I){return I instanceof Re&&!I.is_float&&I.value>=0&&I.value<=1114111},is_byte:function(I){return I instanceof Re&&!I.is_float&&I.value>=0&&I.value<=255},is_operator:function(I){return I instanceof q&&x.arithmetic.evaluation[I.indicator]},is_directive:function(I){return I instanceof q&&x.directive[I.indicator]!==void 0},is_builtin:function(I){return I instanceof q&&x.predicate[I.indicator]!==void 0},is_error:function(I){return I instanceof q&&I.indicator==="throw/1"},is_predicate_indicator:function(I){return I instanceof q&&I.indicator==="//2"&&I.args[0]instanceof q&&I.args[0].args.length===0&&I.args[1]instanceof Re&&I.args[1].is_float===!1},is_flag:function(I){return I instanceof q&&I.args.length===0&&x.flag[I.id]!==void 0},is_value_flag:function(I,P){if(!x.type.is_flag(I))return!1;for(var y in x.flag[I.id].allowed)if(x.flag[I.id].allowed.hasOwnProperty(y)&&x.flag[I.id].allowed[y].equals(P))return!0;return!1},is_io_mode:function(I){return x.type.is_atom(I)&&["read","write","append"].indexOf(I.id)!==-1},is_stream_option:function(I){return x.type.is_term(I)&&(I.indicator==="alias/1"&&x.type.is_atom(I.args[0])||I.indicator==="reposition/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="type/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="text"||I.args[0].id==="binary")||I.indicator==="eof_action/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="error"||I.args[0].id==="eof_code"||I.args[0].id==="reset"))},is_stream_position:function(I){return x.type.is_integer(I)&&I.value>=0||x.type.is_atom(I)&&(I.id==="end_of_stream"||I.id==="past_end_of_stream")},is_stream_property:function(I){return x.type.is_term(I)&&(I.indicator==="input/0"||I.indicator==="output/0"||I.indicator==="alias/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0]))||I.indicator==="file_name/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0]))||I.indicator==="position/1"&&(x.type.is_variable(I.args[0])||x.type.is_stream_position(I.args[0]))||I.indicator==="reposition/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false"))||I.indicator==="type/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="text"||I.args[0].id==="binary"))||I.indicator==="mode/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="read"||I.args[0].id==="write"||I.args[0].id==="append"))||I.indicator==="eof_action/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="error"||I.args[0].id==="eof_code"||I.args[0].id==="reset"))||I.indicator==="end_of_stream/1"&&(x.type.is_variable(I.args[0])||x.type.is_atom(I.args[0])&&(I.args[0].id==="at"||I.args[0].id==="past"||I.args[0].id==="not")))},is_streamable:function(I){return I.__proto__.stream!==void 0},is_read_option:function(I){return x.type.is_term(I)&&["variables/1","variable_names/1","singletons/1"].indexOf(I.indicator)!==-1},is_write_option:function(I){return x.type.is_term(I)&&(I.indicator==="quoted/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="ignore_ops/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")||I.indicator==="numbervars/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false"))},is_close_option:function(I){return x.type.is_term(I)&&I.indicator==="force/1"&&x.type.is_atom(I.args[0])&&(I.args[0].id==="true"||I.args[0].id==="false")},is_modifiable_flag:function(I){return x.type.is_flag(I)&&x.flag[I.id].changeable},is_module:function(I){return I instanceof q&&I.indicator==="library/1"&&I.args[0]instanceof q&&I.args[0].args.length===0&&x.module[I.args[0].id]!==void 0}},arithmetic:{evaluation:{"e/0":{type_args:null,type_result:!0,fn:function(I){return Math.E}},"pi/0":{type_args:null,type_result:!0,fn:function(I){return Math.PI}},"tau/0":{type_args:null,type_result:!0,fn:function(I){return 2*Math.PI}},"epsilon/0":{type_args:null,type_result:!0,fn:function(I){return Number.EPSILON}},"+/1":{type_args:null,type_result:null,fn:function(I,P){return I}},"-/1":{type_args:null,type_result:null,fn:function(I,P){return-I}},"\\/1":{type_args:!1,type_result:!1,fn:function(I,P){return~I}},"abs/1":{type_args:null,type_result:null,fn:function(I,P){return Math.abs(I)}},"sign/1":{type_args:null,type_result:null,fn:function(I,P){return Math.sign(I)}},"float_integer_part/1":{type_args:!0,type_result:!1,fn:function(I,P){return parseInt(I)}},"float_fractional_part/1":{type_args:!0,type_result:!0,fn:function(I,P){return I-parseInt(I)}},"float/1":{type_args:null,type_result:!0,fn:function(I,P){return parseFloat(I)}},"floor/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.floor(I)}},"truncate/1":{type_args:!0,type_result:!1,fn:function(I,P){return parseInt(I)}},"round/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.round(I)}},"ceiling/1":{type_args:!0,type_result:!1,fn:function(I,P){return Math.ceil(I)}},"sin/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.sin(I)}},"cos/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.cos(I)}},"tan/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.tan(I)}},"asin/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.asin(I)}},"acos/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.acos(I)}},"atan/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.atan(I)}},"atan2/2":{type_args:null,type_result:!0,fn:function(I,P,y){return Math.atan2(I,P)}},"exp/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.exp(I)}},"sqrt/1":{type_args:null,type_result:!0,fn:function(I,P){return Math.sqrt(I)}},"log/1":{type_args:null,type_result:!0,fn:function(I,P){return I>0?Math.log(I):x.error.evaluation("undefined",P.__call_indicator)}},"+/2":{type_args:null,type_result:null,fn:function(I,P,y){return I+P}},"-/2":{type_args:null,type_result:null,fn:function(I,P,y){return I-P}},"*/2":{type_args:null,type_result:null,fn:function(I,P,y){return I*P}},"//2":{type_args:null,type_result:!0,fn:function(I,P,y){return P?I/P:x.error.evaluation("zero_division",y.__call_indicator)}},"///2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?parseInt(I/P):x.error.evaluation("zero_division",y.__call_indicator)}},"**/2":{type_args:null,type_result:!0,fn:function(I,P,y){return Math.pow(I,P)}},"^/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.pow(I,P)}},"<>/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I>>P}},"/\\/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I&P}},"\\//2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I|P}},"xor/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return I^P}},"rem/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?I%P:x.error.evaluation("zero_division",y.__call_indicator)}},"mod/2":{type_args:!1,type_result:!1,fn:function(I,P,y){return P?I-parseInt(I/P)*P:x.error.evaluation("zero_division",y.__call_indicator)}},"max/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.max(I,P)}},"min/2":{type_args:null,type_result:null,fn:function(I,P,y){return Math.min(I,P)}}}},directive:{"dynamic/1":function(I,P){var y=P.args[0];if(x.type.is_variable(y))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_compound(y)||y.indicator!=="//2")I.throw_error(x.error.type("predicate_indicator",y,P.indicator));else if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_atom(y.args[0]))I.throw_error(x.error.type("atom",y.args[0],P.indicator));else if(!x.type.is_integer(y.args[1]))I.throw_error(x.error.type("integer",y.args[1],P.indicator));else{var R=P.args[0].args[0].id+"/"+P.args[0].args[1].value;I.session.public_predicates[R]=!0,I.session.rules[R]||(I.session.rules[R]=[])}},"multifile/1":function(I,P){var y=P.args[0];x.type.is_variable(y)?I.throw_error(x.error.instantiation(P.indicator)):!x.type.is_compound(y)||y.indicator!=="//2"?I.throw_error(x.error.type("predicate_indicator",y,P.indicator)):x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1])?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y.args[0])?x.type.is_integer(y.args[1])?I.session.multifile_predicates[P.args[0].args[0].id+"/"+P.args[0].args[1].value]=!0:I.throw_error(x.error.type("integer",y.args[1],P.indicator)):I.throw_error(x.error.type("atom",y.args[0],P.indicator))},"set_prolog_flag/2":function(I,P){var y=P.args[0],R=P.args[1];x.type.is_variable(y)||x.type.is_variable(R)?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_atom(y)?x.type.is_flag(y)?x.type.is_value_flag(y,R)?x.type.is_modifiable_flag(y)?I.session.flag[y.id]=R:I.throw_error(x.error.permission("modify","flag",y)):I.throw_error(x.error.domain("flag_value",new q("+",[y,R]),P.indicator)):I.throw_error(x.error.domain("prolog_flag",y,P.indicator)):I.throw_error(x.error.type("atom",y,P.indicator))},"use_module/1":function(I,P){var y=P.args[0];if(x.type.is_variable(y))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_term(y))I.throw_error(x.error.type("term",y,P.indicator));else if(x.type.is_module(y)){var R=y.args[0].id;e(I.session.modules,R)===-1&&I.session.modules.push(R)}},"char_conversion/2":function(I,P){var y=P.args[0],R=P.args[1];x.type.is_variable(y)||x.type.is_variable(R)?I.throw_error(x.error.instantiation(P.indicator)):x.type.is_character(y)?x.type.is_character(R)?y.id===R.id?delete I.session.__char_conversion[y.id]:I.session.__char_conversion[y.id]=R.id:I.throw_error(x.error.type("character",R,P.indicator)):I.throw_error(x.error.type("character",y,P.indicator))},"op/3":function(I,P){var y=P.args[0],R=P.args[1],z=P.args[2];if(x.type.is_variable(y)||x.type.is_variable(R)||x.type.is_variable(z))I.throw_error(x.error.instantiation(P.indicator));else if(!x.type.is_integer(y))I.throw_error(x.error.type("integer",y,P.indicator));else if(!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,P.indicator));else if(!x.type.is_atom(z))I.throw_error(x.error.type("atom",z,P.indicator));else if(y.value<0||y.value>1200)I.throw_error(x.error.domain("operator_priority",y,P.indicator));else if(z.id===",")I.throw_error(x.error.permission("modify","operator",z,P.indicator));else if(z.id==="|"&&(y.value<1001||R.id.length!==3))I.throw_error(x.error.permission("modify","operator",z,P.indicator));else if(["fy","fx","yf","xf","xfx","yfx","xfy"].indexOf(R.id)===-1)I.throw_error(x.error.domain("operator_specifier",R,P.indicator));else{var X={prefix:null,infix:null,postfix:null};for(var $ in I.session.__operators)if(I.session.__operators.hasOwnProperty($)){var se=I.session.__operators[$][z.id];se&&(e(se,"fx")!==-1&&(X.prefix={priority:$,type:"fx"}),e(se,"fy")!==-1&&(X.prefix={priority:$,type:"fy"}),e(se,"xf")!==-1&&(X.postfix={priority:$,type:"xf"}),e(se,"yf")!==-1&&(X.postfix={priority:$,type:"yf"}),e(se,"xfx")!==-1&&(X.infix={priority:$,type:"xfx"}),e(se,"xfy")!==-1&&(X.infix={priority:$,type:"xfy"}),e(se,"yfx")!==-1&&(X.infix={priority:$,type:"yfx"}))}var be;switch(R.id){case"fy":case"fx":be="prefix";break;case"yf":case"xf":be="postfix";break;default:be="infix";break}if(((X.prefix&&be==="prefix"||X.postfix&&be==="postfix"||X.infix&&be==="infix")&&X[be].type!==R.id||X.infix&&be==="postfix"||X.postfix&&be==="infix")&&y.value!==0)I.throw_error(x.error.permission("create","operator",z,P.indicator));else return X[be]&&(me(I.session.__operators[X[be].priority][z.id],R.id),I.session.__operators[X[be].priority][z.id].length===0&&delete I.session.__operators[X[be].priority][z.id]),y.value>0&&(I.session.__operators[y.value]||(I.session.__operators[y.value.toString()]={}),I.session.__operators[y.value][z.id]||(I.session.__operators[y.value][z.id]=[]),I.session.__operators[y.value][z.id].push(R.id)),!0}}},predicate:{"op/3":function(I,P,y){x.directive["op/3"](I,y)&&I.success(P)},"current_op/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2],$=[];for(var se in I.session.__operators)for(var be in I.session.__operators[se])for(var Fe=0;Fe/2"){var R=I.points,z=I.session.format_success,X=I.session.format_error;I.session.format_success=function(Fe){return Fe.substitution},I.session.format_error=function(Fe){return Fe.goal},I.points=[new ke(y.args[0].args[0],P.substitution,P)];var $=function(Fe){I.points=R,I.session.format_success=z,I.session.format_error=X,Fe===!1?I.prepend([new ke(P.goal.replace(y.args[1]),P.substitution,P)]):x.type.is_error(Fe)?I.throw_error(Fe.args[0]):Fe===null?(I.prepend([P]),I.__calls.shift()(null)):I.prepend([new ke(P.goal.replace(y.args[0].args[1]).apply(Fe),P.substitution.apply(Fe),P)])};I.__calls.unshift($)}else{var se=new ke(P.goal.replace(y.args[0]),P.substitution,P),be=new ke(P.goal.replace(y.args[1]),P.substitution,P);I.prepend([se,be])}},"!/0":function(I,P,y){var R,z,X=[];for(R=P,z=null;R.parent!==null&&R.parent.goal.search(y);)if(z=R,R=R.parent,R.goal!==null){var $=R.goal.select();if($&&$.id==="call"&&$.search(y)){R=z;break}}for(var se=I.points.length-1;se>=0;se--){for(var be=I.points[se],Fe=be.parent;Fe!==null&&Fe!==R.parent;)Fe=Fe.parent;Fe===null&&Fe!==R.parent&&X.push(be)}I.points=X.reverse(),I.success(P)},"\\+/1":function(I,P,y){var R=y.args[0];x.type.is_variable(R)?I.throw_error(x.error.instantiation(I.level)):x.type.is_callable(R)?I.prepend([new ke(P.goal.replace(new q(",",[new q(",",[new q("call",[R]),new q("!",[])]),new q("fail",[])])),P.substitution,P),new ke(P.goal.replace(null),P.substitution,P)]):I.throw_error(x.error.type("callable",R,I.level))},"->/2":function(I,P,y){var R=P.goal.replace(new q(",",[y.args[0],new q(",",[new q("!"),y.args[1]])]));I.prepend([new ke(R,P.substitution,P)])},"fail/0":function(I,P,y){},"false/0":function(I,P,y){},"true/0":function(I,P,y){I.success(P)},"call/1":ie(1),"call/2":ie(2),"call/3":ie(3),"call/4":ie(4),"call/5":ie(5),"call/6":ie(6),"call/7":ie(7),"call/8":ie(8),"once/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("call",[R]),new q("!",[])])),P.substitution,P)])},"forall/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("\\+",[new q(",",[new q("call",[R]),new q("\\+",[new q("call",[z])])])])),P.substitution,P)])},"repeat/0":function(I,P,y){I.prepend([new ke(P.goal.replace(null),P.substitution,P),P])},"throw/1":function(I,P,y){x.type.is_variable(y.args[0])?I.throw_error(x.error.instantiation(I.level)):I.throw_error(y.args[0])},"catch/3":function(I,P,y){var R=I.points;I.points=[],I.prepend([new ke(y.args[0],P.substitution,P)]);var z=I.session.format_success,X=I.session.format_error;I.session.format_success=function(se){return se.substitution},I.session.format_error=function(se){return se.goal};var $=function(se){var be=I.points;if(I.points=R,I.session.format_success=z,I.session.format_error=X,x.type.is_error(se)){for(var Fe=[],lt=I.points.length-1;lt>=0;lt--){for(var nr=I.points[lt],Et=nr.parent;Et!==null&&Et!==P.parent;)Et=Et.parent;Et===null&&Et!==P.parent&&Fe.push(nr)}I.points=Fe;var qt=I.get_flag("occurs_check").indicator==="true/0",nr=new ke,Pt=x.unify(se.args[0],y.args[1],qt);Pt!==null?(nr.substitution=P.substitution.apply(Pt),nr.goal=P.goal.replace(y.args[2]).apply(Pt),nr.parent=P,I.prepend([nr])):I.throw_error(se.args[0])}else if(se!==!1){for(var cn=se===null?[]:[new ke(P.goal.apply(se).replace(null),P.substitution.apply(se),P)],Sr=[],lt=be.length-1;lt>=0;lt--){Sr.push(be[lt]);var yr=be[lt].goal!==null?be[lt].goal.select():null;if(x.type.is_term(yr)&&yr.indicator==="!/0")break}var Rr=o(Sr,function(Xr){return Xr.goal===null&&(Xr.goal=new q("true",[])),Xr=new ke(P.goal.replace(new q("catch",[Xr.goal,y.args[1],y.args[2]])),P.substitution.apply(Xr.substitution),Xr.parent),Xr.exclude=y.args[0].variables(),Xr}).reverse();I.prepend(Rr),I.prepend(cn),se===null&&(this.current_limit=0,I.__calls.shift()(null))}};I.__calls.unshift($)},"=/2":function(I,P,y){var R=I.get_flag("occurs_check").indicator==="true/0",z=new ke,X=x.unify(y.args[0],y.args[1],R);X!==null&&(z.goal=P.goal.apply(X).replace(null),z.substitution=P.substitution.apply(X),z.parent=P,I.prepend([z]))},"unify_with_occurs_check/2":function(I,P,y){var R=new ke,z=x.unify(y.args[0],y.args[1],!0);z!==null&&(R.goal=P.goal.apply(z).replace(null),R.substitution=P.substitution.apply(z),R.parent=P,I.prepend([R]))},"\\=/2":function(I,P,y){var R=I.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[0],y.args[1],R);z===null&&I.success(P)},"subsumes_term/2":function(I,P,y){var R=I.get_flag("occurs_check").indicator==="true/0",z=x.unify(y.args[1],y.args[0],R);z!==null&&y.args[1].apply(z).equals(y.args[1])&&I.success(P)},"findall/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(z))I.throw_error(x.error.type("callable",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=I.next_free_variable(),se=new q(",",[z,new q("=",[$,R])]),be=I.points,Fe=I.session.limit,lt=I.session.format_success;I.session.format_success=function(nr){return nr.substitution},I.add_goal(se,!0,P);var Et=[],qt=function(nr){if(nr!==!1&&nr!==null&&!x.type.is_error(nr))I.__calls.unshift(qt),Et.push(nr.links[$.id]),I.session.limit=I.current_limit;else if(I.points=be,I.session.limit=Fe,I.session.format_success=lt,x.type.is_error(nr))I.throw_error(nr.args[0]);else if(I.current_limit>0){for(var Pt=new q("[]"),cn=Et.length-1;cn>=0;cn--)Pt=new q(".",[Et[cn],Pt]);I.prepend([new ke(P.goal.replace(new q("=",[X,Pt])),P.substitution,P)])}};I.__calls.unshift(qt)}},"bagof/3":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))I.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))I.throw_error(x.error.type("list",$,y.indicator));else{var se=I.next_free_variable(),be;X.indicator==="^/2"?(be=X.args[0].variables(),X=X.args[1]):be=[],be=be.concat(z.variables());for(var Fe=X.variables().filter(function(Rr){return e(be,Rr)===-1}),lt=new q("[]"),Et=Fe.length-1;Et>=0;Et--)lt=new q(".",[new Se(Fe[Et]),lt]);var qt=new q(",",[X,new q("=",[se,new q(",",[lt,z])])]),nr=I.points,Pt=I.session.limit,cn=I.session.format_success;I.session.format_success=function(Rr){return Rr.substitution},I.add_goal(qt,!0,P);var Sr=[],yr=function(Rr){if(Rr!==!1&&Rr!==null&&!x.type.is_error(Rr)){I.__calls.unshift(yr);var Xr=!1,$n=Rr.links[se.id].args[0],Xs=Rr.links[se.id].args[1];for(var Hi in Sr)if(Sr.hasOwnProperty(Hi)){var Qs=Sr[Hi];if(Qs.variables.equals($n)){Qs.answers.push(Xs),Xr=!0;break}}Xr||Sr.push({variables:$n,answers:[Xs]}),I.session.limit=I.current_limit}else if(I.points=nr,I.session.limit=Pt,I.session.format_success=cn,x.type.is_error(Rr))I.throw_error(Rr.args[0]);else if(I.current_limit>0){for(var Zs=[],bi=0;bi=0;$s--)Fs=new q(".",[Rr[$s],Fs]);Zs.push(new ke(P.goal.replace(new q(",",[new q("=",[lt,Sr[bi].variables]),new q("=",[$,Fs])])),P.substitution,P))}I.prepend(Zs)}};I.__calls.unshift(yr)}},"setof/3":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(X))I.throw_error(x.error.type("callable",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_list($))I.throw_error(x.error.type("list",$,y.indicator));else{var se=I.next_free_variable(),be;X.indicator==="^/2"?(be=X.args[0].variables(),X=X.args[1]):be=[],be=be.concat(z.variables());for(var Fe=X.variables().filter(function(Rr){return e(be,Rr)===-1}),lt=new q("[]"),Et=Fe.length-1;Et>=0;Et--)lt=new q(".",[new Se(Fe[Et]),lt]);var qt=new q(",",[X,new q("=",[se,new q(",",[lt,z])])]),nr=I.points,Pt=I.session.limit,cn=I.session.format_success;I.session.format_success=function(Rr){return Rr.substitution},I.add_goal(qt,!0,P);var Sr=[],yr=function(Rr){if(Rr!==!1&&Rr!==null&&!x.type.is_error(Rr)){I.__calls.unshift(yr);var Xr=!1,$n=Rr.links[se.id].args[0],Xs=Rr.links[se.id].args[1];for(var Hi in Sr)if(Sr.hasOwnProperty(Hi)){var Qs=Sr[Hi];if(Qs.variables.equals($n)){Qs.answers.push(Xs),Xr=!0;break}}Xr||Sr.push({variables:$n,answers:[Xs]}),I.session.limit=I.current_limit}else if(I.points=nr,I.session.limit=Pt,I.session.format_success=cn,x.type.is_error(Rr))I.throw_error(Rr.args[0]);else if(I.current_limit>0){for(var Zs=[],bi=0;bi=0;$s--)Fs=new q(".",[Rr[$s],Fs]);Zs.push(new ke(P.goal.replace(new q(",",[new q("=",[lt,Sr[bi].variables]),new q("=",[$,Fs])])),P.substitution,P))}I.prepend(Zs)}};I.__calls.unshift(yr)}},"functor/3":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2];if(x.type.is_variable(z)&&(x.type.is_variable(X)||x.type.is_variable($)))I.throw_error(x.error.instantiation("functor/3"));else if(!x.type.is_variable($)&&!x.type.is_integer($))I.throw_error(x.error.type("integer",y.args[2],"functor/3"));else if(!x.type.is_variable(X)&&!x.type.is_atomic(X))I.throw_error(x.error.type("atomic",y.args[1],"functor/3"));else if(x.type.is_integer(X)&&x.type.is_integer($)&&$.value!==0)I.throw_error(x.error.type("atom",y.args[1],"functor/3"));else if(x.type.is_variable(z)){if(y.args[2].value>=0){for(var se=[],be=0;be<$.value;be++)se.push(I.next_free_variable());var Fe=x.type.is_integer(X)?X:new q(X.id,se);I.prepend([new ke(P.goal.replace(new q("=",[z,Fe])),P.substitution,P)])}}else{var lt=x.type.is_integer(z)?z:new q(z.id,[]),Et=x.type.is_integer(z)?new Re(0,!1):new Re(z.args.length,!1),qt=new q(",",[new q("=",[lt,X]),new q("=",[Et,$])]);I.prepend([new ke(P.goal.replace(qt),P.substitution,P)])}},"arg/3":function(I,P,y){if(x.type.is_variable(y.args[0])||x.type.is_variable(y.args[1]))I.throw_error(x.error.instantiation(y.indicator));else if(y.args[0].value<0)I.throw_error(x.error.domain("not_less_than_zero",y.args[0],y.indicator));else if(!x.type.is_compound(y.args[1]))I.throw_error(x.error.type("compound",y.args[1],y.indicator));else{var R=y.args[0].value;if(R>0&&R<=y.args[1].args.length){var z=new q("=",[y.args[1].args[R-1],y.args[2]]);I.prepend([new ke(P.goal.replace(z),P.substitution,P)])}}},"=../2":function(I,P,y){var R;if(x.type.is_variable(y.args[0])&&(x.type.is_variable(y.args[1])||x.type.is_non_empty_list(y.args[1])&&x.type.is_variable(y.args[1].args[0])))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_fully_list(y.args[1]))I.throw_error(x.error.type("list",y.args[1],y.indicator));else if(x.type.is_variable(y.args[0])){if(!x.type.is_variable(y.args[1])){var X=[];for(R=y.args[1].args[1];R.indicator==="./2";)X.push(R.args[0]),R=R.args[1];x.type.is_variable(y.args[0])&&x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):X.length===0&&x.type.is_compound(y.args[1].args[0])?I.throw_error(x.error.type("atomic",y.args[1].args[0],y.indicator)):X.length>0&&(x.type.is_compound(y.args[1].args[0])||x.type.is_number(y.args[1].args[0]))?I.throw_error(x.error.type("atom",y.args[1].args[0],y.indicator)):X.length===0?I.prepend([new ke(P.goal.replace(new q("=",[y.args[1].args[0],y.args[0]],P)),P.substitution,P)]):I.prepend([new ke(P.goal.replace(new q("=",[new q(y.args[1].args[0].id,X),y.args[0]])),P.substitution,P)])}}else{if(x.type.is_atomic(y.args[0]))R=new q(".",[y.args[0],new q("[]")]);else{R=new q("[]");for(var z=y.args[0].args.length-1;z>=0;z--)R=new q(".",[y.args[0].args[z],R]);R=new q(".",[new q(y.args[0].id),R])}I.prepend([new ke(P.goal.replace(new q("=",[R,y.args[1]])),P.substitution,P)])}},"copy_term/2":function(I,P,y){var R=y.args[0].rename(I);I.prepend([new ke(P.goal.replace(new q("=",[R,y.args[1]])),P.substitution,P.parent)])},"term_variables/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(!x.type.is_fully_list(z))I.throw_error(x.error.type("list",z,y.indicator));else{var X=g(o(Ce(R.variables()),function($){return new Se($)}));I.prepend([new ke(P.goal.replace(new q("=",[z,X])),P.substitution,P)])}},"clause/2":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_callable(y.args[1]))I.throw_error(x.error.type("callable",y.args[1],y.indicator));else if(I.session.rules[y.args[0].indicator]!==void 0)if(I.is_public_predicate(y.args[0].indicator)){var R=[];for(var z in I.session.rules[y.args[0].indicator])if(I.session.rules[y.args[0].indicator].hasOwnProperty(z)){var X=I.session.rules[y.args[0].indicator][z];I.session.renamed_variables={},X=X.rename(I),X.body===null&&(X.body=new q("true"));var $=new q(",",[new q("=",[X.head,y.args[0]]),new q("=",[X.body,y.args[1]])]);R.push(new ke(P.goal.replace($),P.substitution,P))}I.prepend(R)}else I.throw_error(x.error.permission("access","private_procedure",y.args[0].indicator,y.indicator))},"current_predicate/1":function(I,P,y){var R=y.args[0];if(!x.type.is_variable(R)&&(!x.type.is_compound(R)||R.indicator!=="//2"))I.throw_error(x.error.type("predicate_indicator",R,y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_variable(R.args[0])&&!x.type.is_atom(R.args[0]))I.throw_error(x.error.type("atom",R.args[0],y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_variable(R.args[1])&&!x.type.is_integer(R.args[1]))I.throw_error(x.error.type("integer",R.args[1],y.indicator));else{var z=[];for(var X in I.session.rules)if(I.session.rules.hasOwnProperty(X)){var $=X.lastIndexOf("/"),se=X.substr(0,$),be=parseInt(X.substr($+1,X.length-($+1))),Fe=new q("/",[new q(se),new Re(be,!1)]),lt=new q("=",[Fe,R]);z.push(new ke(P.goal.replace(lt),P.substitution,P))}I.prepend(z)}},"asserta/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var R,z;y.args[0].indicator===":-/2"?(R=y.args[0].args[0],z=Ee(y.args[0].args[1])):(R=y.args[0],z=null),x.type.is_callable(R)?z!==null&&!x.type.is_callable(z)?I.throw_error(x.error.type("callable",z,y.indicator)):I.is_public_predicate(R.indicator)?(I.session.rules[R.indicator]===void 0&&(I.session.rules[R.indicator]=[]),I.session.public_predicates[R.indicator]=!0,I.session.rules[R.indicator]=[new Ke(R,z,!0)].concat(I.session.rules[R.indicator]),I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",R.indicator,y.indicator)):I.throw_error(x.error.type("callable",R,y.indicator))}},"assertz/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var R,z;y.args[0].indicator===":-/2"?(R=y.args[0].args[0],z=Ee(y.args[0].args[1])):(R=y.args[0],z=null),x.type.is_callable(R)?z!==null&&!x.type.is_callable(z)?I.throw_error(x.error.type("callable",z,y.indicator)):I.is_public_predicate(R.indicator)?(I.session.rules[R.indicator]===void 0&&(I.session.rules[R.indicator]=[]),I.session.public_predicates[R.indicator]=!0,I.session.rules[R.indicator].push(new Ke(R,z,!0)),I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",R.indicator,y.indicator)):I.throw_error(x.error.type("callable",R,y.indicator))}},"retract/1":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_callable(y.args[0]))I.throw_error(x.error.type("callable",y.args[0],y.indicator));else{var R,z;if(y.args[0].indicator===":-/2"?(R=y.args[0].args[0],z=y.args[0].args[1]):(R=y.args[0],z=new q("true")),typeof P.retract>"u")if(I.is_public_predicate(R.indicator)){if(I.session.rules[R.indicator]!==void 0){for(var X=[],$=0;$I.get_flag("max_arity").value)I.throw_error(x.error.representation("max_arity",y.indicator));else{var R=y.args[0].args[0].id+"/"+y.args[0].args[1].value;I.is_public_predicate(R)?(delete I.session.rules[R],I.success(P)):I.throw_error(x.error.permission("modify","static_procedure",R,y.indicator))}},"atom_length/2":function(I,P,y){if(x.type.is_variable(y.args[0]))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_atom(y.args[0]))I.throw_error(x.error.type("atom",y.args[0],y.indicator));else if(!x.type.is_variable(y.args[1])&&!x.type.is_integer(y.args[1]))I.throw_error(x.error.type("integer",y.args[1],y.indicator));else if(x.type.is_integer(y.args[1])&&y.args[1].value<0)I.throw_error(x.error.domain("not_less_than_zero",y.args[1],y.indicator));else{var R=new Re(y.args[0].id.length,!1);I.prepend([new ke(P.goal.replace(new q("=",[R,y.args[1]])),P.substitution,P)])}},"atom_concat/3":function(I,P,y){var R,z,X=y.args[0],$=y.args[1],se=y.args[2];if(x.type.is_variable(se)&&(x.type.is_variable(X)||x.type.is_variable($)))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))I.throw_error(x.error.type("atom",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_atom($))I.throw_error(x.error.type("atom",$,y.indicator));else if(!x.type.is_variable(se)&&!x.type.is_atom(se))I.throw_error(x.error.type("atom",se,y.indicator));else{var be=x.type.is_variable(X),Fe=x.type.is_variable($);if(!be&&!Fe)z=new q("=",[se,new q(X.id+$.id)]),I.prepend([new ke(P.goal.replace(z),P.substitution,P)]);else if(be&&!Fe)R=se.id.substr(0,se.id.length-$.id.length),R+$.id===se.id&&(z=new q("=",[X,new q(R)]),I.prepend([new ke(P.goal.replace(z),P.substitution,P)]));else if(Fe&&!be)R=se.id.substr(X.id.length),X.id+R===se.id&&(z=new q("=",[$,new q(R)]),I.prepend([new ke(P.goal.replace(z),P.substitution,P)]));else{for(var lt=[],Et=0;Et<=se.id.length;Et++){var qt=new q(se.id.substr(0,Et)),nr=new q(se.id.substr(Et));z=new q(",",[new q("=",[qt,X]),new q("=",[nr,$])]),lt.push(new ke(P.goal.replace(z),P.substitution,P))}I.prepend(lt)}}},"sub_atom/5":function(I,P,y){var R,z=y.args[0],X=y.args[1],$=y.args[2],se=y.args[3],be=y.args[4];if(x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))I.throw_error(x.error.type("integer",X,y.indicator));else if(!x.type.is_variable($)&&!x.type.is_integer($))I.throw_error(x.error.type("integer",$,y.indicator));else if(!x.type.is_variable(se)&&!x.type.is_integer(se))I.throw_error(x.error.type("integer",se,y.indicator));else if(x.type.is_integer(X)&&X.value<0)I.throw_error(x.error.domain("not_less_than_zero",X,y.indicator));else if(x.type.is_integer($)&&$.value<0)I.throw_error(x.error.domain("not_less_than_zero",$,y.indicator));else if(x.type.is_integer(se)&&se.value<0)I.throw_error(x.error.domain("not_less_than_zero",se,y.indicator));else{var Fe=[],lt=[],Et=[];if(x.type.is_variable(X))for(R=0;R<=z.id.length;R++)Fe.push(R);else Fe.push(X.value);if(x.type.is_variable($))for(R=0;R<=z.id.length;R++)lt.push(R);else lt.push($.value);if(x.type.is_variable(se))for(R=0;R<=z.id.length;R++)Et.push(R);else Et.push(se.value);var qt=[];for(var nr in Fe)if(Fe.hasOwnProperty(nr)){R=Fe[nr];for(var Pt in lt)if(lt.hasOwnProperty(Pt)){var cn=lt[Pt],Sr=z.id.length-R-cn;if(e(Et,Sr)!==-1&&R+cn+Sr===z.id.length){var yr=z.id.substr(R,cn);if(z.id===z.id.substr(0,R)+yr+z.id.substr(R+cn,Sr)){var Rr=new q("=",[new q(yr),be]),Xr=new q("=",[X,new Re(R)]),$n=new q("=",[$,new Re(cn)]),Xs=new q("=",[se,new Re(Sr)]),Hi=new q(",",[new q(",",[new q(",",[Xr,$n]),Xs]),Rr]);qt.push(new ke(P.goal.replace(Hi),P.substitution,P))}}}}I.prepend(qt)}},"atom_chars/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(x.type.is_variable(R)&&x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(x.type.is_variable(R)){for(var se=z,be=x.type.is_variable(R),Fe="";se.indicator==="./2";){if(x.type.is_character(se.args[0]))Fe+=se.args[0].id;else if(x.type.is_variable(se.args[0])&&be){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.type("character",se.args[0],y.indicator));return}se=se.args[1]}x.type.is_variable(se)&&be?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(se)&&!x.type.is_variable(se)?I.throw_error(x.error.type("list",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[new q(Fe),R])),P.substitution,P)])}else{for(var X=new q("[]"),$=R.id.length-1;$>=0;$--)X=new q(".",[new q(R.id.charAt($)),X]);I.prepend([new ke(P.goal.replace(new q("=",[z,X])),P.substitution,P)])}},"atom_codes/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(x.type.is_variable(R)&&x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(x.type.is_variable(R)){for(var se=z,be=x.type.is_variable(R),Fe="";se.indicator==="./2";){if(x.type.is_character_code(se.args[0]))Fe+=u(se.args[0].value);else if(x.type.is_variable(se.args[0])&&be){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.representation("character_code",y.indicator));return}se=se.args[1]}x.type.is_variable(se)&&be?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_empty_list(se)&&!x.type.is_variable(se)?I.throw_error(x.error.type("list",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[new q(Fe),R])),P.substitution,P)])}else{for(var X=new q("[]"),$=R.id.length-1;$>=0;$--)X=new q(".",[new Re(n(R.id,$),!1),X]);I.prepend([new ke(P.goal.replace(new q("=",[z,X])),P.substitution,P)])}},"char_code/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(x.type.is_variable(R)&&x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_character(R))I.throw_error(x.error.type("character",R,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_integer(z))I.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_character_code(z))I.throw_error(x.error.representation("character_code",y.indicator));else if(x.type.is_variable(z)){var X=new Re(n(R.id,0),!1);I.prepend([new ke(P.goal.replace(new q("=",[X,z])),P.substitution,P)])}else{var $=new q(u(z.value));I.prepend([new ke(P.goal.replace(new q("=",[$,R])),P.substitution,P)])}},"number_chars/2":function(I,P,y){var R,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))I.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(X)){var se=X,be=!0;for(R="";se.indicator==="./2";){if(x.type.is_character(se.args[0]))R+=se.args[0].id;else if(x.type.is_variable(se.args[0]))be=!1;else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.type("character",se.args[0],y.indicator));return}se=se.args[1]}if(be=be&&x.type.is_empty_list(se),!x.type.is_empty_list(se)&&!x.type.is_variable(se)){I.throw_error(x.error.type("list",X,y.indicator));return}if(!be&&$){I.throw_error(x.error.instantiation(y.indicator));return}else if(be)if(x.type.is_variable(se)&&$){I.throw_error(x.error.instantiation(y.indicator));return}else{var Fe=I.parse(R),lt=Fe.value;!x.type.is_number(lt)||Fe.tokens[Fe.tokens.length-1].space?I.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,lt])),P.substitution,P)]);return}}if(!$){R=z.toString();for(var Et=new q("[]"),qt=R.length-1;qt>=0;qt--)Et=new q(".",[new q(R.charAt(qt)),Et]);I.prepend([new ke(P.goal.replace(new q("=",[X,Et])),P.substitution,P)])}}},"number_codes/2":function(I,P,y){var R,z=y.args[0],X=y.args[1];if(x.type.is_variable(z)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(z)&&!x.type.is_number(z))I.throw_error(x.error.type("number",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else{var $=x.type.is_variable(z);if(!x.type.is_variable(X)){var se=X,be=!0;for(R="";se.indicator==="./2";){if(x.type.is_character_code(se.args[0]))R+=u(se.args[0].value);else if(x.type.is_variable(se.args[0]))be=!1;else if(!x.type.is_variable(se.args[0])){I.throw_error(x.error.type("character_code",se.args[0],y.indicator));return}se=se.args[1]}if(be=be&&x.type.is_empty_list(se),!x.type.is_empty_list(se)&&!x.type.is_variable(se)){I.throw_error(x.error.type("list",X,y.indicator));return}if(!be&&$){I.throw_error(x.error.instantiation(y.indicator));return}else if(be)if(x.type.is_variable(se)&&$){I.throw_error(x.error.instantiation(y.indicator));return}else{var Fe=I.parse(R),lt=Fe.value;!x.type.is_number(lt)||Fe.tokens[Fe.tokens.length-1].space?I.throw_error(x.error.syntax_by_predicate("parseable_number",y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,lt])),P.substitution,P)]);return}}if(!$){R=z.toString();for(var Et=new q("[]"),qt=R.length-1;qt>=0;qt--)Et=new q(".",[new Re(n(R,qt),!1),Et]);I.prepend([new ke(P.goal.replace(new q("=",[X,Et])),P.substitution,P)])}}},"upcase_atom/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(R)?!x.type.is_variable(z)&&!x.type.is_atom(z)?I.throw_error(x.error.type("atom",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,new q(R.id.toUpperCase(),[])])),P.substitution,P)]):I.throw_error(x.error.type("atom",R,y.indicator))},"downcase_atom/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(R)?!x.type.is_variable(z)&&!x.type.is_atom(z)?I.throw_error(x.error.type("atom",z,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[z,new q(R.id.toLowerCase(),[])])),P.substitution,P)]):I.throw_error(x.error.type("atom",R,y.indicator))},"atomic_list_concat/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("atomic_list_concat",[R,new q("",[]),z])),P.substitution,P)])},"atomic_list_concat/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(z)||x.type.is_variable(R)&&x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_list(R))I.throw_error(x.error.type("list",R,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_atom(X))I.throw_error(x.error.type("atom",X,y.indicator));else if(x.type.is_variable(X)){for(var se="",be=R;x.type.is_term(be)&&be.indicator==="./2";){if(!x.type.is_atom(be.args[0])&&!x.type.is_number(be.args[0])){I.throw_error(x.error.type("atomic",be.args[0],y.indicator));return}se!==""&&(se+=z.id),x.type.is_atom(be.args[0])?se+=be.args[0].id:se+=""+be.args[0].value,be=be.args[1]}se=new q(se,[]),x.type.is_variable(be)?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_term(be)||be.indicator!=="[]/0"?I.throw_error(x.error.type("list",R,y.indicator)):I.prepend([new ke(P.goal.replace(new q("=",[se,X])),P.substitution,P)])}else{var $=g(o(X.id.split(z.id),function(Fe){return new q(Fe,[])}));I.prepend([new ke(P.goal.replace(new q("=",[$,R])),P.substitution,P)])}},"@=/2":function(I,P,y){x.compare(y.args[0],y.args[1])>0&&I.success(P)},"@>=/2":function(I,P,y){x.compare(y.args[0],y.args[1])>=0&&I.success(P)},"compare/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(x.type.is_atom(R)&&["<",">","="].indexOf(R.id)===-1)I.throw_error(x.type.domain("order",R,y.indicator));else{var $=x.compare(z,X);$=$===0?"=":$===-1?"<":">",I.prepend([new ke(P.goal.replace(new q("=",[R,new q($,[])])),P.substitution,P)])}},"is/2":function(I,P,y){var R=y.args[1].interpret(I);x.type.is_number(R)?I.prepend([new ke(P.goal.replace(new q("=",[y.args[0],R],I.level)),P.substitution,P)]):I.throw_error(R)},"between/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2];if(x.type.is_variable(R)||x.type.is_variable(z))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_integer(R))I.throw_error(x.error.type("integer",R,y.indicator));else if(!x.type.is_integer(z))I.throw_error(x.error.type("integer",z,y.indicator));else if(!x.type.is_variable(X)&&!x.type.is_integer(X))I.throw_error(x.error.type("integer",X,y.indicator));else if(x.type.is_variable(X)){var $=[new ke(P.goal.replace(new q("=",[X,R])),P.substitution,P)];R.value=X.value&&I.success(P)},"succ/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)&&x.type.is_variable(z)?I.throw_error(x.error.instantiation(y.indicator)):!x.type.is_variable(R)&&!x.type.is_integer(R)?I.throw_error(x.error.type("integer",R,y.indicator)):!x.type.is_variable(z)&&!x.type.is_integer(z)?I.throw_error(x.error.type("integer",z,y.indicator)):!x.type.is_variable(R)&&R.value<0?I.throw_error(x.error.domain("not_less_than_zero",R,y.indicator)):!x.type.is_variable(z)&&z.value<0?I.throw_error(x.error.domain("not_less_than_zero",z,y.indicator)):(x.type.is_variable(z)||z.value>0)&&(x.type.is_variable(R)?I.prepend([new ke(P.goal.replace(new q("=",[R,new Re(z.value-1,!1)])),P.substitution,P)]):I.prepend([new ke(P.goal.replace(new q("=",[z,new Re(R.value+1,!1)])),P.substitution,P)]))},"=:=/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R===0&&I.success(P)},"=\\=/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R!==0&&I.success(P)},"/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R>0&&I.success(P)},">=/2":function(I,P,y){var R=x.arithmetic_compare(I,y.args[0],y.args[1]);x.type.is_term(R)?I.throw_error(R):R>=0&&I.success(P)},"var/1":function(I,P,y){x.type.is_variable(y.args[0])&&I.success(P)},"atom/1":function(I,P,y){x.type.is_atom(y.args[0])&&I.success(P)},"atomic/1":function(I,P,y){x.type.is_atomic(y.args[0])&&I.success(P)},"compound/1":function(I,P,y){x.type.is_compound(y.args[0])&&I.success(P)},"integer/1":function(I,P,y){x.type.is_integer(y.args[0])&&I.success(P)},"float/1":function(I,P,y){x.type.is_float(y.args[0])&&I.success(P)},"number/1":function(I,P,y){x.type.is_number(y.args[0])&&I.success(P)},"nonvar/1":function(I,P,y){x.type.is_variable(y.args[0])||I.success(P)},"ground/1":function(I,P,y){y.variables().length===0&&I.success(P)},"acyclic_term/1":function(I,P,y){for(var R=P.substitution.apply(P.substitution),z=y.args[0].variables(),X=0;X0?Pt[Pt.length-1]:null,Pt!==null&&(qt=J(I,Pt,0,I.__get_max_priority(),!1))}if(qt.type===p&&qt.len===Pt.length-1&&cn.value==="."){qt=qt.value.rename(I);var Sr=new q("=",[z,qt]);if(se.variables){var yr=g(o(Ce(qt.variables()),function(Rr){return new Se(Rr)}));Sr=new q(",",[Sr,new q("=",[se.variables,yr])])}if(se.variable_names){var yr=g(o(Ce(qt.variables()),function(Xr){var $n;for($n in I.session.renamed_variables)if(I.session.renamed_variables.hasOwnProperty($n)&&I.session.renamed_variables[$n]===Xr)break;return new q("=",[new q($n,[]),new Se(Xr)])}));Sr=new q(",",[Sr,new q("=",[se.variable_names,yr])])}if(se.singletons){var yr=g(o(new Ke(qt,null).singleton_variables(),function(Xr){var $n;for($n in I.session.renamed_variables)if(I.session.renamed_variables.hasOwnProperty($n)&&I.session.renamed_variables[$n]===Xr)break;return new q("=",[new q($n,[]),new Se(Xr)])}));Sr=new q(",",[Sr,new q("=",[se.singletons,yr])])}I.prepend([new ke(P.goal.replace(Sr),P.substitution,P)])}else qt.type===p?I.throw_error(x.error.syntax(Pt[qt.len],"unexpected token",!1)):I.throw_error(qt.value)}}},"write/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("write",[new Se("S"),R])])),P.substitution,P)])},"write/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("write_term",[R,z,new q(".",[new q("quoted",[new q("false",[])]),new q(".",[new q("ignore_ops",[new q("false")]),new q(".",[new q("numbervars",[new q("true")]),new q("[]",[])])])])])),P.substitution,P)])},"writeq/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("writeq",[new Se("S"),R])])),P.substitution,P)])},"writeq/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("write_term",[R,z,new q(".",[new q("quoted",[new q("true",[])]),new q(".",[new q("ignore_ops",[new q("false")]),new q(".",[new q("numbervars",[new q("true")]),new q("[]",[])])])])])),P.substitution,P)])},"write_canonical/1":function(I,P,y){var R=y.args[0];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("write_canonical",[new Se("S"),R])])),P.substitution,P)])},"write_canonical/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q("write_term",[R,z,new q(".",[new q("quoted",[new q("true",[])]),new q(".",[new q("ignore_ops",[new q("true")]),new q(".",[new q("numbervars",[new q("false")]),new q("[]",[])])])])])),P.substitution,P)])},"write_term/2":function(I,P,y){var R=y.args[0],z=y.args[1];I.prepend([new ke(P.goal.replace(new q(",",[new q("current_output",[new Se("S")]),new q("write_term",[new Se("S"),R,z])])),P.substitution,P)])},"write_term/3":function(I,P,y){var R=y.args[0],z=y.args[1],X=y.args[2],$=x.type.is_stream(R)?R:I.get_stream_by_alias(R.id);if(x.type.is_variable(R)||x.type.is_variable(X))I.throw_error(x.error.instantiation(y.indicator));else if(!x.type.is_list(X))I.throw_error(x.error.type("list",X,y.indicator));else if(!x.type.is_stream(R)&&!x.type.is_atom(R))I.throw_error(x.error.domain("stream_or_alias",R,y.indicator));else if(!x.type.is_stream($)||$.stream===null)I.throw_error(x.error.existence("stream",R,y.indicator));else if($.input)I.throw_error(x.error.permission("output","stream",R,y.indicator));else if($.type==="binary")I.throw_error(x.error.permission("output","binary_stream",R,y.indicator));else if($.position==="past_end_of_stream"&&$.eof_action==="error")I.throw_error(x.error.permission("output","past_end_of_stream",R,y.indicator));else{for(var se={},be=X,Fe;x.type.is_term(be)&&be.indicator==="./2";){if(Fe=be.args[0],x.type.is_variable(Fe)){I.throw_error(x.error.instantiation(y.indicator));return}else if(!x.type.is_write_option(Fe)){I.throw_error(x.error.domain("write_option",Fe,y.indicator));return}se[Fe.id]=Fe.args[0].id==="true",be=be.args[1]}if(be.indicator!=="[]/0"){x.type.is_variable(be)?I.throw_error(x.error.instantiation(y.indicator)):I.throw_error(x.error.type("list",X,y.indicator));return}else{se.session=I.session;var lt=z.toString(se);$.stream.put(lt,$.position),typeof $.position=="number"&&($.position+=lt.length),I.success(P)}}},"halt/0":function(I,P,y){I.points=[]},"halt/1":function(I,P,y){var R=y.args[0];x.type.is_variable(R)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_integer(R)?I.points=[]:I.throw_error(x.error.type("integer",R,y.indicator))},"current_prolog_flag/2":function(I,P,y){var R=y.args[0],z=y.args[1];if(!x.type.is_variable(R)&&!x.type.is_atom(R))I.throw_error(x.error.type("atom",R,y.indicator));else if(!x.type.is_variable(R)&&!x.type.is_flag(R))I.throw_error(x.error.domain("prolog_flag",R,y.indicator));else{var X=[];for(var $ in x.flag)if(x.flag.hasOwnProperty($)){var se=new q(",",[new q("=",[new q($),R]),new q("=",[I.get_flag($),z])]);X.push(new ke(P.goal.replace(se),P.substitution,P))}I.prepend(X)}},"set_prolog_flag/2":function(I,P,y){var R=y.args[0],z=y.args[1];x.type.is_variable(R)||x.type.is_variable(z)?I.throw_error(x.error.instantiation(y.indicator)):x.type.is_atom(R)?x.type.is_flag(R)?x.type.is_value_flag(R,z)?x.type.is_modifiable_flag(R)?(I.session.flag[R.id]=z,I.success(P)):I.throw_error(x.error.permission("modify","flag",R)):I.throw_error(x.error.domain("flag_value",new q("+",[R,z]),y.indicator)):I.throw_error(x.error.domain("prolog_flag",R,y.indicator)):I.throw_error(x.error.type("atom",R,y.indicator))}},flag:{bounded:{allowed:[new q("true"),new q("false")],value:new q("true"),changeable:!1},max_integer:{allowed:[new Re(Number.MAX_SAFE_INTEGER)],value:new Re(Number.MAX_SAFE_INTEGER),changeable:!1},min_integer:{allowed:[new Re(Number.MIN_SAFE_INTEGER)],value:new Re(Number.MIN_SAFE_INTEGER),changeable:!1},integer_rounding_function:{allowed:[new q("down"),new q("toward_zero")],value:new q("toward_zero"),changeable:!1},char_conversion:{allowed:[new q("on"),new q("off")],value:new q("on"),changeable:!0},debug:{allowed:[new q("on"),new q("off")],value:new q("off"),changeable:!0},max_arity:{allowed:[new q("unbounded")],value:new q("unbounded"),changeable:!1},unknown:{allowed:[new q("error"),new q("fail"),new q("warning")],value:new q("error"),changeable:!0},double_quotes:{allowed:[new q("chars"),new q("codes"),new q("atom")],value:new q("codes"),changeable:!0},occurs_check:{allowed:[new q("false"),new q("true")],value:new q("false"),changeable:!0},dialect:{allowed:[new q("tau")],value:new q("tau"),changeable:!1},version_data:{allowed:[new q("tau",[new Re(t.major,!1),new Re(t.minor,!1),new Re(t.patch,!1),new q(t.status)])],value:new q("tau",[new Re(t.major,!1),new Re(t.minor,!1),new Re(t.patch,!1),new q(t.status)]),changeable:!1},nodejs:{allowed:[new q("yes"),new q("no")],value:new q(typeof El<"u"&&El.exports?"yes":"no"),changeable:!1}},unify:function(I,P,y){y=y===void 0?!1:y;for(var R=[{left:I,right:P}],z={};R.length!==0;){var X=R.pop();if(I=X.left,P=X.right,x.type.is_term(I)&&x.type.is_term(P)){if(I.indicator!==P.indicator)return null;for(var $=0;$z.value?1:0:z}else return R},operate:function(I,P){if(x.type.is_operator(P)){for(var y=x.type.is_operator(P),R=[],z,X=!1,$=0;$I.get_flag("max_integer").value||z0?I.start+I.matches[0].length:I.start,z=y?new q("token_not_found"):new q("found",[new q(I.value.toString())]),X=new q(".",[new q("line",[new Re(I.line+1)]),new q(".",[new q("column",[new Re(R+1)]),new q(".",[z,new q("[]",[])])])]);return new q("error",[new q("syntax_error",[new q(P)]),X])},syntax_by_predicate:function(I,P){return new q("error",[new q("syntax_error",[new q(I)]),Z(P)])}},warning:{singleton:function(I,P,y){for(var R=new q("[]"),z=I.length-1;z>=0;z--)R=new q(".",[new Se(I[z]),R]);return new q("warning",[new q("singleton_variables",[R,Z(P)]),new q(".",[new q("line",[new Re(y,!1)]),new q("[]")])])},failed_goal:function(I,P){return new q("warning",[new q("failed_goal",[I]),new q(".",[new q("line",[new Re(P,!1)]),new q("[]")])])}},format_variable:function(I){return"_"+I},format_answer:function(I,P,R){P instanceof xe&&(P=P.thread);var R=R||{};if(R.session=P?P.session:void 0,x.type.is_error(I))return"uncaught exception: "+I.args[0].toString();if(I===!1)return"false.";if(I===null)return"limit exceeded ;";var z=0,X="";if(x.type.is_substitution(I)){var $=I.domain(!0);I=I.filter(function(Fe,lt){return!x.type.is_variable(lt)||$.indexOf(lt.id)!==-1&&Fe!==lt.id})}for(var se in I.links)I.links.hasOwnProperty(se)&&(z++,X!==""&&(X+=", "),X+=se.toString(R)+" = "+I.links[se].toString(R));var be=typeof P>"u"||P.points.length>0?" ;":".";return z===0?"true"+be:X+be},flatten_error:function(I){if(!x.type.is_error(I))return null;I=I.args[0];var P={};return P.type=I.args[0].id,P.thrown=P.type==="syntax_error"?null:I.args[1].id,P.expected=null,P.found=null,P.representation=null,P.existence=null,P.existence_type=null,P.line=null,P.column=null,P.permission_operation=null,P.permission_type=null,P.evaluation_type=null,P.type==="type_error"||P.type==="domain_error"?(P.expected=I.args[0].args[0].id,P.found=I.args[0].args[1].toString()):P.type==="syntax_error"?I.args[1].indicator==="./2"?(P.expected=I.args[0].args[0].id,P.found=I.args[1].args[1].args[1].args[0],P.found=P.found.id==="token_not_found"?P.found.id:P.found.args[0].id,P.line=I.args[1].args[0].args[0].value,P.column=I.args[1].args[1].args[0].args[0].value):P.thrown=I.args[1].id:P.type==="permission_error"?(P.found=I.args[0].args[2].toString(),P.permission_operation=I.args[0].args[0].id,P.permission_type=I.args[0].args[1].id):P.type==="evaluation_error"?P.evaluation_type=I.args[0].args[0].id:P.type==="representation_error"?P.representation=I.args[0].args[0].id:P.type==="existence_error"&&(P.existence=I.args[0].args[1].toString(),P.existence_type=I.args[0].args[0].id),P},create:function(I){return new x.type.Session(I)}};typeof El<"u"?El.exports=x:window.pl=x})()});function Vme(t,e,r){t.prepend(r.map(o=>new Oa.default.type.State(e.goal.replace(o),e.substitution,e)))}function n6(t){let e=Jme.get(t.session);if(e==null)throw new Error("Assertion failed: A project should have been registered for the active session");return e}function zme(t,e){Jme.set(t,e),t.consult(`:- use_module(library(${Wgt.id})).`)}var i6,Oa,Kme,Nh,jgt,Ggt,Jme,Wgt,Xme=It(()=>{Ve();i6=et(L2()),Oa=et(r6()),Kme=et(ve("vm")),{is_atom:Nh,is_variable:jgt,is_instantiated_list:Ggt}=Oa.default.type;Jme=new WeakMap;Wgt=new Oa.default.type.Module("constraints",{"project_workspaces_by_descriptor/3":(t,e,r)=>{let[o,a,n]=r.args;if(!Nh(o)||!Nh(a)){t.throw_error(Oa.default.error.instantiation(r.indicator));return}let u=G.parseIdent(o.id),A=G.makeDescriptor(u,a.id),h=n6(t).tryWorkspaceByDescriptor(A);jgt(n)&&h!==null&&Vme(t,e,[new Oa.default.type.Term("=",[n,new Oa.default.type.Term(String(h.relativeCwd))])]),Nh(n)&&h!==null&&h.relativeCwd===n.id&&t.success(e)},"workspace_field/3":(t,e,r)=>{let[o,a,n]=r.args;if(!Nh(o)||!Nh(a)){t.throw_error(Oa.default.error.instantiation(r.indicator));return}let A=n6(t).tryWorkspaceByCwd(o.id);if(A==null)return;let p=(0,i6.default)(A.manifest.raw,a.id);typeof p>"u"||Vme(t,e,[new Oa.default.type.Term("=",[n,new Oa.default.type.Term(typeof p=="object"?JSON.stringify(p):p)])])},"workspace_field_test/3":(t,e,r)=>{let[o,a,n]=r.args;t.prepend([new Oa.default.type.State(e.goal.replace(new Oa.default.type.Term("workspace_field_test",[o,a,n,new Oa.default.type.Term("[]",[])])),e.substitution,e)])},"workspace_field_test/4":(t,e,r)=>{let[o,a,n,u]=r.args;if(!Nh(o)||!Nh(a)||!Nh(n)||!Ggt(u)){t.throw_error(Oa.default.error.instantiation(r.indicator));return}let p=n6(t).tryWorkspaceByCwd(o.id);if(p==null)return;let h=(0,i6.default)(p.manifest.raw,a.id);if(typeof h>"u")return;let E={$$:h};for(let[D,b]of u.toJavaScript().entries())E[`$${D}`]=b;Kme.default.runInNewContext(n.id,E)&&t.success(e)}},["project_workspaces_by_descriptor/3","workspace_field/3","workspace_field_test/3","workspace_field_test/4"])});var Y2={};Vt(Y2,{Constraints:()=>o6,DependencyType:()=>tye});function Ks(t){if(t instanceof rC.default.type.Num)return t.value;if(t instanceof rC.default.type.Term)switch(t.indicator){case"throw/1":return Ks(t.args[0]);case"error/1":return Ks(t.args[0]);case"error/2":if(t.args[0]instanceof rC.default.type.Term&&t.args[0].indicator==="syntax_error/1")return Object.assign(Ks(t.args[0]),...Ks(t.args[1]));{let e=Ks(t.args[0]);return e.message+=` (in ${Ks(t.args[1])})`,e}case"syntax_error/1":return new Jt(43,`Syntax error: ${Ks(t.args[0])}`);case"existence_error/2":return new Jt(44,`Existence error: ${Ks(t.args[0])} ${Ks(t.args[1])} not found`);case"instantiation_error/0":return new Jt(75,"Instantiation error: an argument is variable when an instantiated argument was expected");case"line/1":return{line:Ks(t.args[0])};case"column/1":return{column:Ks(t.args[0])};case"found/1":return{found:Ks(t.args[0])};case"./2":return[Ks(t.args[0])].concat(Ks(t.args[1]));case"//2":return`${Ks(t.args[0])}/${Ks(t.args[1])}`;default:return t.id}throw`couldn't pretty print because of unsupported node ${t}`}function $me(t){let e;try{e=Ks(t)}catch(r){throw typeof r=="string"?new Jt(42,`Unknown error: ${t} (note: ${r})`):r}return typeof e.line<"u"&&typeof e.column<"u"&&(e.message+=` at line ${e.line}, column ${e.column}`),e}function Zg(t){return t.id==="null"?null:`${t.toJavaScript()}`}function Ygt(t){if(t.id==="null")return null;{let e=t.toJavaScript();if(typeof e!="string")return JSON.stringify(e);try{return JSON.stringify(JSON.parse(e))}catch{return JSON.stringify(e)}}}function Oh(t){return typeof t=="string"?`'${t}'`:"[]"}var eye,rC,tye,Zme,s6,o6,V2=It(()=>{Ve();Ve();St();eye=et(Qme()),rC=et(r6());j2();Xme();(0,eye.default)(rC.default);tye=(o=>(o.Dependencies="dependencies",o.DevDependencies="devDependencies",o.PeerDependencies="peerDependencies",o))(tye||{}),Zme=["dependencies","devDependencies","peerDependencies"];s6=class{constructor(e,r){let o=1e3*e.workspaces.length;this.session=rC.default.create(o),zme(this.session,e),this.session.consult(":- use_module(library(lists))."),this.session.consult(r)}fetchNextAnswer(){return new Promise(e=>{this.session.answer(r=>{e(r)})})}async*makeQuery(e){let r=this.session.query(e);if(r!==!0)throw $me(r);for(;;){let o=await this.fetchNextAnswer();if(o===null)throw new Jt(79,"Resolution limit exceeded");if(!o)break;if(o.id==="throw")throw $me(o);yield o}}};o6=class t{constructor(e){this.source="";this.project=e;let r=e.configuration.get("constraintsPath");ae.existsSync(r)&&(this.source=ae.readFileSync(r,"utf8"))}static async find(e){return new t(e)}getProjectDatabase(){let e="";for(let r of Zme)e+=`dependency_type(${r}). -`;for(let r of this.project.workspacesByCwd.values()){let o=r.relativeCwd;e+=`workspace(${Oh(o)}). -`,e+=`workspace_ident(${Oh(o)}, ${Oh(G.stringifyIdent(r.anchoredLocator))}). -`,e+=`workspace_version(${Oh(o)}, ${Oh(r.manifest.version)}). -`;for(let a of Zme)for(let n of r.manifest[a].values())e+=`workspace_has_dependency(${Oh(o)}, ${Oh(G.stringifyIdent(n))}, ${Oh(n.range)}, ${a}). -`}return e+=`workspace(_) :- false. -`,e+=`workspace_ident(_, _) :- false. -`,e+=`workspace_version(_, _) :- false. -`,e+=`workspace_has_dependency(_, _, _, _) :- false. -`,e}getDeclarations(){let e="";return e+=`gen_enforced_dependency(_, _, _, _) :- false. -`,e+=`gen_enforced_field(_, _, _) :- false. -`,e}get fullSource(){return`${this.getProjectDatabase()} -${this.source} -${this.getDeclarations()}`}createSession(){return new s6(this.project,this.fullSource)}async processClassic(){let e=this.createSession();return{enforcedDependencies:await this.genEnforcedDependencies(e),enforcedFields:await this.genEnforcedFields(e)}}async process(){let{enforcedDependencies:e,enforcedFields:r}=await this.processClassic(),o=new Map;for(let{workspace:a,dependencyIdent:n,dependencyRange:u,dependencyType:A}of e){let p=q2([A,G.stringifyIdent(n)]),h=qe.getMapWithDefault(o,a.cwd);qe.getMapWithDefault(h,p).set(u??void 0,new Set)}for(let{workspace:a,fieldPath:n,fieldValue:u}of r){let A=q2(n),p=qe.getMapWithDefault(o,a.cwd);qe.getMapWithDefault(p,A).set(JSON.parse(u)??void 0,new Set)}return{manifestUpdates:o,reportedErrors:new Map}}async genEnforcedDependencies(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), dependency_type(DependencyType), gen_enforced_dependency(WorkspaceCwd, DependencyIdent, DependencyRange, DependencyType).")){let a=V.resolve(this.project.cwd,Zg(o.links.WorkspaceCwd)),n=Zg(o.links.DependencyIdent),u=Zg(o.links.DependencyRange),A=Zg(o.links.DependencyType);if(a===null||n===null)throw new Error("Invalid rule");let p=this.project.getWorkspaceByCwd(a),h=G.parseIdent(n);r.push({workspace:p,dependencyIdent:h,dependencyRange:u,dependencyType:A})}return qe.sortMap(r,[({dependencyRange:o})=>o!==null?"0":"1",({workspace:o})=>G.stringifyIdent(o.anchoredLocator),({dependencyIdent:o})=>G.stringifyIdent(o)])}async genEnforcedFields(e){let r=[];for await(let o of e.makeQuery("workspace(WorkspaceCwd), gen_enforced_field(WorkspaceCwd, FieldPath, FieldValue).")){let a=V.resolve(this.project.cwd,Zg(o.links.WorkspaceCwd)),n=Zg(o.links.FieldPath),u=Ygt(o.links.FieldValue);if(a===null||n===null)throw new Error("Invalid rule");let A=this.project.getWorkspaceByCwd(a);r.push({workspace:A,fieldPath:n,fieldValue:u})}return qe.sortMap(r,[({workspace:o})=>G.stringifyIdent(o.anchoredLocator),({fieldPath:o})=>o])}async*query(e){let r=this.createSession();for await(let o of r.makeQuery(e)){let a={};for(let[n,u]of Object.entries(o.links))n!=="_"&&(a[n]=Zg(u));yield a}}}});var uye=_(tQ=>{"use strict";Object.defineProperty(tQ,"__esModule",{value:!0});function lB(t){let e=[...t.caches],r=e.shift();return r===void 0?cye():{get(o,a,n={miss:()=>Promise.resolve()}){return r.get(o,a,n).catch(()=>lB({caches:e}).get(o,a,n))},set(o,a){return r.set(o,a).catch(()=>lB({caches:e}).set(o,a))},delete(o){return r.delete(o).catch(()=>lB({caches:e}).delete(o))},clear(){return r.clear().catch(()=>lB({caches:e}).clear())}}}function cye(){return{get(t,e,r={miss:()=>Promise.resolve()}){return e().then(a=>Promise.all([a,r.miss(a)])).then(([a])=>a)},set(t,e){return Promise.resolve(e)},delete(t){return Promise.resolve()},clear(){return Promise.resolve()}}}tQ.createFallbackableCache=lB;tQ.createNullCache=cye});var fye=_((pYt,Aye)=>{Aye.exports=uye()});var pye=_(C6=>{"use strict";Object.defineProperty(C6,"__esModule",{value:!0});function Adt(t={serializable:!0}){let e={};return{get(r,o,a={miss:()=>Promise.resolve()}){let n=JSON.stringify(r);if(n in e)return Promise.resolve(t.serializable?JSON.parse(e[n]):e[n]);let u=o(),A=a&&a.miss||(()=>Promise.resolve());return u.then(p=>A(p)).then(()=>u)},set(r,o){return e[JSON.stringify(r)]=t.serializable?JSON.stringify(o):o,Promise.resolve(o)},delete(r){return delete e[JSON.stringify(r)],Promise.resolve()},clear(){return e={},Promise.resolve()}}}C6.createInMemoryCache=Adt});var gye=_((gYt,hye)=>{hye.exports=pye()});var mye=_(su=>{"use strict";Object.defineProperty(su,"__esModule",{value:!0});function fdt(t,e,r){let o={"x-algolia-api-key":r,"x-algolia-application-id":e};return{headers(){return t===I6.WithinHeaders?o:{}},queryParameters(){return t===I6.WithinQueryParameters?o:{}}}}function pdt(t){let e=0,r=()=>(e++,new Promise(o=>{setTimeout(()=>{o(t(r))},Math.min(100*e,1e3))}));return t(r)}function dye(t,e=(r,o)=>Promise.resolve()){return Object.assign(t,{wait(r){return dye(t.then(o=>Promise.all([e(o,r),o])).then(o=>o[1]))}})}function hdt(t){let e=t.length-1;for(e;e>0;e--){let r=Math.floor(Math.random()*(e+1)),o=t[e];t[e]=t[r],t[r]=o}return t}function gdt(t,e){return e&&Object.keys(e).forEach(r=>{t[r]=e[r](t)}),t}function ddt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}var mdt="4.22.1",ydt=t=>()=>t.transporter.requester.destroy(),I6={WithinQueryParameters:0,WithinHeaders:1};su.AuthMode=I6;su.addMethods=gdt;su.createAuth=fdt;su.createRetryablePromise=pdt;su.createWaitablePromise=dye;su.destroy=ydt;su.encode=ddt;su.shuffle=hdt;su.version=mdt});var cB=_((mYt,yye)=>{yye.exports=mye()});var Eye=_(w6=>{"use strict";Object.defineProperty(w6,"__esModule",{value:!0});var Edt={Delete:"DELETE",Get:"GET",Post:"POST",Put:"PUT"};w6.MethodEnum=Edt});var uB=_((EYt,Cye)=>{Cye.exports=Eye()});var Lye=_(Ti=>{"use strict";Object.defineProperty(Ti,"__esModule",{value:!0});var wye=uB();function B6(t,e){let r=t||{},o=r.data||{};return Object.keys(r).forEach(a=>{["timeout","headers","queryParameters","data","cacheable"].indexOf(a)===-1&&(o[a]=r[a])}),{data:Object.entries(o).length>0?o:void 0,timeout:r.timeout||e,headers:r.headers||{},queryParameters:r.queryParameters||{},cacheable:r.cacheable}}var AB={Read:1,Write:2,Any:3},fC={Up:1,Down:2,Timeouted:3},Bye=2*60*1e3;function D6(t,e=fC.Up){return{...t,status:e,lastUpdate:Date.now()}}function vye(t){return t.status===fC.Up||Date.now()-t.lastUpdate>Bye}function Dye(t){return t.status===fC.Timeouted&&Date.now()-t.lastUpdate<=Bye}function S6(t){return typeof t=="string"?{protocol:"https",url:t,accept:AB.Any}:{protocol:t.protocol||"https",url:t.url,accept:t.accept||AB.Any}}function Cdt(t,e){return Promise.all(e.map(r=>t.get(r,()=>Promise.resolve(D6(r))))).then(r=>{let o=r.filter(A=>vye(A)),a=r.filter(A=>Dye(A)),n=[...o,...a],u=n.length>0?n.map(A=>S6(A)):e;return{getTimeout(A,p){return(a.length===0&&A===0?1:a.length+3+A)*p},statelessHosts:u}})}var Idt=({isTimedOut:t,status:e})=>!t&&~~e===0,wdt=t=>{let e=t.status;return t.isTimedOut||Idt(t)||~~(e/100)!==2&&~~(e/100)!==4},Bdt=({status:t})=>~~(t/100)===2,vdt=(t,e)=>wdt(t)?e.onRetry(t):Bdt(t)?e.onSuccess(t):e.onFail(t);function Iye(t,e,r,o){let a=[],n=kye(r,o),u=Qye(t,o),A=r.method,p=r.method!==wye.MethodEnum.Get?{}:{...r.data,...o.data},h={"x-algolia-agent":t.userAgent.value,...t.queryParameters,...p,...o.queryParameters},E=0,w=(D,b)=>{let C=D.pop();if(C===void 0)throw Tye(v6(a));let T={data:n,headers:u,method:A,url:xye(C,r.path,h),connectTimeout:b(E,t.timeouts.connect),responseTimeout:b(E,o.timeout)},N=J=>{let te={request:T,response:J,host:C,triesLeft:D.length};return a.push(te),te},U={onSuccess:J=>Sye(J),onRetry(J){let te=N(J);return J.isTimedOut&&E++,Promise.all([t.logger.info("Retryable failure",P6(te)),t.hostsCache.set(C,D6(C,J.isTimedOut?fC.Timeouted:fC.Down))]).then(()=>w(D,b))},onFail(J){throw N(J),Pye(J,v6(a))}};return t.requester.send(T).then(J=>vdt(J,U))};return Cdt(t.hostsCache,e).then(D=>w([...D.statelessHosts].reverse(),D.getTimeout))}function Ddt(t){let{hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,hosts:p,queryParameters:h,headers:E}=t,w={hostsCache:e,logger:r,requester:o,requestsCache:a,responsesCache:n,timeouts:u,userAgent:A,headers:E,queryParameters:h,hosts:p.map(D=>S6(D)),read(D,b){let C=B6(b,w.timeouts.read),T=()=>Iye(w,w.hosts.filter(J=>(J.accept&AB.Read)!==0),D,C);if((C.cacheable!==void 0?C.cacheable:D.cacheable)!==!0)return T();let U={request:D,mappedRequestOptions:C,transporter:{queryParameters:w.queryParameters,headers:w.headers}};return w.responsesCache.get(U,()=>w.requestsCache.get(U,()=>w.requestsCache.set(U,T()).then(J=>Promise.all([w.requestsCache.delete(U),J]),J=>Promise.all([w.requestsCache.delete(U),Promise.reject(J)])).then(([J,te])=>te)),{miss:J=>w.responsesCache.set(U,J)})},write(D,b){return Iye(w,w.hosts.filter(C=>(C.accept&AB.Write)!==0),D,B6(b,w.timeouts.write))}};return w}function Sdt(t){let e={value:`Algolia for JavaScript (${t})`,add(r){let o=`; ${r.segment}${r.version!==void 0?` (${r.version})`:""}`;return e.value.indexOf(o)===-1&&(e.value=`${e.value}${o}`),e}};return e}function Sye(t){try{return JSON.parse(t.content)}catch(e){throw Rye(e.message,t)}}function Pye({content:t,status:e},r){let o=t;try{o=JSON.parse(t).message}catch{}return Fye(o,e,r)}function Pdt(t,...e){let r=0;return t.replace(/%s/g,()=>encodeURIComponent(e[r++]))}function xye(t,e,r){let o=bye(r),a=`${t.protocol}://${t.url}/${e.charAt(0)==="/"?e.substr(1):e}`;return o.length&&(a+=`?${o}`),a}function bye(t){let e=r=>Object.prototype.toString.call(r)==="[object Object]"||Object.prototype.toString.call(r)==="[object Array]";return Object.keys(t).map(r=>Pdt("%s=%s",r,e(t[r])?JSON.stringify(t[r]):t[r])).join("&")}function kye(t,e){if(t.method===wye.MethodEnum.Get||t.data===void 0&&e.data===void 0)return;let r=Array.isArray(t.data)?t.data:{...t.data,...e.data};return JSON.stringify(r)}function Qye(t,e){let r={...t.headers,...e.headers},o={};return Object.keys(r).forEach(a=>{let n=r[a];o[a.toLowerCase()]=n}),o}function v6(t){return t.map(e=>P6(e))}function P6(t){let e=t.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...t,request:{...t.request,headers:{...t.request.headers,...e}}}}function Fye(t,e,r){return{name:"ApiError",message:t,status:e,transporterStackTrace:r}}function Rye(t,e){return{name:"DeserializationError",message:t,response:e}}function Tye(t){return{name:"RetryError",message:"Unreachable hosts - your application id may be incorrect. If the error persists, contact support@algolia.com.",transporterStackTrace:t}}Ti.CallEnum=AB;Ti.HostStatusEnum=fC;Ti.createApiError=Fye;Ti.createDeserializationError=Rye;Ti.createMappedRequestOptions=B6;Ti.createRetryError=Tye;Ti.createStatefulHost=D6;Ti.createStatelessHost=S6;Ti.createTransporter=Ddt;Ti.createUserAgent=Sdt;Ti.deserializeFailure=Pye;Ti.deserializeSuccess=Sye;Ti.isStatefulHostTimeouted=Dye;Ti.isStatefulHostUp=vye;Ti.serializeData=kye;Ti.serializeHeaders=Qye;Ti.serializeQueryParameters=bye;Ti.serializeUrl=xye;Ti.stackFrameWithoutCredentials=P6;Ti.stackTraceWithoutCredentials=v6});var fB=_((IYt,Nye)=>{Nye.exports=Lye()});var Oye=_(Mh=>{"use strict";Object.defineProperty(Mh,"__esModule",{value:!0});var pC=cB(),xdt=fB(),pB=uB(),bdt=t=>{let e=t.region||"us",r=pC.createAuth(pC.AuthMode.WithinHeaders,t.appId,t.apiKey),o=xdt.createTransporter({hosts:[{url:`analytics.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a=t.appId;return pC.addMethods({appId:a,transporter:o},t.methods)},kdt=t=>(e,r)=>t.transporter.write({method:pB.MethodEnum.Post,path:"2/abtests",data:e},r),Qdt=t=>(e,r)=>t.transporter.write({method:pB.MethodEnum.Delete,path:pC.encode("2/abtests/%s",e)},r),Fdt=t=>(e,r)=>t.transporter.read({method:pB.MethodEnum.Get,path:pC.encode("2/abtests/%s",e)},r),Rdt=t=>e=>t.transporter.read({method:pB.MethodEnum.Get,path:"2/abtests"},e),Tdt=t=>(e,r)=>t.transporter.write({method:pB.MethodEnum.Post,path:pC.encode("2/abtests/%s/stop",e)},r);Mh.addABTest=kdt;Mh.createAnalyticsClient=bdt;Mh.deleteABTest=Qdt;Mh.getABTest=Fdt;Mh.getABTests=Rdt;Mh.stopABTest=Tdt});var Uye=_((BYt,Mye)=>{Mye.exports=Oye()});var Hye=_(hB=>{"use strict";Object.defineProperty(hB,"__esModule",{value:!0});var x6=cB(),Ldt=fB(),_ye=uB(),Ndt=t=>{let e=t.region||"us",r=x6.createAuth(x6.AuthMode.WithinHeaders,t.appId,t.apiKey),o=Ldt.createTransporter({hosts:[{url:`personalization.${e}.algolia.com`}],...t,headers:{...r.headers(),"content-type":"application/json",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}});return x6.addMethods({appId:t.appId,transporter:o},t.methods)},Odt=t=>e=>t.transporter.read({method:_ye.MethodEnum.Get,path:"1/strategies/personalization"},e),Mdt=t=>(e,r)=>t.transporter.write({method:_ye.MethodEnum.Post,path:"1/strategies/personalization",data:e},r);hB.createPersonalizationClient=Ndt;hB.getPersonalizationStrategy=Odt;hB.setPersonalizationStrategy=Mdt});var jye=_((DYt,qye)=>{qye.exports=Hye()});var nEe=_(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});var Wt=cB(),Ma=fB(),Dr=uB(),Udt=ve("crypto");function rQ(t){let e=r=>t.request(r).then(o=>{if(t.batch!==void 0&&t.batch(o.hits),!t.shouldStop(o))return o.cursor?e({cursor:o.cursor}):e({page:(r.page||0)+1})});return e({})}var _dt=t=>{let e=t.appId,r=Wt.createAuth(t.authMode!==void 0?t.authMode:Wt.AuthMode.WithinHeaders,e,t.apiKey),o=Ma.createTransporter({hosts:[{url:`${e}-dsn.algolia.net`,accept:Ma.CallEnum.Read},{url:`${e}.algolia.net`,accept:Ma.CallEnum.Write}].concat(Wt.shuffle([{url:`${e}-1.algolianet.com`},{url:`${e}-2.algolianet.com`},{url:`${e}-3.algolianet.com`}])),...t,headers:{...r.headers(),"content-type":"application/x-www-form-urlencoded",...t.headers},queryParameters:{...r.queryParameters(),...t.queryParameters}}),a={transporter:o,appId:e,addAlgoliaAgent(n,u){o.userAgent.add({segment:n,version:u})},clearCache(){return Promise.all([o.requestsCache.clear(),o.responsesCache.clear()]).then(()=>{})}};return Wt.addMethods(a,t.methods)};function Gye(){return{name:"MissingObjectIDError",message:"All objects must have an unique objectID (like a primary key) to be valid. Algolia is also able to generate objectIDs automatically but *it's not recommended*. To do it, use the `{'autoGenerateObjectIDIfNotExist': true}` option."}}function Wye(){return{name:"ObjectNotFoundError",message:"Object not found."}}function Yye(){return{name:"ValidUntilNotFoundError",message:"ValidUntil not found in given secured api key."}}var Hdt=t=>(e,r)=>{let{queryParameters:o,...a}=r||{},n={acl:e,...o!==void 0?{queryParameters:o}:{}},u=(A,p)=>Wt.createRetryablePromise(h=>gB(t)(A.key,p).catch(E=>{if(E.status!==404)throw E;return h()}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:"1/keys",data:n},a),u)},qdt=t=>(e,r,o)=>{let a=Ma.createMappedRequestOptions(o);return a.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Dr.MethodEnum.Post,path:"1/clusters/mapping",data:{cluster:r}},a)},jdt=t=>(e,r,o)=>t.transporter.write({method:Dr.MethodEnum.Post,path:"1/clusters/mapping/batch",data:{users:e,cluster:r}},o),Gdt=t=>(e,r)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:{action:"addEntry",body:[]}}},r),(o,a)=>hC(t)(o.taskID,a)),nQ=t=>(e,r,o)=>{let a=(n,u)=>dB(t)(e,{methods:{waitTask:es}}).waitTask(n.taskID,u);return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",e),data:{operation:"copy",destination:r}},o),a)},Wdt=t=>(e,r,o)=>nQ(t)(e,r,{...o,scope:[sQ.Rules]}),Ydt=t=>(e,r,o)=>nQ(t)(e,r,{...o,scope:[sQ.Settings]}),Vdt=t=>(e,r,o)=>nQ(t)(e,r,{...o,scope:[sQ.Synonyms]}),Kdt=t=>(e,r)=>e.method===Dr.MethodEnum.Get?t.transporter.read(e,r):t.transporter.write(e,r),Jdt=t=>(e,r)=>{let o=(a,n)=>Wt.createRetryablePromise(u=>gB(t)(e,n).then(u).catch(A=>{if(A.status!==404)throw A}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/keys/%s",e)},r),o)},zdt=t=>(e,r,o)=>{let a=r.map(n=>({action:"deleteEntry",body:{objectID:n}}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>hC(t)(n.taskID,u))},Xdt=()=>(t,e)=>{let r=Ma.serializeQueryParameters(e),o=Udt.createHmac("sha256",t).update(r).digest("hex");return Buffer.from(o+r).toString("base64")},gB=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/keys/%s",e)},r),Vye=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/task/%s",e.toString())},r),Zdt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"/1/dictionaries/*/settings"},e),$dt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/logs"},e),emt=()=>t=>{let e=Buffer.from(t,"base64").toString("ascii"),r=/validUntil=(\d+)/,o=e.match(r);if(o===null)throw Yye();return parseInt(o[1],10)-Math.round(new Date().getTime()/1e3)},tmt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping/top"},e),rmt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/clusters/mapping/%s",e)},r),nmt=t=>e=>{let{retrieveMappings:r,...o}=e||{};return r===!0&&(o.getClusters=!0),t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping/pending"},o)},dB=t=>(e,r={})=>{let o={transporter:t.transporter,appId:t.appId,indexName:e};return Wt.addMethods(o,r.methods)},imt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/keys"},e),smt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters"},e),omt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/indexes"},e),amt=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:"1/clusters/mapping"},e),lmt=t=>(e,r,o)=>{let a=(n,u)=>dB(t)(e,{methods:{waitTask:es}}).waitTask(n.taskID,u);return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",e),data:{operation:"move",destination:r}},o),a)},cmt=t=>(e,r)=>{let o=(a,n)=>Promise.all(Object.keys(a.taskID).map(u=>dB(t)(u,{methods:{waitTask:es}}).waitTask(a.taskID[u],n)));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:"1/indexes/*/batch",data:{requests:e}},r),o)},umt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:e}},r),Amt=t=>(e,r)=>{let o=e.map(a=>({...a,params:Ma.serializeQueryParameters(a.params||{})}));return t.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/queries",data:{requests:o},cacheable:!0},r)},fmt=t=>(e,r)=>Promise.all(e.map(o=>{let{facetName:a,facetQuery:n,...u}=o.params;return dB(t)(o.indexName,{methods:{searchForFacetValues:eEe}}).searchForFacetValues(a,n,{...r,...u})})),pmt=t=>(e,r)=>{let o=Ma.createMappedRequestOptions(r);return o.queryParameters["X-Algolia-User-ID"]=e,t.transporter.write({method:Dr.MethodEnum.Delete,path:"1/clusters/mapping"},o)},hmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!0,requests:a}},o),(n,u)=>hC(t)(n.taskID,u))},gmt=t=>(e,r)=>{let o=(a,n)=>Wt.createRetryablePromise(u=>gB(t)(e,n).catch(A=>{if(A.status!==404)throw A;return u()}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/keys/%s/restore",e)},r),o)},dmt=t=>(e,r,o)=>{let a=r.map(n=>({action:"addEntry",body:n}));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/batch",e),data:{clearExistingDictionaryEntries:!1,requests:a}},o),(n,u)=>hC(t)(n.taskID,u))},mmt=t=>(e,r,o)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("/1/dictionaries/%s/search",e),data:{query:r},cacheable:!0},o),ymt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:"1/clusters/mapping/search",data:{query:e}},r),Emt=t=>(e,r)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Put,path:"/1/dictionaries/*/settings",data:e},r),(o,a)=>hC(t)(o.taskID,a)),Cmt=t=>(e,r)=>{let o=Object.assign({},r),{queryParameters:a,...n}=r||{},u=a?{queryParameters:a}:{},A=["acl","indexes","referers","restrictSources","queryParameters","description","maxQueriesPerIPPerHour","maxHitsPerQuery"],p=E=>Object.keys(o).filter(w=>A.indexOf(w)!==-1).every(w=>{if(Array.isArray(E[w])&&Array.isArray(o[w])){let D=E[w];return D.length===o[w].length&&D.every((b,C)=>b===o[w][C])}else return E[w]===o[w]}),h=(E,w)=>Wt.createRetryablePromise(D=>gB(t)(e,w).then(b=>p(b)?Promise.resolve():D()));return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Put,path:Wt.encode("1/keys/%s",e),data:u},n),h)},hC=t=>(e,r)=>Wt.createRetryablePromise(o=>Vye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),Kye=t=>(e,r)=>{let o=(a,n)=>es(t)(a.taskID,n);return Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/batch",t.indexName),data:{requests:e}},r),o)},Imt=t=>e=>rQ({shouldStop:r=>r.cursor===void 0,...e,request:r=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/browse",t.indexName),data:r},e)}),wmt=t=>e=>{let r={hitsPerPage:1e3,...e};return rQ({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},Bmt=t=>e=>{let r={hitsPerPage:1e3,...e};return rQ({shouldStop:o=>o.hits.length({...a,hits:a.hits.map(n=>(delete n._highlightResult,n))}))}})},iQ=t=>(e,r,o)=>{let{batchSize:a,...n}=o||{},u={taskIDs:[],objectIDs:[]},A=(p=0)=>{let h=[],E;for(E=p;E({action:r,body:w})),n).then(w=>(u.objectIDs=u.objectIDs.concat(w.objectIDs),u.taskIDs.push(w.taskID),E++,A(E)))};return Wt.createWaitablePromise(A(),(p,h)=>Promise.all(p.taskIDs.map(E=>es(t)(E,h))))},vmt=t=>e=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/clear",t.indexName)},e),(r,o)=>es(t)(r.taskID,o)),Dmt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Ma.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/clear",t.indexName)},a),(n,u)=>es(t)(n.taskID,u))},Smt=t=>e=>{let{forwardToReplicas:r,...o}=e||{},a=Ma.createMappedRequestOptions(o);return r&&(a.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/clear",t.indexName)},a),(n,u)=>es(t)(n.taskID,u))},Pmt=t=>(e,r)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/deleteByQuery",t.indexName),data:e},r),(o,a)=>es(t)(o.taskID,a)),xmt=t=>e=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/indexes/%s",t.indexName)},e),(r,o)=>es(t)(r.taskID,o)),bmt=t=>(e,r)=>Wt.createWaitablePromise(Jye(t)([e],r).then(o=>({taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),Jye=t=>(e,r)=>{let o=e.map(a=>({objectID:a}));return iQ(t)(o,ed.DeleteObject,r)},kmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/rules/%s",t.indexName,e)},n),(u,A)=>es(t)(u.taskID,A))},Qmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Delete,path:Wt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},n),(u,A)=>es(t)(u.taskID,A))},Fmt=t=>e=>zye(t)(e).then(()=>!0).catch(r=>{if(r.status!==404)throw r;return!1}),Rmt=t=>(e,r,o)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/answers/%s/prediction",t.indexName),data:{query:e,queryLanguages:r},cacheable:!0},o),Tmt=t=>(e,r)=>{let{query:o,paginate:a,...n}=r||{},u=0,A=()=>$ye(t)(o||"",{...n,page:u}).then(p=>{for(let[h,E]of Object.entries(p.hits))if(e(E))return{object:E,position:parseInt(h,10),page:u};if(u++,a===!1||u>=p.nbPages)throw Wye();return A()});return A()},Lmt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/%s",t.indexName,e)},r),Nmt=()=>(t,e)=>{for(let[r,o]of Object.entries(t.hits))if(o.objectID===e)return parseInt(r,10);return-1},Omt=t=>(e,r)=>{let{attributesToRetrieve:o,...a}=r||{},n=e.map(u=>({indexName:t.indexName,objectID:u,...o?{attributesToRetrieve:o}:{}}));return t.transporter.read({method:Dr.MethodEnum.Post,path:"1/indexes/*/objects",data:{requests:n}},a)},Mmt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/rules/%s",t.indexName,e)},r),zye=t=>e=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/settings",t.indexName),data:{getVersion:2}},e),Umt=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/synonyms/%s",t.indexName,e)},r),Xye=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Get,path:Wt.encode("1/indexes/%s/task/%s",t.indexName,e.toString())},r),_mt=t=>(e,r)=>Wt.createWaitablePromise(Zye(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),Zye=t=>(e,r)=>{let{createIfNotExists:o,...a}=r||{},n=o?ed.PartialUpdateObject:ed.PartialUpdateObjectNoCreate;return iQ(t)(e,n,a)},Hmt=t=>(e,r)=>{let{safe:o,autoGenerateObjectIDIfNotExist:a,batchSize:n,...u}=r||{},A=(C,T,N,U)=>Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/operation",C),data:{operation:N,destination:T}},U),(J,te)=>es(t)(J.taskID,te)),p=Math.random().toString(36).substring(7),h=`${t.indexName}_tmp_${p}`,E=b6({appId:t.appId,transporter:t.transporter,indexName:h}),w=[],D=A(t.indexName,h,"copy",{...u,scope:["settings","synonyms","rules"]});w.push(D);let b=(o?D.wait(u):D).then(()=>{let C=E(e,{...u,autoGenerateObjectIDIfNotExist:a,batchSize:n});return w.push(C),o?C.wait(u):C}).then(()=>{let C=A(h,t.indexName,"move",u);return w.push(C),o?C.wait(u):C}).then(()=>Promise.all(w)).then(([C,T,N])=>({objectIDs:T.objectIDs,taskIDs:[C.taskID,...T.taskIDs,N.taskID]}));return Wt.createWaitablePromise(b,(C,T)=>Promise.all(w.map(N=>N.wait(T))))},qmt=t=>(e,r)=>k6(t)(e,{...r,clearExistingRules:!0}),jmt=t=>(e,r)=>Q6(t)(e,{...r,clearExistingSynonyms:!0}),Gmt=t=>(e,r)=>Wt.createWaitablePromise(b6(t)([e],r).then(o=>({objectID:o.objectIDs[0],taskID:o.taskIDs[0]})),(o,a)=>es(t)(o.taskID,a)),b6=t=>(e,r)=>{let{autoGenerateObjectIDIfNotExist:o,...a}=r||{},n=o?ed.AddObject:ed.UpdateObject;if(n===ed.UpdateObject){for(let u of e)if(u.objectID===void 0)return Wt.createWaitablePromise(Promise.reject(Gye()))}return iQ(t)(e,n,a)},Wmt=t=>(e,r)=>k6(t)([e],r),k6=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingRules:a,...n}=r||{},u=Ma.createMappedRequestOptions(n);return o&&(u.queryParameters.forwardToReplicas=1),a&&(u.queryParameters.clearExistingRules=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/batch",t.indexName),data:e},u),(A,p)=>es(t)(A.taskID,p))},Ymt=t=>(e,r)=>Q6(t)([e],r),Q6=t=>(e,r)=>{let{forwardToReplicas:o,clearExistingSynonyms:a,replaceExistingSynonyms:n,...u}=r||{},A=Ma.createMappedRequestOptions(u);return o&&(A.queryParameters.forwardToReplicas=1),(n||a)&&(A.queryParameters.replaceExistingSynonyms=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/batch",t.indexName),data:e},A),(p,h)=>es(t)(p.taskID,h))},$ye=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/query",t.indexName),data:{query:e},cacheable:!0},r),eEe=t=>(e,r,o)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/facets/%s/query",t.indexName,e),data:{facetQuery:r},cacheable:!0},o),tEe=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/rules/search",t.indexName),data:{query:e}},r),rEe=t=>(e,r)=>t.transporter.read({method:Dr.MethodEnum.Post,path:Wt.encode("1/indexes/%s/synonyms/search",t.indexName),data:{query:e}},r),Vmt=t=>(e,r)=>{let{forwardToReplicas:o,...a}=r||{},n=Ma.createMappedRequestOptions(a);return o&&(n.queryParameters.forwardToReplicas=1),Wt.createWaitablePromise(t.transporter.write({method:Dr.MethodEnum.Put,path:Wt.encode("1/indexes/%s/settings",t.indexName),data:e},n),(u,A)=>es(t)(u.taskID,A))},es=t=>(e,r)=>Wt.createRetryablePromise(o=>Xye(t)(e,r).then(a=>a.status!=="published"?o():void 0)),Kmt={AddObject:"addObject",Analytics:"analytics",Browser:"browse",DeleteIndex:"deleteIndex",DeleteObject:"deleteObject",EditSettings:"editSettings",Inference:"inference",ListIndexes:"listIndexes",Logs:"logs",Personalization:"personalization",Recommendation:"recommendation",Search:"search",SeeUnretrievableAttributes:"seeUnretrievableAttributes",Settings:"settings",Usage:"usage"},ed={AddObject:"addObject",UpdateObject:"updateObject",PartialUpdateObject:"partialUpdateObject",PartialUpdateObjectNoCreate:"partialUpdateObjectNoCreate",DeleteObject:"deleteObject",DeleteIndex:"delete",ClearIndex:"clear"},sQ={Settings:"settings",Synonyms:"synonyms",Rules:"rules"},Jmt={None:"none",StopIfEnoughMatches:"stopIfEnoughMatches"},zmt={Synonym:"synonym",OneWaySynonym:"oneWaySynonym",AltCorrection1:"altCorrection1",AltCorrection2:"altCorrection2",Placeholder:"placeholder"};Rt.ApiKeyACLEnum=Kmt;Rt.BatchActionEnum=ed;Rt.ScopeEnum=sQ;Rt.StrategyEnum=Jmt;Rt.SynonymEnum=zmt;Rt.addApiKey=Hdt;Rt.assignUserID=qdt;Rt.assignUserIDs=jdt;Rt.batch=Kye;Rt.browseObjects=Imt;Rt.browseRules=wmt;Rt.browseSynonyms=Bmt;Rt.chunkedBatch=iQ;Rt.clearDictionaryEntries=Gdt;Rt.clearObjects=vmt;Rt.clearRules=Dmt;Rt.clearSynonyms=Smt;Rt.copyIndex=nQ;Rt.copyRules=Wdt;Rt.copySettings=Ydt;Rt.copySynonyms=Vdt;Rt.createBrowsablePromise=rQ;Rt.createMissingObjectIDError=Gye;Rt.createObjectNotFoundError=Wye;Rt.createSearchClient=_dt;Rt.createValidUntilNotFoundError=Yye;Rt.customRequest=Kdt;Rt.deleteApiKey=Jdt;Rt.deleteBy=Pmt;Rt.deleteDictionaryEntries=zdt;Rt.deleteIndex=xmt;Rt.deleteObject=bmt;Rt.deleteObjects=Jye;Rt.deleteRule=kmt;Rt.deleteSynonym=Qmt;Rt.exists=Fmt;Rt.findAnswers=Rmt;Rt.findObject=Tmt;Rt.generateSecuredApiKey=Xdt;Rt.getApiKey=gB;Rt.getAppTask=Vye;Rt.getDictionarySettings=Zdt;Rt.getLogs=$dt;Rt.getObject=Lmt;Rt.getObjectPosition=Nmt;Rt.getObjects=Omt;Rt.getRule=Mmt;Rt.getSecuredApiKeyRemainingValidity=emt;Rt.getSettings=zye;Rt.getSynonym=Umt;Rt.getTask=Xye;Rt.getTopUserIDs=tmt;Rt.getUserID=rmt;Rt.hasPendingMappings=nmt;Rt.initIndex=dB;Rt.listApiKeys=imt;Rt.listClusters=smt;Rt.listIndices=omt;Rt.listUserIDs=amt;Rt.moveIndex=lmt;Rt.multipleBatch=cmt;Rt.multipleGetObjects=umt;Rt.multipleQueries=Amt;Rt.multipleSearchForFacetValues=fmt;Rt.partialUpdateObject=_mt;Rt.partialUpdateObjects=Zye;Rt.removeUserID=pmt;Rt.replaceAllObjects=Hmt;Rt.replaceAllRules=qmt;Rt.replaceAllSynonyms=jmt;Rt.replaceDictionaryEntries=hmt;Rt.restoreApiKey=gmt;Rt.saveDictionaryEntries=dmt;Rt.saveObject=Gmt;Rt.saveObjects=b6;Rt.saveRule=Wmt;Rt.saveRules=k6;Rt.saveSynonym=Ymt;Rt.saveSynonyms=Q6;Rt.search=$ye;Rt.searchDictionaryEntries=mmt;Rt.searchForFacetValues=eEe;Rt.searchRules=tEe;Rt.searchSynonyms=rEe;Rt.searchUserIDs=ymt;Rt.setDictionarySettings=Emt;Rt.setSettings=Vmt;Rt.updateApiKey=Cmt;Rt.waitAppTask=hC;Rt.waitTask=es});var sEe=_((PYt,iEe)=>{iEe.exports=nEe()});var oEe=_(oQ=>{"use strict";Object.defineProperty(oQ,"__esModule",{value:!0});function Xmt(){return{debug(t,e){return Promise.resolve()},info(t,e){return Promise.resolve()},error(t,e){return Promise.resolve()}}}var Zmt={Debug:1,Info:2,Error:3};oQ.LogLevelEnum=Zmt;oQ.createNullLogger=Xmt});var lEe=_((bYt,aEe)=>{aEe.exports=oEe()});var fEe=_(F6=>{"use strict";Object.defineProperty(F6,"__esModule",{value:!0});var cEe=ve("http"),uEe=ve("https"),$mt=ve("url"),AEe={keepAlive:!0},eyt=new cEe.Agent(AEe),tyt=new uEe.Agent(AEe);function ryt({agent:t,httpAgent:e,httpsAgent:r,requesterOptions:o={}}={}){let a=e||t||eyt,n=r||t||tyt;return{send(u){return new Promise(A=>{let p=$mt.parse(u.url),h=p.query===null?p.pathname:`${p.pathname}?${p.query}`,E={...o,agent:p.protocol==="https:"?n:a,hostname:p.hostname,path:h,method:u.method,headers:{...o&&o.headers?o.headers:{},...u.headers},...p.port!==void 0?{port:p.port||""}:{}},w=(p.protocol==="https:"?uEe:cEe).request(E,T=>{let N=[];T.on("data",U=>{N=N.concat(U)}),T.on("end",()=>{clearTimeout(b),clearTimeout(C),A({status:T.statusCode||0,content:Buffer.concat(N).toString(),isTimedOut:!1})})}),D=(T,N)=>setTimeout(()=>{w.abort(),A({status:0,content:N,isTimedOut:!0})},T*1e3),b=D(u.connectTimeout,"Connection timeout"),C;w.on("error",T=>{clearTimeout(b),clearTimeout(C),A({status:0,content:T.message,isTimedOut:!1})}),w.once("response",()=>{clearTimeout(b),C=D(u.responseTimeout,"Socket timeout")}),u.data!==void 0&&w.write(u.data),w.end()})},destroy(){return a.destroy(),n.destroy(),Promise.resolve()}}}F6.createNodeHttpRequester=ryt});var hEe=_((QYt,pEe)=>{pEe.exports=fEe()});var yEe=_((FYt,mEe)=>{"use strict";var gEe=fye(),nyt=gye(),gC=Uye(),T6=cB(),R6=jye(),Ht=sEe(),iyt=lEe(),syt=hEe(),oyt=fB();function dEe(t,e,r){let o={appId:t,apiKey:e,timeouts:{connect:2,read:5,write:30},requester:syt.createNodeHttpRequester(),logger:iyt.createNullLogger(),responsesCache:gEe.createNullCache(),requestsCache:gEe.createNullCache(),hostsCache:nyt.createInMemoryCache(),userAgent:oyt.createUserAgent(T6.version).add({segment:"Node.js",version:process.versions.node})},a={...o,...r},n=()=>u=>R6.createPersonalizationClient({...o,...u,methods:{getPersonalizationStrategy:R6.getPersonalizationStrategy,setPersonalizationStrategy:R6.setPersonalizationStrategy}});return Ht.createSearchClient({...a,methods:{search:Ht.multipleQueries,searchForFacetValues:Ht.multipleSearchForFacetValues,multipleBatch:Ht.multipleBatch,multipleGetObjects:Ht.multipleGetObjects,multipleQueries:Ht.multipleQueries,copyIndex:Ht.copyIndex,copySettings:Ht.copySettings,copyRules:Ht.copyRules,copySynonyms:Ht.copySynonyms,moveIndex:Ht.moveIndex,listIndices:Ht.listIndices,getLogs:Ht.getLogs,listClusters:Ht.listClusters,multipleSearchForFacetValues:Ht.multipleSearchForFacetValues,getApiKey:Ht.getApiKey,addApiKey:Ht.addApiKey,listApiKeys:Ht.listApiKeys,updateApiKey:Ht.updateApiKey,deleteApiKey:Ht.deleteApiKey,restoreApiKey:Ht.restoreApiKey,assignUserID:Ht.assignUserID,assignUserIDs:Ht.assignUserIDs,getUserID:Ht.getUserID,searchUserIDs:Ht.searchUserIDs,listUserIDs:Ht.listUserIDs,getTopUserIDs:Ht.getTopUserIDs,removeUserID:Ht.removeUserID,hasPendingMappings:Ht.hasPendingMappings,generateSecuredApiKey:Ht.generateSecuredApiKey,getSecuredApiKeyRemainingValidity:Ht.getSecuredApiKeyRemainingValidity,destroy:T6.destroy,clearDictionaryEntries:Ht.clearDictionaryEntries,deleteDictionaryEntries:Ht.deleteDictionaryEntries,getDictionarySettings:Ht.getDictionarySettings,getAppTask:Ht.getAppTask,replaceDictionaryEntries:Ht.replaceDictionaryEntries,saveDictionaryEntries:Ht.saveDictionaryEntries,searchDictionaryEntries:Ht.searchDictionaryEntries,setDictionarySettings:Ht.setDictionarySettings,waitAppTask:Ht.waitAppTask,customRequest:Ht.customRequest,initIndex:u=>A=>Ht.initIndex(u)(A,{methods:{batch:Ht.batch,delete:Ht.deleteIndex,findAnswers:Ht.findAnswers,getObject:Ht.getObject,getObjects:Ht.getObjects,saveObject:Ht.saveObject,saveObjects:Ht.saveObjects,search:Ht.search,searchForFacetValues:Ht.searchForFacetValues,waitTask:Ht.waitTask,setSettings:Ht.setSettings,getSettings:Ht.getSettings,partialUpdateObject:Ht.partialUpdateObject,partialUpdateObjects:Ht.partialUpdateObjects,deleteObject:Ht.deleteObject,deleteObjects:Ht.deleteObjects,deleteBy:Ht.deleteBy,clearObjects:Ht.clearObjects,browseObjects:Ht.browseObjects,getObjectPosition:Ht.getObjectPosition,findObject:Ht.findObject,exists:Ht.exists,saveSynonym:Ht.saveSynonym,saveSynonyms:Ht.saveSynonyms,getSynonym:Ht.getSynonym,searchSynonyms:Ht.searchSynonyms,browseSynonyms:Ht.browseSynonyms,deleteSynonym:Ht.deleteSynonym,clearSynonyms:Ht.clearSynonyms,replaceAllObjects:Ht.replaceAllObjects,replaceAllSynonyms:Ht.replaceAllSynonyms,searchRules:Ht.searchRules,getRule:Ht.getRule,deleteRule:Ht.deleteRule,saveRule:Ht.saveRule,saveRules:Ht.saveRules,replaceAllRules:Ht.replaceAllRules,browseRules:Ht.browseRules,clearRules:Ht.clearRules}}),initAnalytics:()=>u=>gC.createAnalyticsClient({...o,...u,methods:{addABTest:gC.addABTest,getABTest:gC.getABTest,getABTests:gC.getABTests,stopABTest:gC.stopABTest,deleteABTest:gC.deleteABTest}}),initPersonalization:n,initRecommendation:()=>u=>(a.logger.info("The `initRecommendation` method is deprecated. Use `initPersonalization` instead."),n()(u))}})}dEe.version=T6.version;mEe.exports=dEe});var N6=_((RYt,L6)=>{var EEe=yEe();L6.exports=EEe;L6.exports.default=EEe});var U6=_((LYt,wEe)=>{"use strict";var IEe=Object.getOwnPropertySymbols,lyt=Object.prototype.hasOwnProperty,cyt=Object.prototype.propertyIsEnumerable;function uyt(t){if(t==null)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}function Ayt(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de",Object.getOwnPropertyNames(t)[0]==="5")return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;var o=Object.getOwnPropertyNames(e).map(function(n){return e[n]});if(o.join("")!=="0123456789")return!1;var a={};return"abcdefghijklmnopqrst".split("").forEach(function(n){a[n]=n}),Object.keys(Object.assign({},a)).join("")==="abcdefghijklmnopqrst"}catch{return!1}}wEe.exports=Ayt()?Object.assign:function(t,e){for(var r,o=uyt(t),a,n=1;n{"use strict";var H6=U6(),dC=60103,DEe=60106;Cn.Fragment=60107;Cn.StrictMode=60108;Cn.Profiler=60114;var SEe=60109,PEe=60110,xEe=60112;Cn.Suspense=60113;var bEe=60115,kEe=60116;typeof Symbol=="function"&&Symbol.for&&(sc=Symbol.for,dC=sc("react.element"),DEe=sc("react.portal"),Cn.Fragment=sc("react.fragment"),Cn.StrictMode=sc("react.strict_mode"),Cn.Profiler=sc("react.profiler"),SEe=sc("react.provider"),PEe=sc("react.context"),xEe=sc("react.forward_ref"),Cn.Suspense=sc("react.suspense"),bEe=sc("react.memo"),kEe=sc("react.lazy"));var sc,BEe=typeof Symbol=="function"&&Symbol.iterator;function fyt(t){return t===null||typeof t!="object"?null:(t=BEe&&t[BEe]||t["@@iterator"],typeof t=="function"?t:null)}function mB(t){for(var e="https://reactjs.org/docs/error-decoder.html?invariant="+t,r=1;r{"use strict";UEe.exports=MEe()});var V6=_((MYt,Y6)=>{"use strict";var gn=Y6.exports;Y6.exports.default=gn;var Gn="\x1B[",yB="\x1B]",yC="\x07",cQ=";",_Ee=process.env.TERM_PROGRAM==="Apple_Terminal";gn.cursorTo=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");return typeof e!="number"?Gn+(t+1)+"G":Gn+(e+1)+";"+(t+1)+"H"};gn.cursorMove=(t,e)=>{if(typeof t!="number")throw new TypeError("The `x` argument is required");let r="";return t<0?r+=Gn+-t+"D":t>0&&(r+=Gn+t+"C"),e<0?r+=Gn+-e+"A":e>0&&(r+=Gn+e+"B"),r};gn.cursorUp=(t=1)=>Gn+t+"A";gn.cursorDown=(t=1)=>Gn+t+"B";gn.cursorForward=(t=1)=>Gn+t+"C";gn.cursorBackward=(t=1)=>Gn+t+"D";gn.cursorLeft=Gn+"G";gn.cursorSavePosition=_Ee?"\x1B7":Gn+"s";gn.cursorRestorePosition=_Ee?"\x1B8":Gn+"u";gn.cursorGetPosition=Gn+"6n";gn.cursorNextLine=Gn+"E";gn.cursorPrevLine=Gn+"F";gn.cursorHide=Gn+"?25l";gn.cursorShow=Gn+"?25h";gn.eraseLines=t=>{let e="";for(let r=0;r[yB,"8",cQ,cQ,e,yC,t,yB,"8",cQ,cQ,yC].join("");gn.image=(t,e={})=>{let r=`${yB}1337;File=inline=1`;return e.width&&(r+=`;width=${e.width}`),e.height&&(r+=`;height=${e.height}`),e.preserveAspectRatio===!1&&(r+=";preserveAspectRatio=0"),r+":"+t.toString("base64")+yC};gn.iTerm={setCwd:(t=process.cwd())=>`${yB}50;CurrentDir=${t}${yC}`,annotation:(t,e={})=>{let r=`${yB}1337;`,o=typeof e.x<"u",a=typeof e.y<"u";if((o||a)&&!(o&&a&&typeof e.length<"u"))throw new Error("`x`, `y` and `length` must be defined when `x` or `y` is defined");return t=t.replace(/\|/g,""),r+=e.isHidden?"AddHiddenAnnotation=":"AddAnnotation=",e.length>0?r+=(o?[t,e.length,e.x,e.y]:[e.length,t]).join("|"):r+=t,r+yC}}});var qEe=_((UYt,K6)=>{"use strict";var HEe=(t,e)=>{for(let r of Reflect.ownKeys(e))Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(e,r));return t};K6.exports=HEe;K6.exports.default=HEe});var GEe=_((_Yt,AQ)=>{"use strict";var myt=qEe(),uQ=new WeakMap,jEe=(t,e={})=>{if(typeof t!="function")throw new TypeError("Expected a function");let r,o=0,a=t.displayName||t.name||"",n=function(...u){if(uQ.set(n,++o),o===1)r=t.apply(this,u),t=null;else if(e.throw===!0)throw new Error(`Function \`${a}\` can only be called once`);return r};return myt(n,t),uQ.set(n,o),n};AQ.exports=jEe;AQ.exports.default=jEe;AQ.exports.callCount=t=>{if(!uQ.has(t))throw new Error(`The given function \`${t.name}\` is not wrapped by the \`onetime\` package`);return uQ.get(t)}});var WEe=_((HYt,fQ)=>{fQ.exports=["SIGABRT","SIGALRM","SIGHUP","SIGINT","SIGTERM"];process.platform!=="win32"&&fQ.exports.push("SIGVTALRM","SIGXCPU","SIGXFSZ","SIGUSR2","SIGTRAP","SIGSYS","SIGQUIT","SIGIOT");process.platform==="linux"&&fQ.exports.push("SIGIO","SIGPOLL","SIGPWR","SIGSTKFLT","SIGUNUSED")});var X6=_((qYt,IC)=>{var wi=global.process,td=function(t){return t&&typeof t=="object"&&typeof t.removeListener=="function"&&typeof t.emit=="function"&&typeof t.reallyExit=="function"&&typeof t.listeners=="function"&&typeof t.kill=="function"&&typeof t.pid=="number"&&typeof t.on=="function"};td(wi)?(YEe=ve("assert"),EC=WEe(),VEe=/^win/i.test(wi.platform),EB=ve("events"),typeof EB!="function"&&(EB=EB.EventEmitter),wi.__signal_exit_emitter__?ks=wi.__signal_exit_emitter__:(ks=wi.__signal_exit_emitter__=new EB,ks.count=0,ks.emitted={}),ks.infinite||(ks.setMaxListeners(1/0),ks.infinite=!0),IC.exports=function(t,e){if(!td(global.process))return function(){};YEe.equal(typeof t,"function","a callback must be provided for exit handler"),CC===!1&&J6();var r="exit";e&&e.alwaysLast&&(r="afterexit");var o=function(){ks.removeListener(r,t),ks.listeners("exit").length===0&&ks.listeners("afterexit").length===0&&pQ()};return ks.on(r,t),o},pQ=function(){!CC||!td(global.process)||(CC=!1,EC.forEach(function(e){try{wi.removeListener(e,hQ[e])}catch{}}),wi.emit=gQ,wi.reallyExit=z6,ks.count-=1)},IC.exports.unload=pQ,rd=function(e,r,o){ks.emitted[e]||(ks.emitted[e]=!0,ks.emit(e,r,o))},hQ={},EC.forEach(function(t){hQ[t]=function(){if(td(global.process)){var r=wi.listeners(t);r.length===ks.count&&(pQ(),rd("exit",null,t),rd("afterexit",null,t),VEe&&t==="SIGHUP"&&(t="SIGINT"),wi.kill(wi.pid,t))}}}),IC.exports.signals=function(){return EC},CC=!1,J6=function(){CC||!td(global.process)||(CC=!0,ks.count+=1,EC=EC.filter(function(e){try{return wi.on(e,hQ[e]),!0}catch{return!1}}),wi.emit=JEe,wi.reallyExit=KEe)},IC.exports.load=J6,z6=wi.reallyExit,KEe=function(e){td(global.process)&&(wi.exitCode=e||0,rd("exit",wi.exitCode,null),rd("afterexit",wi.exitCode,null),z6.call(wi,wi.exitCode))},gQ=wi.emit,JEe=function(e,r){if(e==="exit"&&td(global.process)){r!==void 0&&(wi.exitCode=r);var o=gQ.apply(this,arguments);return rd("exit",wi.exitCode,null),rd("afterexit",wi.exitCode,null),o}else return gQ.apply(this,arguments)}):IC.exports=function(){return function(){}};var YEe,EC,VEe,EB,ks,pQ,rd,hQ,CC,J6,z6,KEe,gQ,JEe});var XEe=_((jYt,zEe)=>{"use strict";var yyt=GEe(),Eyt=X6();zEe.exports=yyt(()=>{Eyt(()=>{process.stderr.write("\x1B[?25h")},{alwaysLast:!0})})});var Z6=_(wC=>{"use strict";var Cyt=XEe(),dQ=!1;wC.show=(t=process.stderr)=>{t.isTTY&&(dQ=!1,t.write("\x1B[?25h"))};wC.hide=(t=process.stderr)=>{t.isTTY&&(Cyt(),dQ=!0,t.write("\x1B[?25l"))};wC.toggle=(t,e)=>{t!==void 0&&(dQ=t),dQ?wC.show(e):wC.hide(e)}});var tCe=_(CB=>{"use strict";var eCe=CB&&CB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(CB,"__esModule",{value:!0});var ZEe=eCe(V6()),$Ee=eCe(Z6()),Iyt=(t,{showCursor:e=!1}={})=>{let r=0,o="",a=!1,n=u=>{!e&&!a&&($Ee.default.hide(),a=!0);let A=u+` -`;A!==o&&(o=A,t.write(ZEe.default.eraseLines(r)+A),r=A.split(` -`).length)};return n.clear=()=>{t.write(ZEe.default.eraseLines(r)),o="",r=0},n.done=()=>{o="",r=0,e||($Ee.default.show(),a=!1)},n};CB.default={create:Iyt}});var rCe=_((YYt,wyt)=>{wyt.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var sCe=_(Cl=>{"use strict";var iCe=rCe(),gA=process.env;Object.defineProperty(Cl,"_vendors",{value:iCe.map(function(t){return t.constant})});Cl.name=null;Cl.isPR=null;iCe.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(o){return nCe(o)});if(Cl[t.constant]=r,r)switch(Cl.name=t.name,typeof t.pr){case"string":Cl.isPR=!!gA[t.pr];break;case"object":"env"in t.pr?Cl.isPR=t.pr.env in gA&&gA[t.pr.env]!==t.pr.ne:"any"in t.pr?Cl.isPR=t.pr.any.some(function(o){return!!gA[o]}):Cl.isPR=nCe(t.pr);break;default:Cl.isPR=null}});Cl.isCI=!!(gA.CI||gA.CONTINUOUS_INTEGRATION||gA.BUILD_NUMBER||gA.RUN_ID||Cl.name);function nCe(t){return typeof t=="string"?!!gA[t]:Object.keys(t).every(function(e){return gA[e]===t[e]})}});var aCe=_((KYt,oCe)=>{"use strict";oCe.exports=sCe().isCI});var cCe=_((JYt,lCe)=>{"use strict";var Byt=t=>{let e=new Set;do for(let r of Reflect.ownKeys(t))e.add([t,r]);while((t=Reflect.getPrototypeOf(t))&&t!==Object.prototype);return e};lCe.exports=(t,{include:e,exclude:r}={})=>{let o=a=>{let n=u=>typeof u=="string"?a===u:u.test(a);return e?e.some(n):r?!r.some(n):!0};for(let[a,n]of Byt(t.constructor.prototype)){if(n==="constructor"||!o(n))continue;let u=Reflect.getOwnPropertyDescriptor(a,n);u&&typeof u.value=="function"&&(t[n]=t[n].bind(t))}return t}});var gCe=_(Hn=>{"use strict";var vC,BB,CQ,sq;typeof performance=="object"&&typeof performance.now=="function"?(uCe=performance,Hn.unstable_now=function(){return uCe.now()}):($6=Date,ACe=$6.now(),Hn.unstable_now=function(){return $6.now()-ACe});var uCe,$6,ACe;typeof window>"u"||typeof MessageChannel!="function"?(BC=null,eq=null,tq=function(){if(BC!==null)try{var t=Hn.unstable_now();BC(!0,t),BC=null}catch(e){throw setTimeout(tq,0),e}},vC=function(t){BC!==null?setTimeout(vC,0,t):(BC=t,setTimeout(tq,0))},BB=function(t,e){eq=setTimeout(t,e)},CQ=function(){clearTimeout(eq)},Hn.unstable_shouldYield=function(){return!1},sq=Hn.unstable_forceFrameRate=function(){}):(fCe=window.setTimeout,pCe=window.clearTimeout,typeof console<"u"&&(hCe=window.cancelAnimationFrame,typeof window.requestAnimationFrame!="function"&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills"),typeof hCe!="function"&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://reactjs.org/link/react-polyfills")),IB=!1,wB=null,mQ=-1,rq=5,nq=0,Hn.unstable_shouldYield=function(){return Hn.unstable_now()>=nq},sq=function(){},Hn.unstable_forceFrameRate=function(t){0>t||125>>1,a=t[o];if(a!==void 0&&0EQ(u,r))p!==void 0&&0>EQ(p,u)?(t[o]=p,t[A]=r,o=A):(t[o]=u,t[n]=r,o=n);else if(p!==void 0&&0>EQ(p,r))t[o]=p,t[A]=r,o=A;else break e}}return e}return null}function EQ(t,e){var r=t.sortIndex-e.sortIndex;return r!==0?r:t.id-e.id}var dA=[],Uh=[],vyt=1,oc=null,bo=3,wQ=!1,nd=!1,vB=!1;function aq(t){for(var e=ou(Uh);e!==null;){if(e.callback===null)IQ(Uh);else if(e.startTime<=t)IQ(Uh),e.sortIndex=e.expirationTime,oq(dA,e);else break;e=ou(Uh)}}function lq(t){if(vB=!1,aq(t),!nd)if(ou(dA)!==null)nd=!0,vC(cq);else{var e=ou(Uh);e!==null&&BB(lq,e.startTime-t)}}function cq(t,e){nd=!1,vB&&(vB=!1,CQ()),wQ=!0;var r=bo;try{for(aq(e),oc=ou(dA);oc!==null&&(!(oc.expirationTime>e)||t&&!Hn.unstable_shouldYield());){var o=oc.callback;if(typeof o=="function"){oc.callback=null,bo=oc.priorityLevel;var a=o(oc.expirationTime<=e);e=Hn.unstable_now(),typeof a=="function"?oc.callback=a:oc===ou(dA)&&IQ(dA),aq(e)}else IQ(dA);oc=ou(dA)}if(oc!==null)var n=!0;else{var u=ou(Uh);u!==null&&BB(lq,u.startTime-e),n=!1}return n}finally{oc=null,bo=r,wQ=!1}}var Dyt=sq;Hn.unstable_IdlePriority=5;Hn.unstable_ImmediatePriority=1;Hn.unstable_LowPriority=4;Hn.unstable_NormalPriority=3;Hn.unstable_Profiling=null;Hn.unstable_UserBlockingPriority=2;Hn.unstable_cancelCallback=function(t){t.callback=null};Hn.unstable_continueExecution=function(){nd||wQ||(nd=!0,vC(cq))};Hn.unstable_getCurrentPriorityLevel=function(){return bo};Hn.unstable_getFirstCallbackNode=function(){return ou(dA)};Hn.unstable_next=function(t){switch(bo){case 1:case 2:case 3:var e=3;break;default:e=bo}var r=bo;bo=e;try{return t()}finally{bo=r}};Hn.unstable_pauseExecution=function(){};Hn.unstable_requestPaint=Dyt;Hn.unstable_runWithPriority=function(t,e){switch(t){case 1:case 2:case 3:case 4:case 5:break;default:t=3}var r=bo;bo=t;try{return e()}finally{bo=r}};Hn.unstable_scheduleCallback=function(t,e,r){var o=Hn.unstable_now();switch(typeof r=="object"&&r!==null?(r=r.delay,r=typeof r=="number"&&0o?(t.sortIndex=r,oq(Uh,t),ou(dA)===null&&t===ou(Uh)&&(vB?CQ():vB=!0,BB(lq,r-o))):(t.sortIndex=a,oq(dA,t),nd||wQ||(nd=!0,vC(cq))),t};Hn.unstable_wrapCallback=function(t){var e=bo;return function(){var r=bo;bo=e;try{return t.apply(this,arguments)}finally{bo=r}}}});var uq=_((XYt,dCe)=>{"use strict";dCe.exports=gCe()});var mCe=_((ZYt,DB)=>{DB.exports=function(e){var r={},o=U6(),a=ln(),n=uq();function u(v){for(var S="https://reactjs.org/docs/error-decoder.html?invariant="+v,Q=1;QUe||Y[Be]!==ne[Ue])return` -`+Y[Be].replace(" at new "," at ");while(1<=Be&&0<=Ue);break}}}finally{we=!1,Error.prepareStackTrace=Q}return(v=v?v.displayName||v.name:"")?Il(v):""}var wl=[],Bi=-1;function Ls(v){return{current:v}}function Ft(v){0>Bi||(v.current=wl[Bi],wl[Bi]=null,Bi--)}function Bn(v,S){Bi++,wl[Bi]=v.current,v.current=S}var Lo={},ki=Ls(Lo),vi=Ls(!1),sa=Lo;function un(v,S){var Q=v.type.contextTypes;if(!Q)return Lo;var H=v.stateNode;if(H&&H.__reactInternalMemoizedUnmaskedChildContext===S)return H.__reactInternalMemoizedMaskedChildContext;var Y={},ne;for(ne in Q)Y[ne]=S[ne];return H&&(v=v.stateNode,v.__reactInternalMemoizedUnmaskedChildContext=S,v.__reactInternalMemoizedMaskedChildContext=Y),Y}function qn(v){return v=v.childContextTypes,v!=null}function Ec(){Ft(vi),Ft(ki)}function lp(v,S,Q){if(ki.current!==Lo)throw Error(u(168));Bn(ki,S),Bn(vi,Q)}function oa(v,S,Q){var H=v.stateNode;if(v=S.childContextTypes,typeof H.getChildContext!="function")return Q;H=H.getChildContext();for(var Y in H)if(!(Y in v))throw Error(u(108,g(S)||"Unknown",Y));return o({},Q,H)}function aa(v){return v=(v=v.stateNode)&&v.__reactInternalMemoizedMergedChildContext||Lo,sa=ki.current,Bn(ki,v),Bn(vi,vi.current),!0}function la(v,S,Q){var H=v.stateNode;if(!H)throw Error(u(169));Q?(v=oa(v,S,sa),H.__reactInternalMemoizedMergedChildContext=v,Ft(vi),Ft(ki),Bn(ki,v)):Ft(vi),Bn(vi,Q)}var Ze=null,ca=null,mu=n.unstable_now;mu();var Bl=0,dn=8;function No(v){if(1&v)return dn=15,1;if(2&v)return dn=14,2;if(4&v)return dn=13,4;var S=24&v;return S!==0?(dn=12,S):v&32?(dn=11,32):(S=192&v,S!==0?(dn=10,S):v&256?(dn=9,256):(S=3584&v,S!==0?(dn=8,S):v&4096?(dn=7,4096):(S=4186112&v,S!==0?(dn=6,S):(S=62914560&v,S!==0?(dn=5,S):v&67108864?(dn=4,67108864):v&134217728?(dn=3,134217728):(S=805306368&v,S!==0?(dn=2,S):1073741824&v?(dn=1,1073741824):(dn=8,v))))))}function RA(v){switch(v){case 99:return 15;case 98:return 10;case 97:case 96:return 8;case 95:return 2;default:return 0}}function TA(v){switch(v){case 15:case 14:return 99;case 13:case 12:case 11:case 10:return 98;case 9:case 8:case 7:case 6:case 4:case 5:return 97;case 3:case 2:case 1:return 95;case 0:return 90;default:throw Error(u(358,v))}}function Oo(v,S){var Q=v.pendingLanes;if(Q===0)return dn=0;var H=0,Y=0,ne=v.expiredLanes,Be=v.suspendedLanes,Ue=v.pingedLanes;if(ne!==0)H=ne,Y=dn=15;else if(ne=Q&134217727,ne!==0){var ft=ne&~Be;ft!==0?(H=No(ft),Y=dn):(Ue&=ne,Ue!==0&&(H=No(Ue),Y=dn))}else ne=Q&~Be,ne!==0?(H=No(ne),Y=dn):Ue!==0&&(H=No(Ue),Y=dn);if(H===0)return 0;if(H=31-qi(H),H=Q&((0>H?0:1<Q;Q++)S.push(v);return S}function ua(v,S,Q){v.pendingLanes|=S;var H=S-1;v.suspendedLanes&=H,v.pingedLanes&=H,v=v.eventTimes,S=31-qi(S),v[S]=Q}var qi=Math.clz32?Math.clz32:Dl,vl=Math.log,Cc=Math.LN2;function Dl(v){return v===0?32:31-(vl(v)/Cc|0)|0}var Aa=n.unstable_runWithPriority,Di=n.unstable_scheduleCallback,rs=n.unstable_cancelCallback,ja=n.unstable_shouldYield,yu=n.unstable_requestPaint,Sl=n.unstable_now,pi=n.unstable_getCurrentPriorityLevel,Dn=n.unstable_ImmediatePriority,Pl=n.unstable_UserBlockingPriority,Je=n.unstable_NormalPriority,st=n.unstable_LowPriority,vt=n.unstable_IdlePriority,ar={},ee=yu!==void 0?yu:function(){},ye=null,Ne=null,gt=!1,mt=Sl(),Dt=1e4>mt?Sl:function(){return Sl()-mt};function er(){switch(pi()){case Dn:return 99;case Pl:return 98;case Je:return 97;case st:return 96;case vt:return 95;default:throw Error(u(332))}}function sn(v){switch(v){case 99:return Dn;case 98:return Pl;case 97:return Je;case 96:return st;case 95:return vt;default:throw Error(u(332))}}function ei(v,S){return v=sn(v),Aa(v,S)}function Qi(v,S,Q){return v=sn(v),Di(v,S,Q)}function Sn(){if(Ne!==null){var v=Ne;Ne=null,rs(v)}fa()}function fa(){if(!gt&&ye!==null){gt=!0;var v=0;try{var S=ye;ei(99,function(){for(;vPn?(Tn=xr,xr=null):Tn=xr.sibling;var Yr=Xt($e,xr,pt[Pn],zt);if(Yr===null){xr===null&&(xr=Tn);break}v&&xr&&Yr.alternate===null&&S($e,xr),je=ne(Yr,je,Pn),Wn===null?Br=Yr:Wn.sibling=Yr,Wn=Yr,xr=Tn}if(Pn===pt.length)return Q($e,xr),Br;if(xr===null){for(;PnPn?(Tn=xr,xr=null):Tn=xr.sibling;var ti=Xt($e,xr,Yr.value,zt);if(ti===null){xr===null&&(xr=Tn);break}v&&xr&&ti.alternate===null&&S($e,xr),je=ne(ti,je,Pn),Wn===null?Br=ti:Wn.sibling=ti,Wn=ti,xr=Tn}if(Yr.done)return Q($e,xr),Br;if(xr===null){for(;!Yr.done;Pn++,Yr=pt.next())Yr=Tr($e,Yr.value,zt),Yr!==null&&(je=ne(Yr,je,Pn),Wn===null?Br=Yr:Wn.sibling=Yr,Wn=Yr);return Br}for(xr=H($e,xr);!Yr.done;Pn++,Yr=pt.next())Yr=jn(xr,$e,Pn,Yr.value,zt),Yr!==null&&(v&&Yr.alternate!==null&&xr.delete(Yr.key===null?Pn:Yr.key),je=ne(Yr,je,Pn),Wn===null?Br=Yr:Wn.sibling=Yr,Wn=Yr);return v&&xr.forEach(function(Rc){return S($e,Rc)}),Br}return function($e,je,pt,zt){var Br=typeof pt=="object"&&pt!==null&&pt.type===E&&pt.key===null;Br&&(pt=pt.props.children);var Wn=typeof pt=="object"&&pt!==null;if(Wn)switch(pt.$$typeof){case p:e:{for(Wn=pt.key,Br=je;Br!==null;){if(Br.key===Wn){switch(Br.tag){case 7:if(pt.type===E){Q($e,Br.sibling),je=Y(Br,pt.props.children),je.return=$e,$e=je;break e}break;default:if(Br.elementType===pt.type){Q($e,Br.sibling),je=Y(Br,pt.props),je.ref=dt($e,Br,pt),je.return=$e,$e=je;break e}}Q($e,Br);break}else S($e,Br);Br=Br.sibling}pt.type===E?(je=Ru(pt.props.children,$e.mode,zt,pt.key),je.return=$e,$e=je):(zt=k0(pt.type,pt.key,pt.props,null,$e.mode,zt),zt.ref=dt($e,je,pt),zt.return=$e,$e=zt)}return Be($e);case h:e:{for(Br=pt.key;je!==null;){if(je.key===Br)if(je.tag===4&&je.stateNode.containerInfo===pt.containerInfo&&je.stateNode.implementation===pt.implementation){Q($e,je.sibling),je=Y(je,pt.children||[]),je.return=$e,$e=je;break e}else{Q($e,je);break}else S($e,je);je=je.sibling}je=ao(pt,$e.mode,zt),je.return=$e,$e=je}return Be($e)}if(typeof pt=="string"||typeof pt=="number")return pt=""+pt,je!==null&&je.tag===6?(Q($e,je.sibling),je=Y(je,pt),je.return=$e,$e=je):(Q($e,je),je=ZI(pt,$e.mode,zt),je.return=$e,$e=je),Be($e);if(Cu(pt))return li($e,je,pt,zt);if(Ee(pt))return Ea($e,je,pt,zt);if(Wn&&wc($e,pt),typeof pt>"u"&&!Br)switch($e.tag){case 1:case 22:case 0:case 11:case 15:throw Error(u(152,g($e.type)||"Component"))}return Q($e,je)}}var c0=xd(!0),DI=xd(!1),hp={},cr=Ls(hp),Ni=Ls(hp),Iu=Ls(hp);function pa(v){if(v===hp)throw Error(u(174));return v}function u0(v,S){Bn(Iu,S),Bn(Ni,v),Bn(cr,hp),v=ht(S),Ft(cr),Bn(cr,v)}function Bc(){Ft(cr),Ft(Ni),Ft(Iu)}function wu(v){var S=pa(Iu.current),Q=pa(cr.current);S=q(Q,v.type,S),Q!==S&&(Bn(Ni,v),Bn(cr,S))}function wt(v){Ni.current===v&&(Ft(cr),Ft(Ni))}var oi=Ls(0);function UA(v){for(var S=v;S!==null;){if(S.tag===13){var Q=S.memoizedState;if(Q!==null&&(Q=Q.dehydrated,Q===null||pr(Q)||Me(Q)))return S}else if(S.tag===19&&S.memoizedProps.revealOrder!==void 0){if(S.flags&64)return S}else if(S.child!==null){S.child.return=S,S=S.child;continue}if(S===v)break;for(;S.sibling===null;){if(S.return===null||S.return===v)return null;S=S.return}S.sibling.return=S.return,S=S.sibling}return null}var ha=null,Uo=null,ga=!1;function A0(v,S){var Q=ya(5,null,null,0);Q.elementType="DELETED",Q.type="DELETED",Q.stateNode=S,Q.return=v,Q.flags=8,v.lastEffect!==null?(v.lastEffect.nextEffect=Q,v.lastEffect=Q):v.firstEffect=v.lastEffect=Q}function gp(v,S){switch(v.tag){case 5:return S=To(S,v.type,v.pendingProps),S!==null?(v.stateNode=S,!0):!1;case 6:return S=kA(S,v.pendingProps),S!==null?(v.stateNode=S,!0):!1;case 13:return!1;default:return!1}}function f0(v){if(ga){var S=Uo;if(S){var Q=S;if(!gp(v,S)){if(S=ia(Q),!S||!gp(v,S)){v.flags=v.flags&-1025|2,ga=!1,ha=v;return}A0(ha,Q)}ha=v,Uo=dc(S)}else v.flags=v.flags&-1025|2,ga=!1,ha=v}}function bd(v){for(v=v.return;v!==null&&v.tag!==5&&v.tag!==3&&v.tag!==13;)v=v.return;ha=v}function _A(v){if(!X||v!==ha)return!1;if(!ga)return bd(v),ga=!0,!1;var S=v.type;if(v.tag!==5||S!=="head"&&S!=="body"&&!tt(S,v.memoizedProps))for(S=Uo;S;)A0(v,S),S=ia(S);if(bd(v),v.tag===13){if(!X)throw Error(u(316));if(v=v.memoizedState,v=v!==null?v.dehydrated:null,!v)throw Error(u(317));Uo=QA(v)}else Uo=ha?ia(v.stateNode):null;return!0}function p0(){X&&(Uo=ha=null,ga=!1)}var vc=[];function Dc(){for(var v=0;vne))throw Error(u(301));ne+=1,Ci=ji=null,S.updateQueue=null,Bu.current=re,v=Q(H,Y)}while(vu)}if(Bu.current=bt,S=ji!==null&&ji.next!==null,Sc=0,Ci=ji=On=null,HA=!1,S)throw Error(u(300));return v}function Gi(){var v={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Ci===null?On.memoizedState=Ci=v:Ci=Ci.next=v,Ci}function Va(){if(ji===null){var v=On.alternate;v=v!==null?v.memoizedState:null}else v=ji.next;var S=Ci===null?On.memoizedState:Ci.next;if(S!==null)Ci=S,ji=v;else{if(v===null)throw Error(u(310));ji=v,v={memoizedState:ji.memoizedState,baseState:ji.baseState,baseQueue:ji.baseQueue,queue:ji.queue,next:null},Ci===null?On.memoizedState=Ci=v:Ci=Ci.next=v}return Ci}function io(v,S){return typeof S=="function"?S(v):S}function Du(v){var S=Va(),Q=S.queue;if(Q===null)throw Error(u(311));Q.lastRenderedReducer=v;var H=ji,Y=H.baseQueue,ne=Q.pending;if(ne!==null){if(Y!==null){var Be=Y.next;Y.next=ne.next,ne.next=Be}H.baseQueue=Y=ne,Q.pending=null}if(Y!==null){Y=Y.next,H=H.baseState;var Ue=Be=ne=null,ft=Y;do{var jt=ft.lane;if((Sc&jt)===jt)Ue!==null&&(Ue=Ue.next={lane:0,action:ft.action,eagerReducer:ft.eagerReducer,eagerState:ft.eagerState,next:null}),H=ft.eagerReducer===v?ft.eagerState:v(H,ft.action);else{var wr={lane:jt,action:ft.action,eagerReducer:ft.eagerReducer,eagerState:ft.eagerState,next:null};Ue===null?(Be=Ue=wr,ne=H):Ue=Ue.next=wr,On.lanes|=jt,B0|=jt}ft=ft.next}while(ft!==null&&ft!==Y);Ue===null?ne=H:Ue.next=Be,eo(H,S.memoizedState)||(Ye=!0),S.memoizedState=H,S.baseState=ne,S.baseQueue=Ue,Q.lastRenderedState=H}return[S.memoizedState,Q.dispatch]}function Su(v){var S=Va(),Q=S.queue;if(Q===null)throw Error(u(311));Q.lastRenderedReducer=v;var H=Q.dispatch,Y=Q.pending,ne=S.memoizedState;if(Y!==null){Q.pending=null;var Be=Y=Y.next;do ne=v(ne,Be.action),Be=Be.next;while(Be!==Y);eo(ne,S.memoizedState)||(Ye=!0),S.memoizedState=ne,S.baseQueue===null&&(S.baseState=ne),Q.lastRenderedState=ne}return[ne,H]}function Ka(v,S,Q){var H=S._getVersion;H=H(S._source);var Y=y?S._workInProgressVersionPrimary:S._workInProgressVersionSecondary;if(Y!==null?v=Y===H:(v=v.mutableReadLanes,(v=(Sc&v)===v)&&(y?S._workInProgressVersionPrimary=H:S._workInProgressVersionSecondary=H,vc.push(S))),v)return Q(S._source);throw vc.push(S),Error(u(350))}function fn(v,S,Q,H){var Y=Os;if(Y===null)throw Error(u(349));var ne=S._getVersion,Be=ne(S._source),Ue=Bu.current,ft=Ue.useState(function(){return Ka(Y,S,Q)}),jt=ft[1],wr=ft[0];ft=Ci;var Tr=v.memoizedState,Xt=Tr.refs,jn=Xt.getSnapshot,li=Tr.source;Tr=Tr.subscribe;var Ea=On;return v.memoizedState={refs:Xt,source:S,subscribe:H},Ue.useEffect(function(){Xt.getSnapshot=Q,Xt.setSnapshot=jt;var $e=ne(S._source);if(!eo(Be,$e)){$e=Q(S._source),eo(wr,$e)||(jt($e),$e=ss(Ea),Y.mutableReadLanes|=$e&Y.pendingLanes),$e=Y.mutableReadLanes,Y.entangledLanes|=$e;for(var je=Y.entanglements,pt=$e;0Q?98:Q,function(){v(!0)}),ei(97qI&&(S.flags|=64,Y=!0,VA(H,!1),S.lanes=33554432)}else{if(!Y)if(v=UA(ne),v!==null){if(S.flags|=64,Y=!0,v=v.updateQueue,v!==null&&(S.updateQueue=v,S.flags|=4),VA(H,!0),H.tail===null&&H.tailMode==="hidden"&&!ne.alternate&&!ga)return S=S.lastEffect=H.lastEffect,S!==null&&(S.nextEffect=null),null}else 2*Dt()-H.renderingStartTime>qI&&Q!==1073741824&&(S.flags|=64,Y=!0,VA(H,!1),S.lanes=33554432);H.isBackwards?(ne.sibling=S.child,S.child=ne):(v=H.last,v!==null?v.sibling=ne:S.child=ne,H.last=ne)}return H.tail!==null?(v=H.tail,H.rendering=v,H.tail=v.sibling,H.lastEffect=S.lastEffect,H.renderingStartTime=Dt(),v.sibling=null,S=oi.current,Bn(oi,Y?S&1|2:S&1),v):null;case 23:case 24:return KI(),v!==null&&v.memoizedState!==null!=(S.memoizedState!==null)&&H.mode!=="unstable-defer-without-hiding"&&(S.flags|=4),null}throw Error(u(156,S.tag))}function qF(v){switch(v.tag){case 1:qn(v.type)&&Ec();var S=v.flags;return S&4096?(v.flags=S&-4097|64,v):null;case 3:if(Bc(),Ft(vi),Ft(ki),Dc(),S=v.flags,S&64)throw Error(u(285));return v.flags=S&-4097|64,v;case 5:return wt(v),null;case 13:return Ft(oi),S=v.flags,S&4096?(v.flags=S&-4097|64,v):null;case 19:return Ft(oi),null;case 4:return Bc(),null;case 10:return a0(v),null;case 23:case 24:return KI(),null;default:return null}}function m0(v,S){try{var Q="",H=S;do Q+=vI(H),H=H.return;while(H);var Y=Q}catch(ne){Y=` -Error generating stack: `+ne.message+` -`+ne.stack}return{value:v,source:S,stack:Y}}function y0(v,S){try{console.error(S.value)}catch(Q){setTimeout(function(){throw Q})}}var jF=typeof WeakMap=="function"?WeakMap:Map;function bI(v,S,Q){Q=Wa(-1,Q),Q.tag=3,Q.payload={element:null};var H=S.value;return Q.callback=function(){Wd||(Wd=!0,jI=H),y0(v,S)},Q}function E0(v,S,Q){Q=Wa(-1,Q),Q.tag=3;var H=v.type.getDerivedStateFromError;if(typeof H=="function"){var Y=S.value;Q.payload=function(){return y0(v,S),H(Y)}}var ne=v.stateNode;return ne!==null&&typeof ne.componentDidCatch=="function"&&(Q.callback=function(){typeof H!="function"&&(bl===null?bl=new Set([this]):bl.add(this),y0(v,S));var Be=S.stack;this.componentDidCatch(S.value,{componentStack:Be!==null?Be:""})}),Q}var GF=typeof WeakSet=="function"?WeakSet:Set;function kI(v){var S=v.ref;if(S!==null)if(typeof S=="function")try{S(null)}catch(Q){Fu(v,Q)}else S.current=null}function Td(v,S){switch(S.tag){case 0:case 11:case 15:case 22:return;case 1:if(S.flags&256&&v!==null){var Q=v.memoizedProps,H=v.memoizedState;v=S.stateNode,S=v.getSnapshotBeforeUpdate(S.elementType===S.type?Q:to(S.type,Q),H),v.__reactInternalSnapshotBeforeUpdate=S}return;case 3:R&&S.flags&256&&hs(S.stateNode.containerInfo);return;case 5:case 6:case 4:case 17:return}throw Error(u(163))}function wp(v,S){if(S=S.updateQueue,S=S!==null?S.lastEffect:null,S!==null){var Q=S=S.next;do{if((Q.tag&v)===v){var H=Q.destroy;Q.destroy=void 0,H!==void 0&&H()}Q=Q.next}while(Q!==S)}}function uD(v,S,Q){switch(Q.tag){case 0:case 11:case 15:case 22:if(S=Q.updateQueue,S=S!==null?S.lastEffect:null,S!==null){v=S=S.next;do{if((v.tag&3)===3){var H=v.create;v.destroy=H()}v=v.next}while(v!==S)}if(S=Q.updateQueue,S=S!==null?S.lastEffect:null,S!==null){v=S=S.next;do{var Y=v;H=Y.next,Y=Y.tag,Y&4&&Y&1&&(vD(Q,v),$F(Q,v)),v=H}while(v!==S)}return;case 1:v=Q.stateNode,Q.flags&4&&(S===null?v.componentDidMount():(H=Q.elementType===Q.type?S.memoizedProps:to(Q.type,S.memoizedProps),v.componentDidUpdate(H,S.memoizedState,v.__reactInternalSnapshotBeforeUpdate))),S=Q.updateQueue,S!==null&&Sd(Q,S,v);return;case 3:if(S=Q.updateQueue,S!==null){if(v=null,Q.child!==null)switch(Q.child.tag){case 5:v=Re(Q.child.stateNode);break;case 1:v=Q.child.stateNode}Sd(Q,S,v)}return;case 5:v=Q.stateNode,S===null&&Q.flags&4&&Qs(v,Q.type,Q.memoizedProps,Q);return;case 6:return;case 4:return;case 12:return;case 13:X&&Q.memoizedState===null&&(Q=Q.alternate,Q!==null&&(Q=Q.memoizedState,Q!==null&&(Q=Q.dehydrated,Q!==null&&mc(Q))));return;case 19:case 17:case 20:case 21:case 23:case 24:return}throw Error(u(163))}function AD(v,S){if(R)for(var Q=v;;){if(Q.tag===5){var H=Q.stateNode;S?op(H):Rs(Q.stateNode,Q.memoizedProps)}else if(Q.tag===6)H=Q.stateNode,S?ap(H):Nn(H,Q.memoizedProps);else if((Q.tag!==23&&Q.tag!==24||Q.memoizedState===null||Q===v)&&Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===v)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===v)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}}function Ld(v,S){if(ca&&typeof ca.onCommitFiberUnmount=="function")try{ca.onCommitFiberUnmount(Ze,S)}catch{}switch(S.tag){case 0:case 11:case 14:case 15:case 22:if(v=S.updateQueue,v!==null&&(v=v.lastEffect,v!==null)){var Q=v=v.next;do{var H=Q,Y=H.destroy;if(H=H.tag,Y!==void 0)if(H&4)vD(S,Q);else{H=S;try{Y()}catch(ne){Fu(H,ne)}}Q=Q.next}while(Q!==v)}break;case 1:if(kI(S),v=S.stateNode,typeof v.componentWillUnmount=="function")try{v.props=S.memoizedProps,v.state=S.memoizedState,v.componentWillUnmount()}catch(ne){Fu(S,ne)}break;case 5:kI(S);break;case 4:R?gD(v,S):z&&z&&(S=S.stateNode.containerInfo,v=pc(S),xA(S,v))}}function fD(v,S){for(var Q=S;;)if(Ld(v,Q),Q.child===null||R&&Q.tag===4){if(Q===S)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===S)return;Q=Q.return}Q.sibling.return=Q.return,Q=Q.sibling}else Q.child.return=Q,Q=Q.child}function Nd(v){v.alternate=null,v.child=null,v.dependencies=null,v.firstEffect=null,v.lastEffect=null,v.memoizedProps=null,v.memoizedState=null,v.pendingProps=null,v.return=null,v.updateQueue=null}function pD(v){return v.tag===5||v.tag===3||v.tag===4}function hD(v){if(R){e:{for(var S=v.return;S!==null;){if(pD(S))break e;S=S.return}throw Error(u(160))}var Q=S;switch(S=Q.stateNode,Q.tag){case 5:var H=!1;break;case 3:S=S.containerInfo,H=!0;break;case 4:S=S.containerInfo,H=!0;break;default:throw Error(u(161))}Q.flags&16&&(gu(S),Q.flags&=-17);e:t:for(Q=v;;){for(;Q.sibling===null;){if(Q.return===null||pD(Q.return)){Q=null;break e}Q=Q.return}for(Q.sibling.return=Q.return,Q=Q.sibling;Q.tag!==5&&Q.tag!==6&&Q.tag!==18;){if(Q.flags&2||Q.child===null||Q.tag===4)continue t;Q.child.return=Q,Q=Q.child}if(!(Q.flags&2)){Q=Q.stateNode;break e}}H?QI(v,Q,S):FI(v,Q,S)}}function QI(v,S,Q){var H=v.tag,Y=H===5||H===6;if(Y)v=Y?v.stateNode:v.stateNode.instance,S?Fs(Q,v,S):Xs(Q,v);else if(H!==4&&(v=v.child,v!==null))for(QI(v,S,Q),v=v.sibling;v!==null;)QI(v,S,Q),v=v.sibling}function FI(v,S,Q){var H=v.tag,Y=H===5||H===6;if(Y)v=Y?v.stateNode:v.stateNode.instance,S?bi(Q,v,S):$n(Q,v);else if(H!==4&&(v=v.child,v!==null))for(FI(v,S,Q),v=v.sibling;v!==null;)FI(v,S,Q),v=v.sibling}function gD(v,S){for(var Q=S,H=!1,Y,ne;;){if(!H){H=Q.return;e:for(;;){if(H===null)throw Error(u(160));switch(Y=H.stateNode,H.tag){case 5:ne=!1;break e;case 3:Y=Y.containerInfo,ne=!0;break e;case 4:Y=Y.containerInfo,ne=!0;break e}H=H.return}H=!0}if(Q.tag===5||Q.tag===6)fD(v,Q),ne?PA(Y,Q.stateNode):$s(Y,Q.stateNode);else if(Q.tag===4){if(Q.child!==null){Y=Q.stateNode.containerInfo,ne=!0,Q.child.return=Q,Q=Q.child;continue}}else if(Ld(v,Q),Q.child!==null){Q.child.return=Q,Q=Q.child;continue}if(Q===S)break;for(;Q.sibling===null;){if(Q.return===null||Q.return===S)return;Q=Q.return,Q.tag===4&&(H=!1)}Q.sibling.return=Q.return,Q=Q.sibling}}function RI(v,S){if(R){switch(S.tag){case 0:case 11:case 14:case 15:case 22:wp(3,S);return;case 1:return;case 5:var Q=S.stateNode;if(Q!=null){var H=S.memoizedProps;v=v!==null?v.memoizedProps:H;var Y=S.type,ne=S.updateQueue;S.updateQueue=null,ne!==null&&Zs(Q,ne,Y,v,H,S)}return;case 6:if(S.stateNode===null)throw Error(u(162));Q=S.memoizedProps,Hi(S.stateNode,v!==null?v.memoizedProps:Q,Q);return;case 3:X&&(S=S.stateNode,S.hydrate&&(S.hydrate=!1,FA(S.containerInfo)));return;case 12:return;case 13:dD(S),C0(S);return;case 19:C0(S);return;case 17:return;case 23:case 24:AD(S,S.memoizedState!==null);return}throw Error(u(163))}switch(S.tag){case 0:case 11:case 14:case 15:case 22:wp(3,S);return;case 12:return;case 13:dD(S),C0(S);return;case 19:C0(S);return;case 3:X&&(Q=S.stateNode,Q.hydrate&&(Q.hydrate=!1,FA(Q.containerInfo)));break;case 23:case 24:return}e:if(z){switch(S.tag){case 1:case 5:case 6:case 20:break e;case 3:case 4:S=S.stateNode,xA(S.containerInfo,S.pendingChildren);break e}throw Error(u(163))}}function dD(v){v.memoizedState!==null&&(HI=Dt(),R&&AD(v.child,!0))}function C0(v){var S=v.updateQueue;if(S!==null){v.updateQueue=null;var Q=v.stateNode;Q===null&&(Q=v.stateNode=new GF),S.forEach(function(H){var Y=tR.bind(null,v,H);Q.has(H)||(Q.add(H),H.then(Y,Y))})}}function WF(v,S){return v!==null&&(v=v.memoizedState,v===null||v.dehydrated!==null)?(S=S.memoizedState,S!==null&&S.dehydrated===null):!1}var Od=0,Md=1,Ud=2,I0=3,_d=4;if(typeof Symbol=="function"&&Symbol.for){var w0=Symbol.for;Od=w0("selector.component"),Md=w0("selector.has_pseudo_class"),Ud=w0("selector.role"),I0=w0("selector.test_id"),_d=w0("selector.text")}function Hd(v){var S=$(v);if(S!=null){if(typeof S.memoizedProps["data-testname"]!="string")throw Error(u(364));return S}if(v=nr(v),v===null)throw Error(u(362));return v.stateNode.current}function xu(v,S){switch(S.$$typeof){case Od:if(v.type===S.value)return!0;break;case Md:e:{S=S.value,v=[v,0];for(var Q=0;Q";case Md:return":has("+(bu(v)||"")+")";case Ud:return'[role="'+v.value+'"]';case _d:return'"'+v.value+'"';case I0:return'[data-testname="'+v.value+'"]';default:throw Error(u(365,v))}}function TI(v,S){var Q=[];v=[v,0];for(var H=0;HY&&(Y=Be),Q&=~ne}if(Q=Y,Q=Dt()-Q,Q=(120>Q?120:480>Q?480:1080>Q?1080:1920>Q?1920:3e3>Q?3e3:4320>Q?4320:1960*VF(Q/1960))-Q,10 component higher in the tree to provide a loading indicator or placeholder to display.`)}is!==5&&(is=2),ft=m0(ft,Ue),Xt=Be;do{switch(Xt.tag){case 3:ne=ft,Xt.flags|=4096,S&=-S,Xt.lanes|=S;var Wn=bI(Xt,ne,S);Dd(Xt,Wn);break e;case 1:ne=ft;var xr=Xt.type,Pn=Xt.stateNode;if(!(Xt.flags&64)&&(typeof xr.getDerivedStateFromError=="function"||Pn!==null&&typeof Pn.componentDidCatch=="function"&&(bl===null||!bl.has(Pn)))){Xt.flags|=4096,S&=-S,Xt.lanes|=S;var Tn=E0(Xt,ne,S);Dd(Xt,Tn);break e}}Xt=Xt.return}while(Xt!==null)}BD(Q)}catch(Yr){S=Yr,Oi===Q&&Q!==null&&(Oi=Q=Q.return);continue}break}while(!0)}function ID(){var v=jd.current;return jd.current=bt,v===null?bt:v}function b0(v,S){var Q=Pr;Pr|=16;var H=ID();Os===v&&ms===S||Sp(v,S);do try{JF();break}catch(Y){CD(v,Y)}while(!0);if(s0(),Pr=Q,jd.current=H,Oi!==null)throw Error(u(261));return Os=null,ms=0,is}function JF(){for(;Oi!==null;)wD(Oi)}function zF(){for(;Oi!==null&&!ja();)wD(Oi)}function wD(v){var S=PD(v.alternate,v,KA);v.memoizedProps=v.pendingProps,S===null?BD(v):Oi=S,NI.current=null}function BD(v){var S=v;do{var Q=S.alternate;if(v=S.return,S.flags&2048){if(Q=qF(S),Q!==null){Q.flags&=2047,Oi=Q;return}v!==null&&(v.firstEffect=v.lastEffect=null,v.flags|=2048)}else{if(Q=HF(Q,S,KA),Q!==null){Oi=Q;return}if(Q=S,Q.tag!==24&&Q.tag!==23||Q.memoizedState===null||KA&1073741824||!(Q.mode&4)){for(var H=0,Y=Q.child;Y!==null;)H|=Y.lanes|Y.childLanes,Y=Y.sibling;Q.childLanes=H}v!==null&&!(v.flags&2048)&&(v.firstEffect===null&&(v.firstEffect=S.firstEffect),S.lastEffect!==null&&(v.lastEffect!==null&&(v.lastEffect.nextEffect=S.firstEffect),v.lastEffect=S.lastEffect),1Dt()-HI?Sp(v,0):UI|=Q),qo(v,S)}function tR(v,S){var Q=v.stateNode;Q!==null&&Q.delete(S),S=0,S===0&&(S=v.mode,S&2?S&4?(kc===0&&(kc=Bp),S=vn(62914560&~kc),S===0&&(S=4194304)):S=er()===99?1:2:S=1),Q=oo(),v=Kd(v,S),v!==null&&(ua(v,S,Q),qo(v,Q))}var PD;PD=function(v,S,Q){var H=S.lanes;if(v!==null)if(v.memoizedProps!==S.pendingProps||vi.current)Ye=!0;else if(Q&H)Ye=!!(v.flags&16384);else{switch(Ye=!1,S.tag){case 3:Fd(S),p0();break;case 5:wu(S);break;case 1:qn(S.type)&&aa(S);break;case 4:u0(S,S.stateNode.containerInfo);break;case 10:o0(S,S.memoizedProps.value);break;case 13:if(S.memoizedState!==null)return Q&S.child.childLanes?PI(v,S,Q):(Bn(oi,oi.current&1),S=Mn(v,S,Q),S!==null?S.sibling:null);Bn(oi,oi.current&1);break;case 19:if(H=(Q&S.childLanes)!==0,v.flags&64){if(H)return cD(v,S,Q);S.flags|=64}var Y=S.memoizedState;if(Y!==null&&(Y.rendering=null,Y.tail=null,Y.lastEffect=null),Bn(oi,oi.current),H)break;return null;case 23:case 24:return S.lanes=0,ai(v,S,Q)}return Mn(v,S,Q)}else Ye=!1;switch(S.lanes=0,S.tag){case 2:if(H=S.type,v!==null&&(v.alternate=null,S.alternate=null,S.flags|=2),v=S.pendingProps,Y=un(S,ki.current),Eu(S,Q),Y=g0(null,S,H,v,Y,Q),S.flags|=1,typeof Y=="object"&&Y!==null&&typeof Y.render=="function"&&Y.$$typeof===void 0){if(S.tag=1,S.memoizedState=null,S.updateQueue=null,qn(H)){var ne=!0;aa(S)}else ne=!1;S.memoizedState=Y.state!==null&&Y.state!==void 0?Y.state:null,pp(S);var Be=H.getDerivedStateFromProps;typeof Be=="function"&&NA(S,H,Be,v),Y.updater=OA,S.stateNode=Y,Y._reactInternals=S,no(S,H,v,Q),S=SI(null,S,H,!0,ne,Q)}else S.tag=0,At(null,S,Y,Q),S=S.child;return S;case 16:Y=S.elementType;e:{switch(v!==null&&(v.alternate=null,S.alternate=null,S.flags|=2),v=S.pendingProps,ne=Y._init,Y=ne(Y._payload),S.type=Y,ne=S.tag=nR(Y),v=to(Y,v),ne){case 0:S=GA(null,S,Y,v,Q);break e;case 1:S=lD(null,S,Y,v,Q);break e;case 11:S=hr(null,S,Y,v,Q);break e;case 14:S=Ir(null,S,Y,to(Y.type,v),H,Q);break e}throw Error(u(306,Y,""))}return S;case 0:return H=S.type,Y=S.pendingProps,Y=S.elementType===H?Y:to(H,Y),GA(v,S,H,Y,Q);case 1:return H=S.type,Y=S.pendingProps,Y=S.elementType===H?Y:to(H,Y),lD(v,S,H,Y,Q);case 3:if(Fd(S),H=S.updateQueue,v===null||H===null)throw Error(u(282));if(H=S.pendingProps,Y=S.memoizedState,Y=Y!==null?Y.element:null,l0(v,S),LA(S,H,null,Q),H=S.memoizedState.element,H===Y)p0(),S=Mn(v,S,Q);else{if(Y=S.stateNode,(ne=Y.hydrate)&&(X?(Uo=dc(S.stateNode.containerInfo),ha=S,ne=ga=!0):ne=!1),ne){if(X&&(v=Y.mutableSourceEagerHydrationData,v!=null))for(Y=0;Y=jt&&ne>=Tr&&Y<=wr&&Be<=Xt){v.splice(S,1);break}else if(H!==jt||Q.width!==ft.width||XtBe){if(!(ne!==Tr||Q.height!==ft.height||wrY)){jt>H&&(ft.width+=jt-H,ft.x=H),wrne&&(ft.height+=Tr-ne,ft.y=ne),XtQ&&(Q=Be)),Be ")+` - -No matching component was found for: - `)+v.join(" > ")}return null},r.getPublicRootInstance=function(v){if(v=v.current,!v.child)return null;switch(v.child.tag){case 5:return Re(v.child.stateNode);default:return v.child.stateNode}},r.injectIntoDevTools=function(v){if(v={bundleType:v.bundleType,version:v.version,rendererPackageName:v.rendererPackageName,rendererConfig:v.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:A.ReactCurrentDispatcher,findHostInstanceByFiber:sR,findFiberByHostInstance:v.findFiberByHostInstance||oR,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")v=!1;else{var S=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!S.isDisabled&&S.supportsFiber)try{Ze=S.inject(v),ca=S}catch{}v=!0}return v},r.observeVisibleRects=function(v,S,Q,H){if(!qt)throw Error(u(363));v=LI(v,S);var Y=Xr(v,Q,H).disconnect;return{disconnect:function(){Y()}}},r.registerMutableSourceForHydration=function(v,S){var Q=S._getVersion;Q=Q(S._source),v.mutableSourceEagerHydrationData==null?v.mutableSourceEagerHydrationData=[S,Q]:v.mutableSourceEagerHydrationData.push(S,Q)},r.runWithPriority=function(v,S){var Q=Bl;try{return Bl=v,S()}finally{Bl=Q}},r.shouldSuspend=function(){return!1},r.unbatchedUpdates=function(v,S){var Q=Pr;Pr&=-2,Pr|=8;try{return v(S)}finally{Pr=Q,Pr===0&&(ku(),Sn())}},r.updateContainer=function(v,S,Q,H){var Y=S.current,ne=oo(),Be=ss(Y);e:if(Q){Q=Q._reactInternals;t:{if(me(Q)!==Q||Q.tag!==1)throw Error(u(170));var Ue=Q;do{switch(Ue.tag){case 3:Ue=Ue.stateNode.context;break t;case 1:if(qn(Ue.type)){Ue=Ue.stateNode.__reactInternalMemoizedMergedChildContext;break t}}Ue=Ue.return}while(Ue!==null);throw Error(u(171))}if(Q.tag===1){var ft=Q.type;if(qn(ft)){Q=oa(Q,ft,Ue);break e}}Q=Ue}else Q=Lo;return S.context===null?S.context=Q:S.pendingContext=Q,S=Wa(ne,Be),S.payload={element:v},H=H===void 0?null:H,H!==null&&(S.callback=H),Ya(Y,S),Xa(Y,Be,ne),Be},r}});var ECe=_(($Yt,yCe)=>{"use strict";yCe.exports=mCe()});var ICe=_((eVt,CCe)=>{"use strict";var Syt={ALIGN_COUNT:8,ALIGN_AUTO:0,ALIGN_FLEX_START:1,ALIGN_CENTER:2,ALIGN_FLEX_END:3,ALIGN_STRETCH:4,ALIGN_BASELINE:5,ALIGN_SPACE_BETWEEN:6,ALIGN_SPACE_AROUND:7,DIMENSION_COUNT:2,DIMENSION_WIDTH:0,DIMENSION_HEIGHT:1,DIRECTION_COUNT:3,DIRECTION_INHERIT:0,DIRECTION_LTR:1,DIRECTION_RTL:2,DISPLAY_COUNT:2,DISPLAY_FLEX:0,DISPLAY_NONE:1,EDGE_COUNT:9,EDGE_LEFT:0,EDGE_TOP:1,EDGE_RIGHT:2,EDGE_BOTTOM:3,EDGE_START:4,EDGE_END:5,EDGE_HORIZONTAL:6,EDGE_VERTICAL:7,EDGE_ALL:8,EXPERIMENTAL_FEATURE_COUNT:1,EXPERIMENTAL_FEATURE_WEB_FLEX_BASIS:0,FLEX_DIRECTION_COUNT:4,FLEX_DIRECTION_COLUMN:0,FLEX_DIRECTION_COLUMN_REVERSE:1,FLEX_DIRECTION_ROW:2,FLEX_DIRECTION_ROW_REVERSE:3,JUSTIFY_COUNT:6,JUSTIFY_FLEX_START:0,JUSTIFY_CENTER:1,JUSTIFY_FLEX_END:2,JUSTIFY_SPACE_BETWEEN:3,JUSTIFY_SPACE_AROUND:4,JUSTIFY_SPACE_EVENLY:5,LOG_LEVEL_COUNT:6,LOG_LEVEL_ERROR:0,LOG_LEVEL_WARN:1,LOG_LEVEL_INFO:2,LOG_LEVEL_DEBUG:3,LOG_LEVEL_VERBOSE:4,LOG_LEVEL_FATAL:5,MEASURE_MODE_COUNT:3,MEASURE_MODE_UNDEFINED:0,MEASURE_MODE_EXACTLY:1,MEASURE_MODE_AT_MOST:2,NODE_TYPE_COUNT:2,NODE_TYPE_DEFAULT:0,NODE_TYPE_TEXT:1,OVERFLOW_COUNT:3,OVERFLOW_VISIBLE:0,OVERFLOW_HIDDEN:1,OVERFLOW_SCROLL:2,POSITION_TYPE_COUNT:2,POSITION_TYPE_RELATIVE:0,POSITION_TYPE_ABSOLUTE:1,PRINT_OPTIONS_COUNT:3,PRINT_OPTIONS_LAYOUT:1,PRINT_OPTIONS_STYLE:2,PRINT_OPTIONS_CHILDREN:4,UNIT_COUNT:4,UNIT_UNDEFINED:0,UNIT_POINT:1,UNIT_PERCENT:2,UNIT_AUTO:3,WRAP_COUNT:3,WRAP_NO_WRAP:0,WRAP_WRAP:1,WRAP_WRAP_REVERSE:2};CCe.exports=Syt});var DCe=_((tVt,vCe)=>{"use strict";var Pyt=Object.assign||function(t){for(var e=1;e"}}]),t}(),wCe=function(){BQ(t,null,[{key:"fromJS",value:function(r){var o=r.width,a=r.height;return new t(o,a)}}]);function t(e,r){fq(this,t),this.width=e,this.height=r}return BQ(t,[{key:"fromJS",value:function(r){r(this.width,this.height)}},{key:"toString",value:function(){return""}}]),t}(),BCe=function(){function t(e,r){fq(this,t),this.unit=e,this.value=r}return BQ(t,[{key:"fromJS",value:function(r){r(this.unit,this.value)}},{key:"toString",value:function(){switch(this.unit){case au.UNIT_POINT:return String(this.value);case au.UNIT_PERCENT:return this.value+"%";case au.UNIT_AUTO:return"auto";default:return this.value+"?"}}},{key:"valueOf",value:function(){return this.value}}]),t}();vCe.exports=function(t,e){function r(u,A,p){var h=u[A];u[A]=function(){for(var E=arguments.length,w=Array(E),D=0;D1?w-1:0),b=1;b1&&arguments[1]!==void 0?arguments[1]:NaN,p=arguments.length>2&&arguments[2]!==void 0?arguments[2]:NaN,h=arguments.length>3&&arguments[3]!==void 0?arguments[3]:au.DIRECTION_LTR;return u.call(this,A,p,h)}),Pyt({Config:e.Config,Node:e.Node,Layout:t("Layout",xyt),Size:t("Size",wCe),Value:t("Value",BCe),getInstanceCount:function(){return e.getInstanceCount.apply(e,arguments)}},au)}});var SCe=_((exports,module)=>{(function(t,e){typeof define=="function"&&define.amd?define([],function(){return e}):typeof module=="object"&&module.exports?module.exports=e:(t.nbind=t.nbind||{}).init=e})(exports,function(Module,cb){typeof Module=="function"&&(cb=Module,Module={}),Module.onRuntimeInitialized=function(t,e){return function(){t&&t.apply(this,arguments);try{Module.ccall("nbind_init")}catch(r){e(r);return}e(null,{bind:Module._nbind_value,reflect:Module.NBind.reflect,queryType:Module.NBind.queryType,toggleLightGC:Module.toggleLightGC,lib:Module})}}(Module.onRuntimeInitialized,cb);var Module;Module||(Module=(typeof Module<"u"?Module:null)||{});var moduleOverrides={};for(var key in Module)Module.hasOwnProperty(key)&&(moduleOverrides[key]=Module[key]);var ENVIRONMENT_IS_WEB=!1,ENVIRONMENT_IS_WORKER=!1,ENVIRONMENT_IS_NODE=!1,ENVIRONMENT_IS_SHELL=!1;if(Module.ENVIRONMENT)if(Module.ENVIRONMENT==="WEB")ENVIRONMENT_IS_WEB=!0;else if(Module.ENVIRONMENT==="WORKER")ENVIRONMENT_IS_WORKER=!0;else if(Module.ENVIRONMENT==="NODE")ENVIRONMENT_IS_NODE=!0;else if(Module.ENVIRONMENT==="SHELL")ENVIRONMENT_IS_SHELL=!0;else throw new Error("The provided Module['ENVIRONMENT'] value is not valid. It must be one of: WEB|WORKER|NODE|SHELL.");else ENVIRONMENT_IS_WEB=typeof window=="object",ENVIRONMENT_IS_WORKER=typeof importScripts=="function",ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof ve=="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER,ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){Module.print||(Module.print=console.log),Module.printErr||(Module.printErr=console.warn);var nodeFS,nodePath;Module.read=function(e,r){nodeFS||(nodeFS={}("")),nodePath||(nodePath={}("")),e=nodePath.normalize(e);var o=nodeFS.readFileSync(e);return r?o:o.toString()},Module.readBinary=function(e){var r=Module.read(e,!0);return r.buffer||(r=new Uint8Array(r)),assert(r.buffer),r},Module.load=function(e){globalEval(read(e))},Module.thisProgram||(process.argv.length>1?Module.thisProgram=process.argv[1].replace(/\\/g,"/"):Module.thisProgram="unknown-program"),Module.arguments=process.argv.slice(2),typeof module<"u"&&(module.exports=Module),Module.inspect=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL)Module.print||(Module.print=print),typeof printErr<"u"&&(Module.printErr=printErr),typeof read<"u"?Module.read=read:Module.read=function(){throw"no read() available"},Module.readBinary=function(e){if(typeof readbuffer=="function")return new Uint8Array(readbuffer(e));var r=read(e,"binary");return assert(typeof r=="object"),r},typeof scriptArgs<"u"?Module.arguments=scriptArgs:typeof arguments<"u"&&(Module.arguments=arguments),typeof quit=="function"&&(Module.quit=function(t,e){quit(t)});else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(Module.read=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.send(null),r.responseText},ENVIRONMENT_IS_WORKER&&(Module.readBinary=function(e){var r=new XMLHttpRequest;return r.open("GET",e,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),Module.readAsync=function(e,r,o){var a=new XMLHttpRequest;a.open("GET",e,!0),a.responseType="arraybuffer",a.onload=function(){a.status==200||a.status==0&&a.response?r(a.response):o()},a.onerror=o,a.send(null)},typeof arguments<"u"&&(Module.arguments=arguments),typeof console<"u")Module.print||(Module.print=function(e){console.log(e)}),Module.printErr||(Module.printErr=function(e){console.warn(e)});else{var TRY_USE_DUMP=!1;Module.print||(Module.print=TRY_USE_DUMP&&typeof dump<"u"?function(t){dump(t)}:function(t){})}ENVIRONMENT_IS_WORKER&&(Module.load=importScripts),typeof Module.setWindowTitle>"u"&&(Module.setWindowTitle=function(t){document.title=t})}else throw"Unknown runtime environment. Where are we?";function globalEval(t){eval.call(null,t)}!Module.load&&Module.read&&(Module.load=function(e){globalEval(Module.read(e))}),Module.print||(Module.print=function(){}),Module.printErr||(Module.printErr=Module.print),Module.arguments||(Module.arguments=[]),Module.thisProgram||(Module.thisProgram="./this.program"),Module.quit||(Module.quit=function(t,e){throw e}),Module.print=Module.print,Module.printErr=Module.printErr,Module.preRun=[],Module.postRun=[];for(var key in moduleOverrides)moduleOverrides.hasOwnProperty(key)&&(Module[key]=moduleOverrides[key]);moduleOverrides=void 0;var Runtime={setTempRet0:function(t){return tempRet0=t,t},getTempRet0:function(){return tempRet0},stackSave:function(){return STACKTOP},stackRestore:function(t){STACKTOP=t},getNativeTypeSize:function(t){switch(t){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(t[t.length-1]==="*")return Runtime.QUANTUM_SIZE;if(t[0]==="i"){var e=parseInt(t.substr(1));return assert(e%8===0),e/8}else return 0}}},getNativeFieldSize:function(t){return Math.max(Runtime.getNativeTypeSize(t),Runtime.QUANTUM_SIZE)},STACK_ALIGN:16,prepVararg:function(t,e){return e==="double"||e==="i64"?t&7&&(assert((t&7)===4),t+=4):assert((t&3)===0),t},getAlignSize:function(t,e,r){return!r&&(t=="i64"||t=="double")?8:t?Math.min(e||(t?Runtime.getNativeFieldSize(t):0),Runtime.QUANTUM_SIZE):Math.min(e,8)},dynCall:function(t,e,r){return r&&r.length?Module["dynCall_"+t].apply(null,[e].concat(r)):Module["dynCall_"+t].call(null,e)},functionPointers:[],addFunction:function(t){for(var e=0;e>2],r=(e+t+15|0)&-16;if(HEAP32[DYNAMICTOP_PTR>>2]=r,r>=TOTAL_MEMORY){var o=enlargeMemory();if(!o)return HEAP32[DYNAMICTOP_PTR>>2]=e,0}return e},alignMemory:function(t,e){var r=t=Math.ceil(t/(e||16))*(e||16);return r},makeBigInt:function(t,e,r){var o=r?+(t>>>0)+ +(e>>>0)*4294967296:+(t>>>0)+ +(e|0)*4294967296;return o},GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module.Runtime=Runtime;var ABORT=0,EXITSTATUS=0;function assert(t,e){t||abort("Assertion failed: "+e)}function getCFunc(ident){var func=Module["_"+ident];if(!func)try{func=eval("_"+ident)}catch(t){}return assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)"),func}var cwrap,ccall;(function(){var JSfuncs={stackSave:function(){Runtime.stackSave()},stackRestore:function(){Runtime.stackRestore()},arrayToC:function(t){var e=Runtime.stackAlloc(t.length);return writeArrayToMemory(t,e),e},stringToC:function(t){var e=0;if(t!=null&&t!==0){var r=(t.length<<2)+1;e=Runtime.stackAlloc(r),stringToUTF8(t,e,r)}return e}},toC={string:JSfuncs.stringToC,array:JSfuncs.arrayToC};ccall=function(e,r,o,a,n){var u=getCFunc(e),A=[],p=0;if(a)for(var h=0;h>0]=e;break;case"i8":HEAP8[t>>0]=e;break;case"i16":HEAP16[t>>1]=e;break;case"i32":HEAP32[t>>2]=e;break;case"i64":tempI64=[e>>>0,(tempDouble=e,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[t>>2]=tempI64[0],HEAP32[t+4>>2]=tempI64[1];break;case"float":HEAPF32[t>>2]=e;break;case"double":HEAPF64[t>>3]=e;break;default:abort("invalid type for setValue: "+r)}}Module.setValue=setValue;function getValue(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return HEAP8[t>>0];case"i8":return HEAP8[t>>0];case"i16":return HEAP16[t>>1];case"i32":return HEAP32[t>>2];case"i64":return HEAP32[t>>2];case"float":return HEAPF32[t>>2];case"double":return HEAPF64[t>>3];default:abort("invalid type for setValue: "+e)}return null}Module.getValue=getValue;var ALLOC_NORMAL=0,ALLOC_STACK=1,ALLOC_STATIC=2,ALLOC_DYNAMIC=3,ALLOC_NONE=4;Module.ALLOC_NORMAL=ALLOC_NORMAL,Module.ALLOC_STACK=ALLOC_STACK,Module.ALLOC_STATIC=ALLOC_STATIC,Module.ALLOC_DYNAMIC=ALLOC_DYNAMIC,Module.ALLOC_NONE=ALLOC_NONE;function allocate(t,e,r,o){var a,n;typeof t=="number"?(a=!0,n=t):(a=!1,n=t.length);var u=typeof e=="string"?e:null,A;if(r==ALLOC_NONE?A=o:A=[typeof _malloc=="function"?_malloc:Runtime.staticAlloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][r===void 0?ALLOC_STATIC:r](Math.max(n,u?1:e.length)),a){var o=A,p;for(assert((A&3)==0),p=A+(n&-4);o>2]=0;for(p=A+n;o>0]=0;return A}if(u==="i8")return t.subarray||t.slice?HEAPU8.set(t,A):HEAPU8.set(new Uint8Array(t),A),A;for(var h=0,E,w,D;h>0],r|=o,!(o==0&&!e||(a++,e&&a==e)););e||(e=a);var n="";if(r<128){for(var u=1024,A;e>0;)A=String.fromCharCode.apply(String,HEAPU8.subarray(t,t+Math.min(e,u))),n=n?n+A:A,t+=u,e-=u;return n}return Module.UTF8ToString(t)}Module.Pointer_stringify=Pointer_stringify;function AsciiToString(t){for(var e="";;){var r=HEAP8[t++>>0];if(!r)return e;e+=String.fromCharCode(r)}}Module.AsciiToString=AsciiToString;function stringToAscii(t,e){return writeAsciiToMemory(t,e,!1)}Module.stringToAscii=stringToAscii;var UTF8Decoder=typeof TextDecoder<"u"?new TextDecoder("utf8"):void 0;function UTF8ArrayToString(t,e){for(var r=e;t[r];)++r;if(r-e>16&&t.subarray&&UTF8Decoder)return UTF8Decoder.decode(t.subarray(e,r));for(var o,a,n,u,A,p,h="";;){if(o=t[e++],!o)return h;if(!(o&128)){h+=String.fromCharCode(o);continue}if(a=t[e++]&63,(o&224)==192){h+=String.fromCharCode((o&31)<<6|a);continue}if(n=t[e++]&63,(o&240)==224?o=(o&15)<<12|a<<6|n:(u=t[e++]&63,(o&248)==240?o=(o&7)<<18|a<<12|n<<6|u:(A=t[e++]&63,(o&252)==248?o=(o&3)<<24|a<<18|n<<12|u<<6|A:(p=t[e++]&63,o=(o&1)<<30|a<<24|n<<18|u<<12|A<<6|p))),o<65536)h+=String.fromCharCode(o);else{var E=o-65536;h+=String.fromCharCode(55296|E>>10,56320|E&1023)}}}Module.UTF8ArrayToString=UTF8ArrayToString;function UTF8ToString(t){return UTF8ArrayToString(HEAPU8,t)}Module.UTF8ToString=UTF8ToString;function stringToUTF8Array(t,e,r,o){if(!(o>0))return 0;for(var a=r,n=r+o-1,u=0;u=55296&&A<=57343&&(A=65536+((A&1023)<<10)|t.charCodeAt(++u)&1023),A<=127){if(r>=n)break;e[r++]=A}else if(A<=2047){if(r+1>=n)break;e[r++]=192|A>>6,e[r++]=128|A&63}else if(A<=65535){if(r+2>=n)break;e[r++]=224|A>>12,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=2097151){if(r+3>=n)break;e[r++]=240|A>>18,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else if(A<=67108863){if(r+4>=n)break;e[r++]=248|A>>24,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}else{if(r+5>=n)break;e[r++]=252|A>>30,e[r++]=128|A>>24&63,e[r++]=128|A>>18&63,e[r++]=128|A>>12&63,e[r++]=128|A>>6&63,e[r++]=128|A&63}}return e[r]=0,r-a}Module.stringToUTF8Array=stringToUTF8Array;function stringToUTF8(t,e,r){return stringToUTF8Array(t,HEAPU8,e,r)}Module.stringToUTF8=stringToUTF8;function lengthBytesUTF8(t){for(var e=0,r=0;r=55296&&o<=57343&&(o=65536+((o&1023)<<10)|t.charCodeAt(++r)&1023),o<=127?++e:o<=2047?e+=2:o<=65535?e+=3:o<=2097151?e+=4:o<=67108863?e+=5:e+=6}return e}Module.lengthBytesUTF8=lengthBytesUTF8;var UTF16Decoder=typeof TextDecoder<"u"?new TextDecoder("utf-16le"):void 0;function demangle(t){var e=Module.___cxa_demangle||Module.__cxa_demangle;if(e){try{var r=t.substr(1),o=lengthBytesUTF8(r)+1,a=_malloc(o);stringToUTF8(r,a,o);var n=_malloc(4),u=e(a,0,0,n);if(getValue(n,"i32")===0&&u)return Pointer_stringify(u)}catch{}finally{a&&_free(a),n&&_free(n),u&&_free(u)}return t}return Runtime.warnOnce("warning: build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling"),t}function demangleAll(t){var e=/__Z[\w\d_]+/g;return t.replace(e,function(r){var o=demangle(r);return r===o?r:r+" ["+o+"]"})}function jsStackTrace(){var t=new Error;if(!t.stack){try{throw new Error(0)}catch(e){t=e}if(!t.stack)return"(no stack trace available)"}return t.stack.toString()}function stackTrace(){var t=jsStackTrace();return Module.extraStackTrace&&(t+=` -`+Module.extraStackTrace()),demangleAll(t)}Module.stackTrace=stackTrace;var HEAP,buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferViews(){Module.HEAP8=HEAP8=new Int8Array(buffer),Module.HEAP16=HEAP16=new Int16Array(buffer),Module.HEAP32=HEAP32=new Int32Array(buffer),Module.HEAPU8=HEAPU8=new Uint8Array(buffer),Module.HEAPU16=HEAPU16=new Uint16Array(buffer),Module.HEAPU32=HEAPU32=new Uint32Array(buffer),Module.HEAPF32=HEAPF32=new Float32Array(buffer),Module.HEAPF64=HEAPF64=new Float64Array(buffer)}var STATIC_BASE,STATICTOP,staticSealed,STACK_BASE,STACKTOP,STACK_MAX,DYNAMIC_BASE,DYNAMICTOP_PTR;STATIC_BASE=STATICTOP=STACK_BASE=STACKTOP=STACK_MAX=DYNAMIC_BASE=DYNAMICTOP_PTR=0,staticSealed=!1;function abortOnCannotGrowMemory(){abort("Cannot enlarge memory arrays. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+TOTAL_MEMORY+", (2) compile with -s ALLOW_MEMORY_GROWTH=1 which allows increasing the size at runtime but prevents some optimizations, (3) set Module.TOTAL_MEMORY to a higher value before the program runs, or (4) if you want malloc to return NULL (0) instead of this abort, compile with -s ABORTING_MALLOC=0 ")}function enlargeMemory(){abortOnCannotGrowMemory()}var TOTAL_STACK=Module.TOTAL_STACK||5242880,TOTAL_MEMORY=Module.TOTAL_MEMORY||134217728;TOTAL_MEMORY0;){var e=t.shift();if(typeof e=="function"){e();continue}var r=e.func;typeof r=="number"?e.arg===void 0?Module.dynCall_v(r):Module.dynCall_vi(r,e.arg):r(e.arg===void 0?null:e.arg)}}var __ATPRERUN__=[],__ATINIT__=[],__ATMAIN__=[],__ATEXIT__=[],__ATPOSTRUN__=[],runtimeInitialized=!1,runtimeExited=!1;function preRun(){if(Module.preRun)for(typeof Module.preRun=="function"&&(Module.preRun=[Module.preRun]);Module.preRun.length;)addOnPreRun(Module.preRun.shift());callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){runtimeInitialized||(runtimeInitialized=!0,callRuntimeCallbacks(__ATINIT__))}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__),runtimeExited=!0}function postRun(){if(Module.postRun)for(typeof Module.postRun=="function"&&(Module.postRun=[Module.postRun]);Module.postRun.length;)addOnPostRun(Module.postRun.shift());callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(t){__ATPRERUN__.unshift(t)}Module.addOnPreRun=addOnPreRun;function addOnInit(t){__ATINIT__.unshift(t)}Module.addOnInit=addOnInit;function addOnPreMain(t){__ATMAIN__.unshift(t)}Module.addOnPreMain=addOnPreMain;function addOnExit(t){__ATEXIT__.unshift(t)}Module.addOnExit=addOnExit;function addOnPostRun(t){__ATPOSTRUN__.unshift(t)}Module.addOnPostRun=addOnPostRun;function intArrayFromString(t,e,r){var o=r>0?r:lengthBytesUTF8(t)+1,a=new Array(o),n=stringToUTF8Array(t,a,0,a.length);return e&&(a.length=n),a}Module.intArrayFromString=intArrayFromString;function intArrayToString(t){for(var e=[],r=0;r255&&(o&=255),e.push(String.fromCharCode(o))}return e.join("")}Module.intArrayToString=intArrayToString;function writeStringToMemory(t,e,r){Runtime.warnOnce("writeStringToMemory is deprecated and should not be called! Use stringToUTF8() instead!");var o,a;r&&(a=e+lengthBytesUTF8(t),o=HEAP8[a]),stringToUTF8(t,e,1/0),r&&(HEAP8[a]=o)}Module.writeStringToMemory=writeStringToMemory;function writeArrayToMemory(t,e){HEAP8.set(t,e)}Module.writeArrayToMemory=writeArrayToMemory;function writeAsciiToMemory(t,e,r){for(var o=0;o>0]=t.charCodeAt(o);r||(HEAP8[e>>0]=0)}if(Module.writeAsciiToMemory=writeAsciiToMemory,(!Math.imul||Math.imul(4294967295,5)!==-5)&&(Math.imul=function t(e,r){var o=e>>>16,a=e&65535,n=r>>>16,u=r&65535;return a*u+(o*u+a*n<<16)|0}),Math.imul=Math.imul,!Math.fround){var froundBuffer=new Float32Array(1);Math.fround=function(t){return froundBuffer[0]=t,froundBuffer[0]}}Math.fround=Math.fround,Math.clz32||(Math.clz32=function(t){t=t>>>0;for(var e=0;e<32;e++)if(t&1<<31-e)return e;return 32}),Math.clz32=Math.clz32,Math.trunc||(Math.trunc=function(t){return t<0?Math.ceil(t):Math.floor(t)}),Math.trunc=Math.trunc;var Math_abs=Math.abs,Math_cos=Math.cos,Math_sin=Math.sin,Math_tan=Math.tan,Math_acos=Math.acos,Math_asin=Math.asin,Math_atan=Math.atan,Math_atan2=Math.atan2,Math_exp=Math.exp,Math_log=Math.log,Math_sqrt=Math.sqrt,Math_ceil=Math.ceil,Math_floor=Math.floor,Math_pow=Math.pow,Math_imul=Math.imul,Math_fround=Math.fround,Math_round=Math.round,Math_min=Math.min,Math_clz32=Math.clz32,Math_trunc=Math.trunc,runDependencies=0,runDependencyWatcher=null,dependenciesFulfilled=null;function getUniqueRunDependency(t){return t}function addRunDependency(t){runDependencies++,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies)}Module.addRunDependency=addRunDependency;function removeRunDependency(t){if(runDependencies--,Module.monitorRunDependencies&&Module.monitorRunDependencies(runDependencies),runDependencies==0&&(runDependencyWatcher!==null&&(clearInterval(runDependencyWatcher),runDependencyWatcher=null),dependenciesFulfilled)){var e=dependenciesFulfilled;dependenciesFulfilled=null,e()}}Module.removeRunDependency=removeRunDependency,Module.preloadedImages={},Module.preloadedAudios={};var ASM_CONSTS=[function(t,e,r,o,a,n,u,A){return _nbind.callbackSignatureList[t].apply(this,arguments)}];function _emscripten_asm_const_iiiiiiii(t,e,r,o,a,n,u,A){return ASM_CONSTS[t](e,r,o,a,n,u,A)}function _emscripten_asm_const_iiiii(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiidddddd(t,e,r,o,a,n,u,A,p){return ASM_CONSTS[t](e,r,o,a,n,u,A,p)}function _emscripten_asm_const_iiididi(t,e,r,o,a,n,u){return ASM_CONSTS[t](e,r,o,a,n,u)}function _emscripten_asm_const_iiii(t,e,r,o){return ASM_CONSTS[t](e,r,o)}function _emscripten_asm_const_iiiid(t,e,r,o,a){return ASM_CONSTS[t](e,r,o,a)}function _emscripten_asm_const_iiiiii(t,e,r,o,a,n){return ASM_CONSTS[t](e,r,o,a,n)}STATIC_BASE=Runtime.GLOBAL_BASE,STATICTOP=STATIC_BASE+12800,__ATINIT__.push({func:function(){__GLOBAL__sub_I_Yoga_cpp()}},{func:function(){__GLOBAL__sub_I_nbind_cc()}},{func:function(){__GLOBAL__sub_I_common_cc()}},{func:function(){__GLOBAL__sub_I_Binding_cc()}}),allocate([0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,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,192,127,0,0,192,127,0,0,192,127,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,3,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,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,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,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,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,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,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,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,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,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,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,127,0,0,192,127,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,128,191,0,0,128,191,0,0,192,127,0,0,0,0,0,0,0,0,0,0,128,63,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,1,0,0,0,2,0,0,0,0,0,0,0,190,12,0,0,200,12,0,0,208,12,0,0,216,12,0,0,230,12,0,0,242,12,0,0,1,0,0,0,3,0,0,0,0,0,0,0,2,0,0,0,0,0,192,127,3,0,0,0,180,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,182,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,183,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,181,45,0,0,184,45,0,0,185,45,0,0,181,45,0,0,181,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,148,4,0,0,3,0,0,0,187,45,0,0,164,4,0,0,188,45,0,0,2,0,0,0,189,45,0,0,164,4,0,0,188,45,0,0,185,45,0,0,164,4,0,0,185,45,0,0,164,4,0,0,188,45,0,0,181,45,0,0,182,45,0,0,181,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,6,0,0,0,1,0,0,0,7,0,0,0,183,45,0,0,182,45,0,0,181,45,0,0,190,45,0,0,190,45,0,0,182,45,0,0,182,45,0,0,185,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,181,45,0,0,185,45,0,0,182,45,0,0,185,45,0,0,48,5,0,0,3,0,0,0,56,5,0,0,1,0,0,0,189,45,0,0,185,45,0,0,164,4,0,0,76,5,0,0,2,0,0,0,191,45,0,0,186,45,0,0,182,45,0,0,185,45,0,0,192,45,0,0,185,45,0,0,182,45,0,0,186,45,0,0,185,45,0,0,76,5,0,0,76,5,0,0,136,5,0,0,182,45,0,0,181,45,0,0,2,0,0,0,190,45,0,0,136,5,0,0,56,19,0,0,156,5,0,0,2,0,0,0,184,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,9,0,0,0,1,0,0,0,10,0,0,0,204,5,0,0,181,45,0,0,181,45,0,0,2,0,0,0,180,45,0,0,204,5,0,0,2,0,0,0,195,45,0,0,236,5,0,0,97,19,0,0,198,45,0,0,211,45,0,0,212,45,0,0,213,45,0,0,214,45,0,0,215,45,0,0,188,45,0,0,182,45,0,0,216,45,0,0,217,45,0,0,218,45,0,0,219,45,0,0,192,45,0,0,181,45,0,0,0,0,0,0,185,45,0,0,110,19,0,0,186,45,0,0,115,19,0,0,221,45,0,0,120,19,0,0,148,4,0,0,132,19,0,0,96,6,0,0,145,19,0,0,222,45,0,0,164,19,0,0,223,45,0,0,173,19,0,0,0,0,0,0,3,0,0,0,104,6,0,0,1,0,0,0,187,45,0,0,0,0,0,0,0,0,0,0,1,0,0,0,11,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,185,45,0,0,224,45,0,0,164,6,0,0,188,45,0,0,172,6,0,0,180,6,0,0,2,0,0,0,188,6,0,0,7,0,0,0,224,45,0,0,7,0,0,0,164,6,0,0,1,0,0,0,213,45,0,0,185,45,0,0,224,45,0,0,172,6,0,0,185,45,0,0,224,45,0,0,164,6,0,0,185,45,0,0,224,45,0,0,211,45,0,0,211,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,222,45,0,0,211,45,0,0,224,45,0,0,172,6,0,0,222,45,0,0,211,45,0,0,224,45,0,0,188,45,0,0,222,45,0,0,211,45,0,0,40,7,0,0,188,45,0,0,2,0,0,0,224,45,0,0,185,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,188,45,0,0,222,45,0,0,224,45,0,0,148,4,0,0,185,45,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,148,4,0,0,185,45,0,0,164,6,0,0,148,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,14,0,0,0,15,0,0,0,1,0,0,0,16,0,0,0,148,7,0,0,2,0,0,0,225,45,0,0,183,45,0,0,188,45,0,0,168,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,234,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,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,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,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,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,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,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,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,148,45,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,242,45,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,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,0,0,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,110,111,100,101,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,119,104,105,99,104,32,115,116,105,108,108,32,104,97,115,32,99,104,105,108,100,114,101,110,32,97,116,116,97,99,104,101,100,0,67,97,110,110,111,116,32,114,101,115,101,116,32,97,32,110,111,100,101,32,115,116,105,108,108,32,97,116,116,97,99,104,101,100,32,116,111,32,97,32,112,97,114,101,110,116,0,67,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,32,102,111,114,32,99,111,110,102,105,103,0,67,97,110,110,111,116,32,115,101,116,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,67,104,105,108,100,32,97,108,114,101,97,100,121,32,104,97,115,32,97,32,112,97,114,101,110,116,44,32,105,116,32,109,117,115,116,32,98,101,32,114,101,109,111,118,101,100,32,102,105,114,115,116,46,0,67,97,110,110,111,116,32,97,100,100,32,99,104,105,108,100,58,32,78,111,100,101,115,32,119,105,116,104,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,32,99,97,110,110,111,116,32,104,97,118,101,32,99,104,105,108,100,114,101,110,46,0,79,110,108,121,32,108,101,97,102,32,110,111,100,101,115,32,119,105,116,104,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,115,115,104,111,117,108,100,32,109,97,110,117,97,108,108,121,32,109,97,114,107,32,116,104,101,109,115,101,108,118,101,115,32,97,115,32,100,105,114,116,121,0,67,97,110,110,111,116,32,103,101,116,32,108,97,121,111,117,116,32,112,114,111,112,101,114,116,105,101,115,32,111,102,32,109,117,108,116,105,45,101,100,103,101,32,115,104,111,114,116,104,97,110,100,115,0,37,115,37,100,46,123,91,115,107,105,112,112,101,100,93,32,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,61,62,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,37,115,37,100,46,123,37,115,0,42,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,97,119,58,32,37,102,32,97,104,58,32,37,102,32,37,115,10,0,37,115,37,100,46,125,37,115,0,119,109,58,32,37,115,44,32,104,109,58,32,37,115,44,32,100,58,32,40,37,102,44,32,37,102,41,32,37,115,10,0,79,117,116,32,111,102,32,99,97,99,104,101,32,101,110,116,114,105,101,115,33,10,0,83,99,97,108,101,32,102,97,99,116,111,114,32,115,104,111,117,108,100,32,110,111,116,32,98,101,32,108,101,115,115,32,116,104,97,110,32,122,101,114,111,0,105,110,105,116,105,97,108,0,37,115,10,0,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,0,85,78,68,69,70,73,78,69,68,0,69,88,65,67,84,76,89,0,65,84,95,77,79,83,84,0,76,65,89,95,85,78,68,69,70,73,78,69,68,0,76,65,89,95,69,88,65,67,84,76,89,0,76,65,89,95,65,84,95,77,79,83,84,0,97,118,97,105,108,97,98,108,101,87,105,100,116,104,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,119,105,100,116,104,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,97,118,97,105,108,97,98,108,101,72,101,105,103,104,116,32,105,115,32,105,110,100,101,102,105,110,105,116,101,32,115,111,32,104,101,105,103,104,116,77,101,97,115,117,114,101,77,111,100,101,32,109,117,115,116,32,98,101,32,89,71,77,101,97,115,117,114,101,77,111,100,101,85,110,100,101,102,105,110,101,100,0,102,108,101,120,0,115,116,114,101,116,99,104,0,109,117,108,116,105,108,105,110,101,45,115,116,114,101,116,99,104,0,69,120,112,101,99,116,101,100,32,110,111,100,101,32,116,111,32,104,97,118,101,32,99,117,115,116,111,109,32,109,101,97,115,117,114,101,32,102,117,110,99,116,105,111,110,0,109,101,97,115,117,114,101,0,69,120,112,101,99,116,32,99,117,115,116,111,109,32,98,97,115,101,108,105,110,101,32,102,117,110,99,116,105,111,110,32,116,111,32,110,111,116,32,114,101,116,117,114,110,32,78,97,78,0,97,98,115,45,109,101,97,115,117,114,101,0,97,98,115,45,108,97,121,111,117,116,0,78,111,100,101,0,99,114,101,97,116,101,68,101,102,97,117,108,116,0,99,114,101,97,116,101,87,105,116,104,67,111,110,102,105,103,0,100,101,115,116,114,111,121,0,114,101,115,101,116,0,99,111,112,121,83,116,121,108,101,0,115,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,115,101,116,80,111,115,105,116,105,111,110,0,115,101,116,80,111,115,105,116,105,111,110,80,101,114,99,101,110,116,0,115,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,115,101,116,65,108,105,103,110,73,116,101,109,115,0,115,101,116,65,108,105,103,110,83,101,108,102,0,115,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,115,101,116,70,108,101,120,87,114,97,112,0,115,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,115,101,116,77,97,114,103,105,110,0,115,101,116,77,97,114,103,105,110,80,101,114,99,101,110,116,0,115,101,116,77,97,114,103,105,110,65,117,116,111,0,115,101,116,79,118,101,114,102,108,111,119,0,115,101,116,68,105,115,112,108,97,121,0,115,101,116,70,108,101,120,0,115,101,116,70,108,101,120,66,97,115,105,115,0,115,101,116,70,108,101,120,66,97,115,105,115,80,101,114,99,101,110,116,0,115,101,116,70,108,101,120,71,114,111,119,0,115,101,116,70,108,101,120,83,104,114,105,110,107,0,115,101,116,87,105,100,116,104,0,115,101,116,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,87,105,100,116,104,65,117,116,111,0,115,101,116,72,101,105,103,104,116,0,115,101,116,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,72,101,105,103,104,116,65,117,116,111,0,115,101,116,77,105,110,87,105,100,116,104,0,115,101,116,77,105,110,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,105,110,72,101,105,103,104,116,0,115,101,116,77,105,110,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,77,97,120,87,105,100,116,104,0,115,101,116,77,97,120,87,105,100,116,104,80,101,114,99,101,110,116,0,115,101,116,77,97,120,72,101,105,103,104,116,0,115,101,116,77,97,120,72,101,105,103,104,116,80,101,114,99,101,110,116,0,115,101,116,65,115,112,101,99,116,82,97,116,105,111,0,115,101,116,66,111,114,100,101,114,0,115,101,116,80,97,100,100,105,110,103,0,115,101,116,80,97,100,100,105,110,103,80,101,114,99,101,110,116,0,103,101,116,80,111,115,105,116,105,111,110,84,121,112,101,0,103,101,116,80,111,115,105,116,105,111,110,0,103,101,116,65,108,105,103,110,67,111,110,116,101,110,116,0,103,101,116,65,108,105,103,110,73,116,101,109,115,0,103,101,116,65,108,105,103,110,83,101,108,102,0,103,101,116,70,108,101,120,68,105,114,101,99,116,105,111,110,0,103,101,116,70,108,101,120,87,114,97,112,0,103,101,116,74,117,115,116,105,102,121,67,111,110,116,101,110,116,0,103,101,116,77,97,114,103,105,110,0,103,101,116,70,108,101,120,66,97,115,105,115,0,103,101,116,70,108,101,120,71,114,111,119,0,103,101,116,70,108,101,120,83,104,114,105,110,107,0,103,101,116,87,105,100,116,104,0,103,101,116,72,101,105,103,104,116,0,103,101,116,77,105,110,87,105,100,116,104,0,103,101,116,77,105,110,72,101,105,103,104,116,0,103,101,116,77,97,120,87,105,100,116,104,0,103,101,116,77,97,120,72,101,105,103,104,116,0,103,101,116,65,115,112,101,99,116,82,97,116,105,111,0,103,101,116,66,111,114,100,101,114,0,103,101,116,79,118,101,114,102,108,111,119,0,103,101,116,68,105,115,112,108,97,121,0,103,101,116,80,97,100,100,105,110,103,0,105,110,115,101,114,116,67,104,105,108,100,0,114,101,109,111,118,101,67,104,105,108,100,0,103,101,116,67,104,105,108,100,67,111,117,110,116,0,103,101,116,80,97,114,101,110,116,0,103,101,116,67,104,105,108,100,0,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,117,110,115,101,116,77,101,97,115,117,114,101,70,117,110,99,0,109,97,114,107,68,105,114,116,121,0,105,115,68,105,114,116,121,0,99,97,108,99,117,108,97,116,101,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,76,101,102,116,0,103,101,116,67,111,109,112,117,116,101,100,82,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,84,111,112,0,103,101,116,67,111,109,112,117,116,101,100,66,111,116,116,111,109,0,103,101,116,67,111,109,112,117,116,101,100,87,105,100,116,104,0,103,101,116,67,111,109,112,117,116,101,100,72,101,105,103,104,116,0,103,101,116,67,111,109,112,117,116,101,100,76,97,121,111,117,116,0,103,101,116,67,111,109,112,117,116,101,100,77,97,114,103,105,110,0,103,101,116,67,111,109,112,117,116,101,100,66,111,114,100,101,114,0,103,101,116,67,111,109,112,117,116,101,100,80,97,100,100,105,110,103,0,67,111,110,102,105,103,0,99,114,101,97,116,101,0,115,101,116,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,115,101,116,80,111,105,110,116,83,99,97,108,101,70,97,99,116,111,114,0,105,115,69,120,112,101,114,105,109,101,110,116,97,108,70,101,97,116,117,114,101,69,110,97,98,108,101,100,0,86,97,108,117,101,0,76,97,121,111,117,116,0,83,105,122,101,0,103,101,116,73,110,115,116,97,110,99,101,67,111,117,110,116,0,73,110,116,54,52,0,1,1,1,2,2,4,4,4,4,8,8,4,8,118,111,105,100,0,98,111,111,108,0,115,116,100,58,58,115,116,114,105,110,103,0,99,98,70,117,110,99,116,105,111,110,32,38,0,99,111,110,115,116,32,99,98,70,117,110,99,116,105,111,110,32,38,0,69,120,116,101,114,110,97,108,0,66,117,102,102,101,114,0,78,66,105,110,100,73,68,0,78,66,105,110,100,0,98,105,110,100,95,118,97,108,117,101,0,114,101,102,108,101,99,116,0,113,117,101,114,121,84,121,112,101,0,108,97,108,108,111,99,0,108,114,101,115,101,116,0,123,114,101,116,117,114,110,40,95,110,98,105,110,100,46,99,97,108,108,98,97,99,107,83,105,103,110,97,116,117,114,101,76,105,115,116,91,36,48,93,46,97,112,112,108,121,40,116,104,105,115,44,97,114,103,117,109,101,110,116,115,41,41,59,125,0,95,110,98,105,110,100,95,110,101,119,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,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,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,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,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,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,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,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,18,0,0,0,18,18,18,0,0,0,0,0,0,9,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,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,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,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,46,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=STATICTOP;STATICTOP+=16;function _atexit(t,e){__ATEXIT__.unshift({func:t,arg:e})}function ___cxa_atexit(){return _atexit.apply(null,arguments)}function _abort(){Module.abort()}function __ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj(){Module.printErr("missing function: _ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj"),abort(-1)}function __decorate(t,e,r,o){var a=arguments.length,n=a<3?e:o===null?o=Object.getOwnPropertyDescriptor(e,r):o,u;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(t,e,r,o);else for(var A=t.length-1;A>=0;A--)(u=t[A])&&(n=(a<3?u(n):a>3?u(e,r,n):u(e,r))||n);return a>3&&n&&Object.defineProperty(e,r,n),n}function _defineHidden(t){return function(e,r){Object.defineProperty(e,r,{configurable:!1,enumerable:!1,value:t,writable:!0})}}var _nbind={};function __nbind_free_external(t){_nbind.externalList[t].dereference(t)}function __nbind_reference_external(t){_nbind.externalList[t].reference()}function _llvm_stackrestore(t){var e=_llvm_stacksave,r=e.LLVM_SAVEDSTACKS[t];e.LLVM_SAVEDSTACKS.splice(t,1),Runtime.stackRestore(r)}function __nbind_register_pool(t,e,r,o){_nbind.Pool.pageSize=t,_nbind.Pool.usedPtr=e/4,_nbind.Pool.rootPtr=r,_nbind.Pool.pagePtr=o/4,HEAP32[e/4]=16909060,HEAP8[e]==1&&(_nbind.bigEndian=!0),HEAP32[e/4]=0,_nbind.makeTypeKindTbl=(n={},n[1024]=_nbind.PrimitiveType,n[64]=_nbind.Int64Type,n[2048]=_nbind.BindClass,n[3072]=_nbind.BindClassPtr,n[4096]=_nbind.SharedClassPtr,n[5120]=_nbind.ArrayType,n[6144]=_nbind.ArrayType,n[7168]=_nbind.CStringType,n[9216]=_nbind.CallbackType,n[10240]=_nbind.BindType,n),_nbind.makeTypeNameTbl={Buffer:_nbind.BufferType,External:_nbind.ExternalType,Int64:_nbind.Int64Type,_nbind_new:_nbind.CreateValueType,bool:_nbind.BooleanType,"cbFunction &":_nbind.CallbackType,"const cbFunction &":_nbind.CallbackType,"const std::string &":_nbind.StringType,"std::string":_nbind.StringType},Module.toggleLightGC=_nbind.toggleLightGC,_nbind.callUpcast=Module.dynCall_ii;var a=_nbind.makeType(_nbind.constructType,{flags:2048,id:0,name:""});a.proto=Module,_nbind.BindClass.list.push(a);var n}function _emscripten_set_main_loop_timing(t,e){if(Browser.mainLoop.timingMode=t,Browser.mainLoop.timingValue=e,!Browser.mainLoop.func)return 1;if(t==0)Browser.mainLoop.scheduler=function(){var u=Math.max(0,Browser.mainLoop.tickStartTime+e-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,u)},Browser.mainLoop.method="timeout";else if(t==1)Browser.mainLoop.scheduler=function(){Browser.requestAnimationFrame(Browser.mainLoop.runner)},Browser.mainLoop.method="rAF";else if(t==2){if(!window.setImmediate){let n=function(u){u.source===window&&u.data===o&&(u.stopPropagation(),r.shift()())};var a=n,r=[],o="setimmediate";window.addEventListener("message",n,!0),window.setImmediate=function(A){r.push(A),ENVIRONMENT_IS_WORKER?(Module.setImmediates===void 0&&(Module.setImmediates=[]),Module.setImmediates.push(A),window.postMessage({target:o})):window.postMessage(o,"*")}}Browser.mainLoop.scheduler=function(){window.setImmediate(Browser.mainLoop.runner)},Browser.mainLoop.method="immediate"}return 0}function _emscripten_get_now(){abort()}function _emscripten_set_main_loop(t,e,r,o,a){Module.noExitRuntime=!0,assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters."),Browser.mainLoop.func=t,Browser.mainLoop.arg=o;var n;typeof o<"u"?n=function(){Module.dynCall_vi(t,o)}:n=function(){Module.dynCall_v(t)};var u=Browser.mainLoop.currentlyRunningMainloop;if(Browser.mainLoop.runner=function(){if(!ABORT){if(Browser.mainLoop.queue.length>0){var p=Date.now(),h=Browser.mainLoop.queue.shift();if(h.func(h.arg),Browser.mainLoop.remainingBlockers){var E=Browser.mainLoop.remainingBlockers,w=E%1==0?E-1:Math.floor(E);h.counted?Browser.mainLoop.remainingBlockers=w:(w=w+.5,Browser.mainLoop.remainingBlockers=(8*E+w)/9)}if(console.log('main loop blocker "'+h.name+'" took '+(Date.now()-p)+" ms"),Browser.mainLoop.updateStatus(),u1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else Browser.mainLoop.timingMode==0&&(Browser.mainLoop.tickStartTime=_emscripten_get_now());Browser.mainLoop.method==="timeout"&&Module.ctx&&(Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!"),Browser.mainLoop.method=""),Browser.mainLoop.runIter(n),!(u0?_emscripten_set_main_loop_timing(0,1e3/e):_emscripten_set_main_loop_timing(1,1),Browser.mainLoop.scheduler()),r)throw"SimulateInfiniteLoop"}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:function(){Browser.mainLoop.scheduler=null,Browser.mainLoop.currentlyRunningMainloop++},resume:function(){Browser.mainLoop.currentlyRunningMainloop++;var t=Browser.mainLoop.timingMode,e=Browser.mainLoop.timingValue,r=Browser.mainLoop.func;Browser.mainLoop.func=null,_emscripten_set_main_loop(r,0,!1,Browser.mainLoop.arg,!0),_emscripten_set_main_loop_timing(t,e),Browser.mainLoop.scheduler()},updateStatus:function(){if(Module.setStatus){var t=Module.statusMessage||"Please wait...",e=Browser.mainLoop.remainingBlockers,r=Browser.mainLoop.expectedBlockers;e?e"u"&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),Module.noImageDecoding=!0);var t={};t.canHandle=function(n){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(n)},t.handle=function(n,u,A,p){var h=null;if(Browser.hasBlobConstructor)try{h=new Blob([n],{type:Browser.getMimetype(u)}),h.size!==n.length&&(h=new Blob([new Uint8Array(n).buffer],{type:Browser.getMimetype(u)}))}catch(b){Runtime.warnOnce("Blob constructor present but fails: "+b+"; falling back to blob builder")}if(!h){var E=new Browser.BlobBuilder;E.append(new Uint8Array(n).buffer),h=E.getBlob()}var w=Browser.URLObject.createObjectURL(h),D=new Image;D.onload=function(){assert(D.complete,"Image "+u+" could not be decoded");var C=document.createElement("canvas");C.width=D.width,C.height=D.height;var T=C.getContext("2d");T.drawImage(D,0,0),Module.preloadedImages[u]=C,Browser.URLObject.revokeObjectURL(w),A&&A(n)},D.onerror=function(C){console.log("Image "+w+" could not be decoded"),p&&p()},D.src=w},Module.preloadPlugins.push(t);var e={};e.canHandle=function(n){return!Module.noAudioDecoding&&n.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},e.handle=function(n,u,A,p){var h=!1;function E(T){h||(h=!0,Module.preloadedAudios[u]=T,A&&A(n))}function w(){h||(h=!0,Module.preloadedAudios[u]=new Audio,p&&p())}if(Browser.hasBlobConstructor){try{var D=new Blob([n],{type:Browser.getMimetype(u)})}catch{return w()}var b=Browser.URLObject.createObjectURL(D),C=new Audio;C.addEventListener("canplaythrough",function(){E(C)},!1),C.onerror=function(N){if(h)return;console.log("warning: browser could not fully decode audio "+u+", trying slower base64 approach");function U(J){for(var te="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",le="=",ce="",ue=0,Ie=0,he=0;he=6;){var De=ue>>Ie-6&63;Ie-=6,ce+=te[De]}return Ie==2?(ce+=te[(ue&3)<<4],ce+=le+le):Ie==4&&(ce+=te[(ue&15)<<2],ce+=le),ce}C.src="data:audio/x-"+u.substr(-3)+";base64,"+U(n),E(C)},C.src=b,Browser.safeSetTimeout(function(){E(C)},1e4)}else return w()},Module.preloadPlugins.push(e);function r(){Browser.pointerLock=document.pointerLockElement===Module.canvas||document.mozPointerLockElement===Module.canvas||document.webkitPointerLockElement===Module.canvas||document.msPointerLockElement===Module.canvas}var o=Module.canvas;o&&(o.requestPointerLock=o.requestPointerLock||o.mozRequestPointerLock||o.webkitRequestPointerLock||o.msRequestPointerLock||function(){},o.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||document.msExitPointerLock||function(){},o.exitPointerLock=o.exitPointerLock.bind(document),document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),document.addEventListener("webkitpointerlockchange",r,!1),document.addEventListener("mspointerlockchange",r,!1),Module.elementPointerLock&&o.addEventListener("click",function(a){!Browser.pointerLock&&Module.canvas.requestPointerLock&&(Module.canvas.requestPointerLock(),a.preventDefault())},!1))},createContext:function(t,e,r,o){if(e&&Module.ctx&&t==Module.canvas)return Module.ctx;var a,n;if(e){var u={antialias:!1,alpha:!1};if(o)for(var A in o)u[A]=o[A];n=GL.createContext(t,u),n&&(a=GL.getContext(n).GLctx)}else a=t.getContext("2d");return a?(r&&(e||assert(typeof GLctx>"u","cannot set in module if GLctx is used, but we are a non-GL context that would replace it"),Module.ctx=a,e&&GL.makeContextCurrent(n),Module.useWebGL=e,Browser.moduleContextCreatedCallbacks.forEach(function(p){p()}),Browser.init()),a):null},destroyContext:function(t,e,r){},fullscreenHandlersInstalled:!1,lockPointer:void 0,resizeCanvas:void 0,requestFullscreen:function(t,e,r){Browser.lockPointer=t,Browser.resizeCanvas=e,Browser.vrDevice=r,typeof Browser.lockPointer>"u"&&(Browser.lockPointer=!0),typeof Browser.resizeCanvas>"u"&&(Browser.resizeCanvas=!1),typeof Browser.vrDevice>"u"&&(Browser.vrDevice=null);var o=Module.canvas;function a(){Browser.isFullscreen=!1;var u=o.parentNode;(document.fullscreenElement||document.mozFullScreenElement||document.msFullscreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement)===u?(o.exitFullscreen=document.exitFullscreen||document.cancelFullScreen||document.mozCancelFullScreen||document.msExitFullscreen||document.webkitCancelFullScreen||function(){},o.exitFullscreen=o.exitFullscreen.bind(document),Browser.lockPointer&&o.requestPointerLock(),Browser.isFullscreen=!0,Browser.resizeCanvas&&Browser.setFullscreenCanvasSize()):(u.parentNode.insertBefore(o,u),u.parentNode.removeChild(u),Browser.resizeCanvas&&Browser.setWindowedCanvasSize()),Module.onFullScreen&&Module.onFullScreen(Browser.isFullscreen),Module.onFullscreen&&Module.onFullscreen(Browser.isFullscreen),Browser.updateCanvasDimensions(o)}Browser.fullscreenHandlersInstalled||(Browser.fullscreenHandlersInstalled=!0,document.addEventListener("fullscreenchange",a,!1),document.addEventListener("mozfullscreenchange",a,!1),document.addEventListener("webkitfullscreenchange",a,!1),document.addEventListener("MSFullscreenChange",a,!1));var n=document.createElement("div");o.parentNode.insertBefore(n,o),n.appendChild(o),n.requestFullscreen=n.requestFullscreen||n.mozRequestFullScreen||n.msRequestFullscreen||(n.webkitRequestFullscreen?function(){n.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT)}:null)||(n.webkitRequestFullScreen?function(){n.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:null),r?n.requestFullscreen({vrDisplay:r}):n.requestFullscreen()},requestFullScreen:function(t,e,r){return Module.printErr("Browser.requestFullScreen() is deprecated. Please call Browser.requestFullscreen instead."),Browser.requestFullScreen=function(o,a,n){return Browser.requestFullscreen(o,a,n)},Browser.requestFullscreen(t,e,r)},nextRAF:0,fakeRequestAnimationFrame:function(t){var e=Date.now();if(Browser.nextRAF===0)Browser.nextRAF=e+1e3/60;else for(;e+2>=Browser.nextRAF;)Browser.nextRAF+=1e3/60;var r=Math.max(Browser.nextRAF-e,0);setTimeout(t,r)},requestAnimationFrame:function t(e){typeof window>"u"?Browser.fakeRequestAnimationFrame(e):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||Browser.fakeRequestAnimationFrame),window.requestAnimationFrame(e))},safeCallback:function(t){return function(){if(!ABORT)return t.apply(null,arguments)}},allowAsyncCallbacks:!0,queuedAsyncCallbacks:[],pauseAsyncCallbacks:function(){Browser.allowAsyncCallbacks=!1},resumeAsyncCallbacks:function(){if(Browser.allowAsyncCallbacks=!0,Browser.queuedAsyncCallbacks.length>0){var t=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[],t.forEach(function(e){e()})}},safeRequestAnimationFrame:function(t){return Browser.requestAnimationFrame(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))})},safeSetTimeout:function(t,e){return Module.noExitRuntime=!0,setTimeout(function(){ABORT||(Browser.allowAsyncCallbacks?t():Browser.queuedAsyncCallbacks.push(t))},e)},safeSetInterval:function(t,e){return Module.noExitRuntime=!0,setInterval(function(){ABORT||Browser.allowAsyncCallbacks&&t()},e)},getMimetype:function(t){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[t.substr(t.lastIndexOf(".")+1)]},getUserMedia:function(t){window.getUserMedia||(window.getUserMedia=navigator.getUserMedia||navigator.mozGetUserMedia),window.getUserMedia(t)},getMovementX:function(t){return t.movementX||t.mozMovementX||t.webkitMovementX||0},getMovementY:function(t){return t.movementY||t.mozMovementY||t.webkitMovementY||0},getMouseWheelDelta:function(t){var e=0;switch(t.type){case"DOMMouseScroll":e=t.detail;break;case"mousewheel":e=t.wheelDelta;break;case"wheel":e=t.deltaY;break;default:throw"unrecognized mouse wheel event: "+t.type}return e},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:function(t){if(Browser.pointerLock)t.type!="mousemove"&&"mozMovementX"in t?Browser.mouseMovementX=Browser.mouseMovementY=0:(Browser.mouseMovementX=Browser.getMovementX(t),Browser.mouseMovementY=Browser.getMovementY(t)),typeof SDL<"u"?(Browser.mouseX=SDL.mouseX+Browser.mouseMovementX,Browser.mouseY=SDL.mouseY+Browser.mouseMovementY):(Browser.mouseX+=Browser.mouseMovementX,Browser.mouseY+=Browser.mouseMovementY);else{var e=Module.canvas.getBoundingClientRect(),r=Module.canvas.width,o=Module.canvas.height,a=typeof window.scrollX<"u"?window.scrollX:window.pageXOffset,n=typeof window.scrollY<"u"?window.scrollY:window.pageYOffset;if(t.type==="touchstart"||t.type==="touchend"||t.type==="touchmove"){var u=t.touch;if(u===void 0)return;var A=u.pageX-(a+e.left),p=u.pageY-(n+e.top);A=A*(r/e.width),p=p*(o/e.height);var h={x:A,y:p};if(t.type==="touchstart")Browser.lastTouches[u.identifier]=h,Browser.touches[u.identifier]=h;else if(t.type==="touchend"||t.type==="touchmove"){var E=Browser.touches[u.identifier];E||(E=h),Browser.lastTouches[u.identifier]=E,Browser.touches[u.identifier]=h}return}var w=t.pageX-(a+e.left),D=t.pageY-(n+e.top);w=w*(r/e.width),D=D*(o/e.height),Browser.mouseMovementX=w-Browser.mouseX,Browser.mouseMovementY=D-Browser.mouseY,Browser.mouseX=w,Browser.mouseY=D}},asyncLoad:function(t,e,r,o){var a=o?"":"al "+t;Module.readAsync(t,function(n){assert(n,'Loading data file "'+t+'" failed (no arrayBuffer).'),e(new Uint8Array(n)),a&&removeRunDependency(a)},function(n){if(r)r();else throw'Loading data file "'+t+'" failed.'}),a&&addRunDependency(a)},resizeListeners:[],updateResizeListeners:function(){var t=Module.canvas;Browser.resizeListeners.forEach(function(e){e(t.width,t.height)})},setCanvasSize:function(t,e,r){var o=Module.canvas;Browser.updateCanvasDimensions(o,t,e),r||Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t|8388608,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},setWindowedCanvasSize:function(){if(typeof SDL<"u"){var t=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];t=t&-8388609,HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=t}Browser.updateResizeListeners()},updateCanvasDimensions:function(t,e,r){e&&r?(t.widthNative=e,t.heightNative=r):(e=t.widthNative,r=t.heightNative);var o=e,a=r;if(Module.forcedAspectRatio&&Module.forcedAspectRatio>0&&(o/a>2];return e},getStr:function(){var t=Pointer_stringify(SYSCALLS.get());return t},get64:function(){var t=SYSCALLS.get(),e=SYSCALLS.get();return t>=0?assert(e===0):assert(e===-1),t},getZero:function(){assert(SYSCALLS.get()===0)}};function ___syscall6(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD();return FS.close(r),0}catch(o){return(typeof FS>"u"||!(o instanceof FS.ErrnoError))&&abort(o),-o.errno}}function ___syscall54(t,e){SYSCALLS.varargs=e;try{return 0}catch(r){return(typeof FS>"u"||!(r instanceof FS.ErrnoError))&&abort(r),-r.errno}}function _typeModule(t){var e=[[0,1,"X"],[1,1,"const X"],[128,1,"X *"],[256,1,"X &"],[384,1,"X &&"],[512,1,"std::shared_ptr"],[640,1,"std::unique_ptr"],[5120,1,"std::vector"],[6144,2,"std::array"],[9216,-1,"std::function"]];function r(p,h,E,w,D,b){if(h==1){var C=w&896;(C==128||C==256||C==384)&&(p="X const")}var T;return b?T=E.replace("X",p).replace("Y",D):T=p.replace("X",E).replace("Y",D),T.replace(/([*&]) (?=[*&])/g,"$1")}function o(p,h,E,w,D){throw new Error(p+" type "+E.replace("X",h+"?")+(w?" with flag "+w:"")+" in "+D)}function a(p,h,E,w,D,b,C,T){b===void 0&&(b="X"),T===void 0&&(T=1);var N=E(p);if(N)return N;var U=w(p),J=U.placeholderFlag,te=e[J];C&&te&&(b=r(C[2],C[0],b,te[0],"?",!0));var le;J==0&&(le="Unbound"),J>=10&&(le="Corrupt"),T>20&&(le="Deeply nested"),le&&o(le,p,b,J,D||"?");var ce=U.paramList[0],ue=a(ce,h,E,w,D,b,te,T+1),Ie,he={flags:te[0],id:p,name:"",paramList:[ue]},De=[],Ee="?";switch(U.placeholderFlag){case 1:Ie=ue.spec;break;case 2:if((ue.flags&15360)==1024&&ue.spec.ptrSize==1){he.flags=7168;break}case 3:case 6:case 5:Ie=ue.spec,ue.flags&15360;break;case 8:Ee=""+U.paramList[1],he.paramList.push(U.paramList[1]);break;case 9:for(var g=0,me=U.paramList[1];g>2]=t),t}function _llvm_stacksave(){var t=_llvm_stacksave;return t.LLVM_SAVEDSTACKS||(t.LLVM_SAVEDSTACKS=[]),t.LLVM_SAVEDSTACKS.push(Runtime.stackSave()),t.LLVM_SAVEDSTACKS.length-1}function ___syscall140(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.getStreamFromFD(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=SYSCALLS.get(),u=SYSCALLS.get(),A=a;return FS.llseek(r,A,u),HEAP32[n>>2]=r.position,r.getdents&&A===0&&u===0&&(r.getdents=null),0}catch(p){return(typeof FS>"u"||!(p instanceof FS.ErrnoError))&&abort(p),-p.errno}}function ___syscall146(t,e){SYSCALLS.varargs=e;try{var r=SYSCALLS.get(),o=SYSCALLS.get(),a=SYSCALLS.get(),n=0;___syscall146.buffer||(___syscall146.buffers=[null,[],[]],___syscall146.printChar=function(E,w){var D=___syscall146.buffers[E];assert(D),w===0||w===10?((E===1?Module.print:Module.printErr)(UTF8ArrayToString(D,0)),D.length=0):D.push(w)});for(var u=0;u>2],p=HEAP32[o+(u*8+4)>>2],h=0;h"u"||!(E instanceof FS.ErrnoError))&&abort(E),-E.errno}}function __nbind_finish(){for(var t=0,e=_nbind.BindClass.list;tt.pageSize/2||e>t.pageSize-r){var o=_nbind.typeNameTbl.NBind.proto;return o.lalloc(e)}else return HEAPU32[t.usedPtr]=r+e,t.rootPtr+r},t.lreset=function(e,r){var o=HEAPU32[t.pagePtr];if(o){var a=_nbind.typeNameTbl.NBind.proto;a.lreset(e,r)}else HEAPU32[t.usedPtr]=e},t}();_nbind.Pool=Pool;function constructType(t,e){var r=t==10240?_nbind.makeTypeNameTbl[e.name]||_nbind.BindType:_nbind.makeTypeKindTbl[t],o=new r(e);return typeIdTbl[e.id]=o,_nbind.typeNameTbl[e.name]=o,o}_nbind.constructType=constructType;function getType(t){return typeIdTbl[t]}_nbind.getType=getType;function queryType(t){var e=HEAPU8[t],r=_nbind.structureList[e][1];t/=4,r<0&&(++t,r=HEAPU32[t]+1);var o=Array.prototype.slice.call(HEAPU32.subarray(t+1,t+1+r));return e==9&&(o=[o[0],o.slice(1)]),{paramList:o,placeholderFlag:e}}_nbind.queryType=queryType;function getTypes(t,e){return t.map(function(r){return typeof r=="number"?_nbind.getComplexType(r,constructType,getType,queryType,e):_nbind.typeNameTbl[r]})}_nbind.getTypes=getTypes;function readTypeIdList(t,e){return Array.prototype.slice.call(HEAPU32,t/4,t/4+e)}_nbind.readTypeIdList=readTypeIdList;function readAsciiString(t){for(var e=t;HEAPU8[e++];);return String.fromCharCode.apply("",HEAPU8.subarray(t,e-1))}_nbind.readAsciiString=readAsciiString;function readPolicyList(t){var e={};if(t)for(;;){var r=HEAPU32[t/4];if(!r)break;e[readAsciiString(r)]=!0,t+=4}return e}_nbind.readPolicyList=readPolicyList;function getDynCall(t,e){var r={float32_t:"d",float64_t:"d",int64_t:"d",uint64_t:"d",void:"v"},o=t.map(function(n){return r[n.name]||"i"}).join(""),a=Module["dynCall_"+o];if(!a)throw new Error("dynCall_"+o+" not found for "+e+"("+t.map(function(n){return n.name}).join(", ")+")");return a}_nbind.getDynCall=getDynCall;function addMethod(t,e,r,o){var a=t[e];t.hasOwnProperty(e)&&a?((a.arity||a.arity===0)&&(a=_nbind.makeOverloader(a,a.arity),t[e]=a),a.addMethod(r,o)):(r.arity=o,t[e]=r)}_nbind.addMethod=addMethod;function throwError(t){throw new Error(t)}_nbind.throwError=throwError,_nbind.bigEndian=!1,_a=_typeModule(_typeModule),_nbind.Type=_a.Type,_nbind.makeType=_a.makeType,_nbind.getComplexType=_a.getComplexType,_nbind.structureList=_a.structureList;var BindType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.heap=HEAPU32,r.ptrSize=4,r}return e.prototype.needsWireRead=function(r){return!!this.wireRead||!!this.makeWireRead},e.prototype.needsWireWrite=function(r){return!!this.wireWrite||!!this.makeWireWrite},e}(_nbind.Type);_nbind.BindType=BindType;var PrimitiveType=function(t){__extends(e,t);function e(r){var o=t.call(this,r)||this,a=r.flags&32?{32:HEAPF32,64:HEAPF64}:r.flags&8?{8:HEAPU8,16:HEAPU16,32:HEAPU32}:{8:HEAP8,16:HEAP16,32:HEAP32};return o.heap=a[r.ptrSize*8],o.ptrSize=r.ptrSize,o}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="number")return a;throw new Error("Type mismatch")}},e}(BindType);_nbind.PrimitiveType=PrimitiveType;function pushCString(t,e){if(t==null){if(e&&e.Nullable)return 0;throw new Error("Type mismatch")}if(e&&e.Strict){if(typeof t!="string")throw new Error("Type mismatch")}else t=t.toString();var r=Module.lengthBytesUTF8(t)+1,o=_nbind.Pool.lalloc(r);return Module.stringToUTF8Array(t,HEAPU8,o,r),o}_nbind.pushCString=pushCString;function popCString(t){return t===0?null:Module.Pointer_stringify(t)}_nbind.popCString=popCString;var CStringType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=popCString,r.wireWrite=pushCString,r.readResources=[_nbind.resources.pool],r.writeResources=[_nbind.resources.pool],r}return e.prototype.makeWireWrite=function(r,o){return function(a){return pushCString(a,o)}},e}(BindType);_nbind.CStringType=CStringType;var BooleanType=function(t){__extends(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.wireRead=function(o){return!!o},r}return e.prototype.needsWireWrite=function(r){return!!r&&!!r.Strict},e.prototype.makeWireRead=function(r){return"!!("+r+")"},e.prototype.makeWireWrite=function(r,o){return o&&o.Strict&&function(a){if(typeof a=="boolean")return a;throw new Error("Type mismatch")}||r},e}(BindType);_nbind.BooleanType=BooleanType;var Wrapper=function(){function t(){}return t.prototype.persist=function(){this.__nbindState|=1},t}();_nbind.Wrapper=Wrapper;function makeBound(t,e){var r=function(o){__extends(a,o);function a(n,u,A,p){var h=o.call(this)||this;if(!(h instanceof a))return new(Function.prototype.bind.apply(a,Array.prototype.concat.apply([null],arguments)));var E=u,w=A,D=p;if(n!==_nbind.ptrMarker){var b=h.__nbindConstructor.apply(h,arguments);E=4608,D=HEAPU32[b/4],w=HEAPU32[b/4+1]}var C={configurable:!0,enumerable:!1,value:null,writable:!1},T={__nbindFlags:E,__nbindPtr:w};D&&(T.__nbindShared=D,_nbind.mark(h));for(var N=0,U=Object.keys(T);N>=1;var r=_nbind.valueList[t];return _nbind.valueList[t]=firstFreeValue,firstFreeValue=t,r}else{if(e)return _nbind.popShared(t,e);throw new Error("Invalid value slot "+t)}}_nbind.popValue=popValue;var valueBase=18446744073709552e3;function push64(t){return typeof t=="number"?t:pushValue(t)*4096+valueBase}function pop64(t){return t=3?u=Buffer.from(n):u=new Buffer(n),u.copy(o)}else getBuffer(o).set(n)}}_nbind.commitBuffer=commitBuffer;var dirtyList=[],gcTimer=0;function sweep(){for(var t=0,e=dirtyList;t>2]=DYNAMIC_BASE,staticSealed=!0;function invoke_viiiii(t,e,r,o,a,n){try{Module.dynCall_viiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_vif(t,e,r){try{Module.dynCall_vif(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_vid(t,e,r){try{Module.dynCall_vid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_fiff(t,e,r,o){try{return Module.dynCall_fiff(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_vi(t,e){try{Module.dynCall_vi(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_vii(t,e,r){try{Module.dynCall_vii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_ii(t,e){try{return Module.dynCall_ii(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_viddi(t,e,r,o,a){try{Module.dynCall_viddi(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_vidd(t,e,r,o){try{Module.dynCall_vidd(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_iiii(t,e,r,o){try{return Module.dynCall_iiii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_diii(t,e,r,o){try{return Module.dynCall_diii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_di(t,e){try{return Module.dynCall_di(t,e)}catch(r){if(typeof r!="number"&&r!=="longjmp")throw r;Module.setThrew(1,0)}}function invoke_iid(t,e,r){try{return Module.dynCall_iid(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_iii(t,e,r){try{return Module.dynCall_iii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiddi(t,e,r,o,a,n){try{Module.dynCall_viiddi(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiiiii(t,e,r,o,a,n,u){try{Module.dynCall_viiiiii(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_dii(t,e,r){try{return Module.dynCall_dii(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_i(t){try{return Module.dynCall_i(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_iiiiii(t,e,r,o,a,n){try{return Module.dynCall_iiiiii(t,e,r,o,a,n)}catch(u){if(typeof u!="number"&&u!=="longjmp")throw u;Module.setThrew(1,0)}}function invoke_viiid(t,e,r,o,a){try{Module.dynCall_viiid(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}function invoke_viififi(t,e,r,o,a,n,u){try{Module.dynCall_viififi(t,e,r,o,a,n,u)}catch(A){if(typeof A!="number"&&A!=="longjmp")throw A;Module.setThrew(1,0)}}function invoke_viii(t,e,r,o){try{Module.dynCall_viii(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_v(t){try{Module.dynCall_v(t)}catch(e){if(typeof e!="number"&&e!=="longjmp")throw e;Module.setThrew(1,0)}}function invoke_viid(t,e,r,o){try{Module.dynCall_viid(t,e,r,o)}catch(a){if(typeof a!="number"&&a!=="longjmp")throw a;Module.setThrew(1,0)}}function invoke_idd(t,e,r){try{return Module.dynCall_idd(t,e,r)}catch(o){if(typeof o!="number"&&o!=="longjmp")throw o;Module.setThrew(1,0)}}function invoke_viiii(t,e,r,o,a){try{Module.dynCall_viiii(t,e,r,o,a)}catch(n){if(typeof n!="number"&&n!=="longjmp")throw n;Module.setThrew(1,0)}}Module.asmGlobalArg={Math,Int8Array,Int16Array,Int32Array,Uint8Array,Uint16Array,Uint32Array,Float32Array,Float64Array,NaN:NaN,Infinity:1/0},Module.asmLibraryArg={abort,assert,enlargeMemory,getTotalMemory,abortOnCannotGrowMemory,invoke_viiiii,invoke_vif,invoke_vid,invoke_fiff,invoke_vi,invoke_vii,invoke_ii,invoke_viddi,invoke_vidd,invoke_iiii,invoke_diii,invoke_di,invoke_iid,invoke_iii,invoke_viiddi,invoke_viiiiii,invoke_dii,invoke_i,invoke_iiiiii,invoke_viiid,invoke_viififi,invoke_viii,invoke_v,invoke_viid,invoke_idd,invoke_viiii,_emscripten_asm_const_iiiii,_emscripten_asm_const_iiidddddd,_emscripten_asm_const_iiiid,__nbind_reference_external,_emscripten_asm_const_iiiiiiii,_removeAccessorPrefix,_typeModule,__nbind_register_pool,__decorate,_llvm_stackrestore,___cxa_atexit,__extends,__nbind_get_value_object,__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,_emscripten_set_main_loop_timing,__nbind_register_primitive,__nbind_register_type,_emscripten_memcpy_big,__nbind_register_function,___setErrNo,__nbind_register_class,__nbind_finish,_abort,_nbind_value,_llvm_stacksave,___syscall54,_defineHidden,_emscripten_set_main_loop,_emscripten_get_now,__nbind_register_callback_signature,_emscripten_asm_const_iiiiii,__nbind_free_external,_emscripten_asm_const_iiii,_emscripten_asm_const_iiididi,___syscall6,_atexit,___syscall140,___syscall146,DYNAMICTOP_PTR,tempDoublePtr,ABORT,STACKTOP,STACK_MAX,cttz_i8,___dso_handle};var asm=function(t,e,r){var o=new t.Int8Array(r),a=new t.Int16Array(r),n=new t.Int32Array(r),u=new t.Uint8Array(r),A=new t.Uint16Array(r),p=new t.Uint32Array(r),h=new t.Float32Array(r),E=new t.Float64Array(r),w=e.DYNAMICTOP_PTR|0,D=e.tempDoublePtr|0,b=e.ABORT|0,C=e.STACKTOP|0,T=e.STACK_MAX|0,N=e.cttz_i8|0,U=e.___dso_handle|0,J=0,te=0,le=0,ce=0,ue=t.NaN,Ie=t.Infinity,he=0,De=0,Ee=0,g=0,me=0,Ce=0,fe=t.Math.floor,ie=t.Math.abs,Z=t.Math.sqrt,Se=t.Math.pow,Re=t.Math.cos,ht=t.Math.sin,q=t.Math.tan,nt=t.Math.acos,Le=t.Math.asin,Te=t.Math.atan,ke=t.Math.atan2,Ke=t.Math.exp,xe=t.Math.log,tt=t.Math.ceil,He=t.Math.imul,x=t.Math.min,I=t.Math.max,P=t.Math.clz32,y=t.Math.fround,R=e.abort,z=e.assert,X=e.enlargeMemory,$=e.getTotalMemory,se=e.abortOnCannotGrowMemory,be=e.invoke_viiiii,Fe=e.invoke_vif,lt=e.invoke_vid,Et=e.invoke_fiff,qt=e.invoke_vi,nr=e.invoke_vii,Pt=e.invoke_ii,cn=e.invoke_viddi,Sr=e.invoke_vidd,yr=e.invoke_iiii,Rr=e.invoke_diii,Xr=e.invoke_di,$n=e.invoke_iid,Xs=e.invoke_iii,Hi=e.invoke_viiddi,Qs=e.invoke_viiiiii,Zs=e.invoke_dii,bi=e.invoke_i,Fs=e.invoke_iiiiii,$s=e.invoke_viiid,PA=e.invoke_viififi,gu=e.invoke_viii,op=e.invoke_v,ap=e.invoke_viid,Rs=e.invoke_idd,Nn=e.invoke_viiii,hs=e._emscripten_asm_const_iiiii,Ts=e._emscripten_asm_const_iiidddddd,pc=e._emscripten_asm_const_iiiid,hc=e.__nbind_reference_external,gc=e._emscripten_asm_const_iiiiiiii,xA=e._removeAccessorPrefix,bA=e._typeModule,Ro=e.__nbind_register_pool,To=e.__decorate,kA=e._llvm_stackrestore,pr=e.___cxa_atexit,Me=e.__extends,ia=e.__nbind_get_value_object,dc=e.__ZN8facebook4yoga14YGNodeToStringEPNSt3__212basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEEP6YGNode14YGPrintOptionsj,Er=e._emscripten_set_main_loop_timing,du=e.__nbind_register_primitive,QA=e.__nbind_register_type,FA=e._emscripten_memcpy_big,mc=e.__nbind_register_function,yc=e.___setErrNo,Il=e.__nbind_register_class,we=e.__nbind_finish,Tt=e._abort,wl=e._nbind_value,Bi=e._llvm_stacksave,Ls=e.___syscall54,Ft=e._defineHidden,Bn=e._emscripten_set_main_loop,Lo=e._emscripten_get_now,ki=e.__nbind_register_callback_signature,vi=e._emscripten_asm_const_iiiiii,sa=e.__nbind_free_external,un=e._emscripten_asm_const_iiii,qn=e._emscripten_asm_const_iiididi,Ec=e.___syscall6,lp=e._atexit,oa=e.___syscall140,aa=e.___syscall146,la=y(0);let Ze=y(0);function ca(s){s=s|0;var l=0;return l=C,C=C+s|0,C=C+15&-16,l|0}function mu(){return C|0}function Bl(s){s=s|0,C=s}function dn(s,l){s=s|0,l=l|0,C=s,T=l}function No(s,l){s=s|0,l=l|0,J||(J=s,te=l)}function RA(s){s=s|0,Ce=s}function TA(){return Ce|0}function Oo(){var s=0,l=0;br(8104,8,400)|0,br(8504,408,540)|0,s=9044,l=s+44|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));o[9088]=0,o[9089]=1,n[2273]=0,n[2274]=948,n[2275]=948,pr(17,8104,U|0)|0}function qa(s){s=s|0,gt(s+948|0)}function Ot(s){return s=y(s),((AD(s)|0)&2147483647)>>>0>2139095040|0}function vn(s,l,c){s=s|0,l=l|0,c=c|0;e:do if(n[s+(l<<3)+4>>2]|0)s=s+(l<<3)|0;else{if((l|2|0)==3&&n[s+60>>2]|0){s=s+56|0;break}switch(l|0){case 0:case 2:case 4:case 5:{if(n[s+52>>2]|0){s=s+48|0;break e}break}default:}if(n[s+68>>2]|0){s=s+64|0;break}else{s=(l|1|0)==5?948:c;break}}while(!1);return s|0}function Mo(s){s=s|0;var l=0;return l=_D(1e3)|0,ua(s,(l|0)!=0,2456),n[2276]=(n[2276]|0)+1,br(l|0,8104,1e3)|0,o[s+2>>0]|0&&(n[l+4>>2]=2,n[l+12>>2]=4),n[l+976>>2]=s,l|0}function ua(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,d0(s,5,3197,f)),C=d}function qi(){return Mo(956)|0}function vl(s){s=s|0;var l=0;return l=Yt(1e3)|0,Cc(l,s),ua(n[s+976>>2]|0,1,2456),n[2276]=(n[2276]|0)+1,n[l+944>>2]=0,l|0}function Cc(s,l){s=s|0,l=l|0;var c=0;br(s|0,l|0,948)|0,Qd(s+948|0,l+948|0),c=s+960|0,s=l+960|0,l=c+40|0;do n[c>>2]=n[s>>2],c=c+4|0,s=s+4|0;while((c|0)<(l|0))}function Dl(s){s=s|0;var l=0,c=0,f=0,d=0;if(l=s+944|0,c=n[l>>2]|0,c|0&&(Aa(c+948|0,s)|0,n[l>>2]=0),c=Di(s)|0,c|0){l=0;do n[(rs(s,l)|0)+944>>2]=0,l=l+1|0;while((l|0)!=(c|0))}c=s+948|0,f=n[c>>2]|0,d=s+952|0,l=n[d>>2]|0,(l|0)!=(f|0)&&(n[d>>2]=l+(~((l+-4-f|0)>>>2)<<2)),ja(c),HD(s),n[2276]=(n[2276]|0)+-1}function Aa(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0;f=n[s>>2]|0,k=s+4|0,c=n[k>>2]|0,m=c;e:do if((f|0)==(c|0))d=f,B=4;else for(s=f;;){if((n[s>>2]|0)==(l|0)){d=s,B=4;break e}if(s=s+4|0,(s|0)==(c|0)){s=0;break}}while(!1);return(B|0)==4&&((d|0)!=(c|0)?(f=d+4|0,s=m-f|0,l=s>>2,l&&(rw(d|0,f|0,s|0)|0,c=n[k>>2]|0),s=d+(l<<2)|0,(c|0)==(s|0)||(n[k>>2]=c+(~((c+-4-s|0)>>>2)<<2)),s=1):s=0),s|0}function Di(s){return s=s|0,(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2|0}function rs(s,l){s=s|0,l=l|0;var c=0;return c=n[s+948>>2]|0,(n[s+952>>2]|0)-c>>2>>>0>l>>>0?s=n[c+(l<<2)>>2]|0:s=0,s|0}function ja(s){s=s|0;var l=0,c=0,f=0,d=0;f=C,C=C+32|0,l=f,d=n[s>>2]|0,c=(n[s+4>>2]|0)-d|0,((n[s+8>>2]|0)-d|0)>>>0>c>>>0&&(d=c>>2,Ld(l,d,d,s+8|0),fD(s,l),Nd(l)),C=f}function yu(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;M=Di(s)|0;do if(M|0){if((n[(rs(s,0)|0)+944>>2]|0)==(s|0)){if(!(Aa(s+948|0,l)|0))break;br(l+400|0,8504,540)|0,n[l+944>>2]=0,Ne(s);break}B=n[(n[s+976>>2]|0)+12>>2]|0,k=s+948|0,F=(B|0)==0,c=0,m=0;do f=n[(n[k>>2]|0)+(m<<2)>>2]|0,(f|0)==(l|0)?Ne(s):(d=vl(f)|0,n[(n[k>>2]|0)+(c<<2)>>2]=d,n[d+944>>2]=s,F||hT[B&15](f,d,s,c),c=c+1|0),m=m+1|0;while((m|0)!=(M|0));if(c>>>0>>0){F=s+948|0,k=s+952|0,B=c,c=n[k>>2]|0;do m=(n[F>>2]|0)+(B<<2)|0,f=m+4|0,d=c-f|0,l=d>>2,l&&(rw(m|0,f|0,d|0)|0,c=n[k>>2]|0),d=c,f=m+(l<<2)|0,(d|0)!=(f|0)&&(c=d+(~((d+-4-f|0)>>>2)<<2)|0,n[k>>2]=c),B=B+1|0;while((B|0)!=(M|0))}}while(!1)}function Sl(s){s=s|0;var l=0,c=0,f=0,d=0;pi(s,(Di(s)|0)==0,2491),pi(s,(n[s+944>>2]|0)==0,2545),l=s+948|0,c=n[l>>2]|0,f=s+952|0,d=n[f>>2]|0,(d|0)!=(c|0)&&(n[f>>2]=d+(~((d+-4-c|0)>>>2)<<2)),ja(l),l=s+976|0,c=n[l>>2]|0,br(s|0,8104,1e3)|0,o[c+2>>0]|0&&(n[s+4>>2]=2,n[s+12>>2]=4),n[l>>2]=c}function pi(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;d=C,C=C+16|0,f=d,l||(n[f>>2]=c,so(s,5,3197,f)),C=d}function Dn(){return n[2276]|0}function Pl(){var s=0;return s=_D(20)|0,Je((s|0)!=0,2592),n[2277]=(n[2277]|0)+1,n[s>>2]=n[239],n[s+4>>2]=n[240],n[s+8>>2]=n[241],n[s+12>>2]=n[242],n[s+16>>2]=n[243],s|0}function Je(s,l){s=s|0,l=l|0;var c=0,f=0;f=C,C=C+16|0,c=f,s||(n[c>>2]=l,so(0,5,3197,c)),C=f}function st(s){s=s|0,HD(s),n[2277]=(n[2277]|0)+-1}function vt(s,l){s=s|0,l=l|0;var c=0;l?(pi(s,(Di(s)|0)==0,2629),c=1):(c=0,l=0),n[s+964>>2]=l,n[s+988>>2]=c}function ar(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+8|0,d=f+4|0,B=f,n[d>>2]=l,pi(s,(n[l+944>>2]|0)==0,2709),pi(s,(n[s+964>>2]|0)==0,2763),ee(s),l=s+948|0,n[B>>2]=(n[l>>2]|0)+(c<<2),n[m>>2]=n[B>>2],ye(l,m,d)|0,n[(n[d>>2]|0)+944>>2]=s,Ne(s),C=f}function ee(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;if(c=Di(s)|0,c|0&&(n[(rs(s,0)|0)+944>>2]|0)!=(s|0)){f=n[(n[s+976>>2]|0)+12>>2]|0,d=s+948|0,m=(f|0)==0,l=0;do B=n[(n[d>>2]|0)+(l<<2)>>2]|0,k=vl(B)|0,n[(n[d>>2]|0)+(l<<2)>>2]=k,n[k+944>>2]=s,m||hT[f&15](B,k,s,l),l=l+1|0;while((l|0)!=(c|0))}}function ye(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0;rt=C,C=C+64|0,j=rt+52|0,k=rt+48|0,oe=rt+28|0,We=rt+24|0,Oe=rt+20|0,Qe=rt,f=n[s>>2]|0,m=f,l=f+((n[l>>2]|0)-m>>2<<2)|0,f=s+4|0,d=n[f>>2]|0,B=s+8|0;do if(d>>>0<(n[B>>2]|0)>>>0){if((l|0)==(d|0)){n[l>>2]=n[c>>2],n[f>>2]=(n[f>>2]|0)+4;break}pD(s,l,d,l+4|0),l>>>0<=c>>>0&&(c=(n[f>>2]|0)>>>0>c>>>0?c+4|0:c),n[l>>2]=n[c>>2]}else{f=(d-m>>2)+1|0,d=L(s)|0,d>>>0>>0&&Zr(s),O=n[s>>2]|0,M=(n[B>>2]|0)-O|0,m=M>>1,Ld(Qe,M>>2>>>0>>1>>>0?m>>>0>>0?f:m:d,l-O>>2,s+8|0),O=Qe+8|0,f=n[O>>2]|0,m=Qe+12|0,M=n[m>>2]|0,B=M,F=f;do if((f|0)==(M|0)){if(M=Qe+4|0,f=n[M>>2]|0,Xe=n[Qe>>2]|0,d=Xe,f>>>0<=Xe>>>0){f=B-d>>1,f=f|0?f:1,Ld(oe,f,f>>>2,n[Qe+16>>2]|0),n[We>>2]=n[M>>2],n[Oe>>2]=n[O>>2],n[k>>2]=n[We>>2],n[j>>2]=n[Oe>>2],QI(oe,k,j),f=n[Qe>>2]|0,n[Qe>>2]=n[oe>>2],n[oe>>2]=f,f=oe+4|0,Xe=n[M>>2]|0,n[M>>2]=n[f>>2],n[f>>2]=Xe,f=oe+8|0,Xe=n[O>>2]|0,n[O>>2]=n[f>>2],n[f>>2]=Xe,f=oe+12|0,Xe=n[m>>2]|0,n[m>>2]=n[f>>2],n[f>>2]=Xe,Nd(oe),f=n[O>>2]|0;break}m=f,B=((m-d>>2)+1|0)/-2|0,k=f+(B<<2)|0,d=F-m|0,m=d>>2,m&&(rw(k|0,f|0,d|0)|0,f=n[M>>2]|0),Xe=k+(m<<2)|0,n[O>>2]=Xe,n[M>>2]=f+(B<<2),f=Xe}while(!1);n[f>>2]=n[c>>2],n[O>>2]=(n[O>>2]|0)+4,l=hD(s,Qe,l)|0,Nd(Qe)}while(!1);return C=rt,l|0}function Ne(s){s=s|0;var l=0;do{if(l=s+984|0,o[l>>0]|0)break;o[l>>0]=1,h[s+504>>2]=y(ue),s=n[s+944>>2]|0}while(s|0)}function gt(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),yt(c))}function mt(s){return s=s|0,n[s+944>>2]|0}function Dt(s){s=s|0,pi(s,(n[s+964>>2]|0)!=0,2832),Ne(s)}function er(s){return s=s|0,(o[s+984>>0]|0)!=0|0}function sn(s,l){s=s|0,l=l|0,wUe(s,l,400)|0&&(br(s|0,l|0,400)|0,Ne(s))}function ei(s){s=s|0;var l=Ze;return l=y(h[s+44>>2]),s=Ot(l)|0,y(s?y(0):l)}function Qi(s){s=s|0;var l=Ze;return l=y(h[s+48>>2]),Ot(l)|0&&(l=o[(n[s+976>>2]|0)+2>>0]|0?y(1):y(0)),y(l)}function Sn(s,l){s=s|0,l=l|0,n[s+980>>2]=l}function fa(s){return s=s|0,n[s+980>>2]|0}function wd(s,l){s=s|0,l=l|0;var c=0;c=s+4|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function BI(s){return s=s|0,n[s+4>>2]|0}function eo(s,l){s=s|0,l=l|0;var c=0;c=s+8|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Bd(s){return s=s|0,n[s+8>>2]|0}function cp(s,l){s=s|0,l=l|0;var c=0;c=s+12|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function vI(s){return s=s|0,n[s+12>>2]|0}function to(s,l){s=s|0,l=l|0;var c=0;c=s+16|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function up(s){return s=s|0,n[s+16>>2]|0}function Ap(s,l){s=s|0,l=l|0;var c=0;c=s+20|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Ic(s){return s=s|0,n[s+20>>2]|0}function fp(s,l){s=s|0,l=l|0;var c=0;c=s+24|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function s0(s){return s=s|0,n[s+24>>2]|0}function o0(s,l){s=s|0,l=l|0;var c=0;c=s+28|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function a0(s){return s=s|0,n[s+28>>2]|0}function vd(s,l){s=s|0,l=l|0;var c=0;c=s+32|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Eu(s){return s=s|0,n[s+32>>2]|0}function ro(s,l){s=s|0,l=l|0;var c=0;c=s+36|0,(n[c>>2]|0)!=(l|0)&&(n[c>>2]=l,Ne(s))}function Ga(s){return s=s|0,n[s+36>>2]|0}function pp(s,l){s=s|0,l=y(l);var c=0;c=s+40|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function l0(s,l){s=s|0,l=y(l);var c=0;c=s+44|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function Wa(s,l){s=s|0,l=y(l);var c=0;c=s+48|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function Ya(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+52|0,d=s+56|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Dd(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+52|0,c=s+56|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,Ne(s))}function LA(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+52|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Sd(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Pd(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+132+(l<<3)|0,l=s+132+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function NA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+132+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function OA(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function W(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+60+(l<<3)|0,l=s+60+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function xt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+60+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function MA(s,l){s=s|0,l=l|0;var c=0;c=s+60+(l<<3)+4|0,(n[c>>2]|0)!=3&&(h[s+60+(l<<3)>>2]=y(ue),n[c>>2]=3,Ne(s))}function no(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function Cu(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=m?0:2,d=s+204+(l<<3)|0,l=s+204+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function dt(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=l+204+(c<<3)|0,l=n[f+4>>2]|0,c=s,n[c>>2]=n[f>>2],n[c+4>>2]=l}function wc(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0,m=0;m=Ot(c)|0,f=(m^1)&1,d=s+276+(l<<3)|0,l=s+276+(l<<3)+4|0,m|y(h[d>>2])==c&&(n[l>>2]|0)==(f|0)||(h[d>>2]=c,n[l>>2]=f,Ne(s))}function xd(s,l){return s=s|0,l=l|0,y(h[s+276+(l<<3)>>2])}function c0(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+348|0,d=s+352|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function DI(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+348|0,c=s+352|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,Ne(s))}function hp(s){s=s|0;var l=0;l=s+352|0,(n[l>>2]|0)!=3&&(h[s+348>>2]=y(ue),n[l>>2]=3,Ne(s))}function cr(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+348|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Ni(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+356|0,d=s+360|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function Iu(s,l){s=s|0,l=y(l);var c=0,f=0;f=s+356|0,c=s+360|0,y(h[f>>2])==l&&(n[c>>2]|0)==2||(h[f>>2]=l,f=Ot(l)|0,n[c>>2]=f?3:2,Ne(s))}function pa(s){s=s|0;var l=0;l=s+360|0,(n[l>>2]|0)!=3&&(h[s+356>>2]=y(ue),n[l>>2]=3,Ne(s))}function u0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+356|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Bc(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function wu(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+364|0,d=s+368|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function wt(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+364|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function oi(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function UA(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+372|0,d=s+376|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function ha(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+372|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function Uo(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function ga(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+380|0,d=s+384|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function A0(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+380|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function gp(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=(m^1)&1,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function f0(s,l){s=s|0,l=y(l);var c=0,f=0,d=0,m=0;m=Ot(l)|0,c=m?0:2,f=s+388|0,d=s+392|0,m|y(h[f>>2])==l&&(n[d>>2]|0)==(c|0)||(h[f>>2]=l,n[d>>2]=c,Ne(s))}function bd(s,l){s=s|0,l=l|0;var c=0,f=0;f=l+388|0,c=n[f+4>>2]|0,l=s,n[l>>2]=n[f>>2],n[l+4>>2]=c}function _A(s,l){s=s|0,l=y(l);var c=0;c=s+396|0,y(h[c>>2])!=l&&(h[c>>2]=l,Ne(s))}function p0(s){return s=s|0,y(h[s+396>>2])}function vc(s){return s=s|0,y(h[s+400>>2])}function Dc(s){return s=s|0,y(h[s+404>>2])}function Bu(s){return s=s|0,y(h[s+408>>2])}function gs(s){return s=s|0,y(h[s+412>>2])}function Sc(s){return s=s|0,y(h[s+416>>2])}function On(s){return s=s|0,y(h[s+420>>2])}function ji(s,l){switch(s=s|0,l=l|0,pi(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+424+(l<<2)>>2])}function Ci(s,l){switch(s=s|0,l=l|0,pi(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+448+(l<<2)>>2])}function HA(s,l){switch(s=s|0,l=l|0,pi(s,(l|0)<6,2918),l|0){case 0:{l=(n[s+496>>2]|0)==2?5:4;break}case 2:{l=(n[s+496>>2]|0)==2?4:5;break}default:}return y(h[s+472+(l<<2)>>2])}function vu(s,l){s=s|0,l=l|0;var c=0,f=Ze;return c=n[s+4>>2]|0,(c|0)==(n[l+4>>2]|0)?c?(f=y(h[s>>2]),s=y(ie(y(f-y(h[l>>2]))))>2]=0,n[f+4>>2]=0,n[f+8>>2]=0,dc(f|0,s|0,l|0,0),so(s,3,(o[f+11>>0]|0)<0?n[f>>2]|0:f,c),WUe(f),C=c}function Gi(s,l,c,f){s=y(s),l=y(l),c=c|0,f=f|0;var d=Ze;s=y(s*l),d=y(lT(s,y(1)));do if(An(d,y(0))|0)s=y(s-d);else{if(s=y(s-d),An(d,y(1))|0){s=y(s+y(1));break}if(c){s=y(s+y(1));break}f||(d>y(.5)?d=y(1):(f=An(d,y(.5))|0,d=y(f?1:0)),s=y(s+d))}while(!1);return y(s/l)}function Va(s,l,c,f,d,m,B,k,F,M,O,j,oe){s=s|0,l=y(l),c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,k=y(k),F=y(F),M=y(M),O=y(O),j=y(j),oe=oe|0;var We=0,Oe=Ze,Qe=Ze,rt=Ze,Xe=Ze,ct=Ze,_e=Ze;return F>2]),Oe!=y(0))?(rt=y(Gi(l,Oe,0,0)),Xe=y(Gi(f,Oe,0,0)),Qe=y(Gi(m,Oe,0,0)),Oe=y(Gi(k,Oe,0,0))):(Qe=m,rt=l,Oe=k,Xe=f),(d|0)==(s|0)?We=An(Qe,rt)|0:We=0,(B|0)==(c|0)?oe=An(Oe,Xe)|0:oe=0,!We&&(ct=y(l-O),!(io(s,ct,F)|0))&&!(Du(s,ct,d,F)|0)?We=Su(s,ct,d,m,F)|0:We=1,!oe&&(_e=y(f-j),!(io(c,_e,M)|0))&&!(Du(c,_e,B,M)|0)?oe=Su(c,_e,B,k,M)|0:oe=1,oe=We&oe),oe|0}function io(s,l,c){return s=s|0,l=y(l),c=y(c),(s|0)==1?s=An(l,c)|0:s=0,s|0}function Du(s,l,c,f){return s=s|0,l=y(l),c=c|0,f=y(f),(s|0)==2&(c|0)==0?l>=f?s=1:s=An(l,f)|0:s=0,s|0}function Su(s,l,c,f,d){return s=s|0,l=y(l),c=c|0,f=y(f),d=y(d),(s|0)==2&(c|0)==2&f>l?d<=l?s=1:s=An(l,d)|0:s=0,s|0}function Ka(s,l,c,f,d,m,B,k,F,M,O){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),F=F|0,M=M|0,O=O|0;var j=0,oe=0,We=0,Oe=0,Qe=Ze,rt=Ze,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=Ze,lo=Ze,co=Ze,uo=0,Ia=0;lr=C,C=C+160|0,Zt=lr+152|0,ur=lr+120|0,_r=lr+104|0,_e=lr+72|0,Oe=lr+56|0,Nt=lr+8|0,ct=lr,Ge=(n[2279]|0)+1|0,n[2279]=Ge,kr=s+984|0,o[kr>>0]|0&&(n[s+512>>2]|0)!=(n[2278]|0)?Xe=4:(n[s+516>>2]|0)==(f|0)?Or=0:Xe=4,(Xe|0)==4&&(n[s+520>>2]=0,n[s+924>>2]=-1,n[s+928>>2]=-1,h[s+932>>2]=y(-1),h[s+936>>2]=y(-1),Or=1);e:do if(n[s+964>>2]|0)if(Qe=y(fn(s,2,B)),rt=y(fn(s,0,B)),j=s+916|0,co=y(h[j>>2]),lo=y(h[s+920>>2]),Ln=y(h[s+932>>2]),Va(d,l,m,c,n[s+924>>2]|0,co,n[s+928>>2]|0,lo,Ln,y(h[s+936>>2]),Qe,rt,O)|0)Xe=22;else if(We=n[s+520>>2]|0,!We)Xe=21;else for(oe=0;;){if(j=s+524+(oe*24|0)|0,Ln=y(h[j>>2]),lo=y(h[s+524+(oe*24|0)+4>>2]),co=y(h[s+524+(oe*24|0)+16>>2]),Va(d,l,m,c,n[s+524+(oe*24|0)+8>>2]|0,Ln,n[s+524+(oe*24|0)+12>>2]|0,lo,co,y(h[s+524+(oe*24|0)+20>>2]),Qe,rt,O)|0){Xe=22;break e}if(oe=oe+1|0,oe>>>0>=We>>>0){Xe=21;break}}else{if(F){if(j=s+916|0,!(An(y(h[j>>2]),l)|0)){Xe=21;break}if(!(An(y(h[s+920>>2]),c)|0)){Xe=21;break}if((n[s+924>>2]|0)!=(d|0)){Xe=21;break}j=(n[s+928>>2]|0)==(m|0)?j:0,Xe=22;break}if(We=n[s+520>>2]|0,!We)Xe=21;else for(oe=0;;){if(j=s+524+(oe*24|0)|0,An(y(h[j>>2]),l)|0&&An(y(h[s+524+(oe*24|0)+4>>2]),c)|0&&(n[s+524+(oe*24|0)+8>>2]|0)==(d|0)&&(n[s+524+(oe*24|0)+12>>2]|0)==(m|0)){Xe=22;break e}if(oe=oe+1|0,oe>>>0>=We>>>0){Xe=21;break}}}while(!1);do if((Xe|0)==21)o[11697]|0?(j=0,Xe=28):(j=0,Xe=31);else if((Xe|0)==22){if(oe=(o[11697]|0)!=0,!((j|0)!=0&(Or^1)))if(oe){Xe=28;break}else{Xe=31;break}Oe=j+16|0,n[s+908>>2]=n[Oe>>2],We=j+20|0,n[s+912>>2]=n[We>>2],(o[11698]|0)==0|oe^1||(n[ct>>2]=Pc(Ge)|0,n[ct+4>>2]=Ge,so(s,4,2972,ct),oe=n[s+972>>2]|0,oe|0&&ef[oe&127](s),d=_o(d,F)|0,m=_o(m,F)|0,Ia=+y(h[Oe>>2]),uo=+y(h[We>>2]),n[Nt>>2]=d,n[Nt+4>>2]=m,E[Nt+8>>3]=+l,E[Nt+16>>3]=+c,E[Nt+24>>3]=Ia,E[Nt+32>>3]=uo,n[Nt+40>>2]=M,so(s,4,2989,Nt))}while(!1);return(Xe|0)==28&&(oe=Pc(Ge)|0,n[Oe>>2]=oe,n[Oe+4>>2]=Ge,n[Oe+8>>2]=Or?3047:11699,so(s,4,3038,Oe),oe=n[s+972>>2]|0,oe|0&&ef[oe&127](s),Nt=_o(d,F)|0,Xe=_o(m,F)|0,n[_e>>2]=Nt,n[_e+4>>2]=Xe,E[_e+8>>3]=+l,E[_e+16>>3]=+c,n[_e+24>>2]=M,so(s,4,3049,_e),Xe=31),(Xe|0)==31&&(ds(s,l,c,f,d,m,B,k,F,O),o[11697]|0&&(oe=n[2279]|0,Nt=Pc(oe)|0,n[_r>>2]=Nt,n[_r+4>>2]=oe,n[_r+8>>2]=Or?3047:11699,so(s,4,3083,_r),oe=n[s+972>>2]|0,oe|0&&ef[oe&127](s),Nt=_o(d,F)|0,_r=_o(m,F)|0,uo=+y(h[s+908>>2]),Ia=+y(h[s+912>>2]),n[ur>>2]=Nt,n[ur+4>>2]=_r,E[ur+8>>3]=uo,E[ur+16>>3]=Ia,n[ur+24>>2]=M,so(s,4,3092,ur)),n[s+516>>2]=f,j||(oe=s+520|0,j=n[oe>>2]|0,(j|0)==16&&(o[11697]|0&&so(s,4,3124,Zt),n[oe>>2]=0,j=0),F?j=s+916|0:(n[oe>>2]=j+1,j=s+524+(j*24|0)|0),h[j>>2]=l,h[j+4>>2]=c,n[j+8>>2]=d,n[j+12>>2]=m,n[j+16>>2]=n[s+908>>2],n[j+20>>2]=n[s+912>>2],j=0)),F&&(n[s+416>>2]=n[s+908>>2],n[s+420>>2]=n[s+912>>2],o[s+985>>0]=1,o[kr>>0]=0),n[2279]=(n[2279]|0)+-1,n[s+512>>2]=n[2278],C=lr,Or|(j|0)==0|0}function fn(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(K(s,l,c)),y(f+y(re(s,l,c)))}function so(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=C,C=C+16|0,d=m,n[d>>2]=f,s?f=n[s+976>>2]|0:f=0,yp(f,s,l,c,d),C=m}function Pc(s){return s=s|0,(s>>>0>60?3201:3201+(60-s)|0)|0}function _o(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+32|0,c=d+12|0,f=d,n[c>>2]=n[254],n[c+4>>2]=n[255],n[c+8>>2]=n[256],n[f>>2]=n[257],n[f+4>>2]=n[258],n[f+8>>2]=n[259],(s|0)>2?s=11699:s=n[(l?f:c)+(s<<2)>>2]|0,C=d,s|0}function ds(s,l,c,f,d,m,B,k,F,M){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=m|0,B=y(B),k=y(k),F=F|0,M=M|0;var O=0,j=0,oe=0,We=0,Oe=Ze,Qe=Ze,rt=Ze,Xe=Ze,ct=Ze,_e=Ze,Ge=Ze,Nt=0,_r=0,ur=0,Zt=Ze,kr=Ze,Or=0,lr=Ze,Ln=0,lo=0,co=0,uo=0,Ia=0,Lp=0,Np=0,kl=0,Op=0,Nu=0,Ou=0,Mp=0,Up=0,_p=0,$r=0,Ql=0,Hp=0,Lc=0,qp=Ze,jp=Ze,Mu=Ze,Uu=Ze,Nc=Ze,Ms=0,rl=0,Go=0,Fl=0,rf=0,nf=Ze,_u=Ze,sf=Ze,of=Ze,Us=Ze,Cs=Ze,Rl=0,Un=Ze,af=Ze,Ao=Ze,Oc=Ze,fo=Ze,Mc=Ze,lf=0,cf=0,Uc=Ze,_s=Ze,Tl=0,uf=0,Af=0,ff=0,Fr=Ze,ri=0,Is=0,po=0,Hs=0,Lr=0,Ar=0,Ll=0,Kt=Ze,pf=0,hi=0;Ll=C,C=C+16|0,Ms=Ll+12|0,rl=Ll+8|0,Go=Ll+4|0,Fl=Ll,pi(s,(d|0)==0|(Ot(l)|0)^1,3326),pi(s,(m|0)==0|(Ot(c)|0)^1,3406),Is=At(s,f)|0,n[s+496>>2]=Is,Lr=hr(2,Is)|0,Ar=hr(0,Is)|0,h[s+440>>2]=y(K(s,Lr,B)),h[s+444>>2]=y(re(s,Lr,B)),h[s+428>>2]=y(K(s,Ar,B)),h[s+436>>2]=y(re(s,Ar,B)),h[s+464>>2]=y(Ir(s,Lr)),h[s+468>>2]=y(Rn(s,Lr)),h[s+452>>2]=y(Ir(s,Ar)),h[s+460>>2]=y(Rn(s,Ar)),h[s+488>>2]=y(ai(s,Lr,B)),h[s+492>>2]=y(ns(s,Lr,B)),h[s+476>>2]=y(ai(s,Ar,B)),h[s+484>>2]=y(ns(s,Ar,B));do if(n[s+964>>2]|0)GA(s,l,c,d,m,B,k);else{if(po=s+948|0,Hs=(n[s+952>>2]|0)-(n[po>>2]|0)>>2,!Hs){lD(s,l,c,d,m,B,k);break}if(!F&&SI(s,l,c,d,m,B,k)|0)break;ee(s),Ql=s+508|0,o[Ql>>0]=0,Lr=hr(n[s+4>>2]|0,Is)|0,Ar=Fd(Lr,Is)|0,ri=ge(Lr)|0,Hp=n[s+8>>2]|0,uf=s+28|0,Lc=(n[uf>>2]|0)!=0,fo=ri?B:k,Uc=ri?k:B,qp=y(Cp(s,Lr,B)),jp=y(PI(s,Lr,B)),Oe=y(Cp(s,Ar,B)),Mc=y(da(s,Lr,B)),_s=y(da(s,Ar,B)),ur=ri?d:m,Tl=ri?m:d,Fr=ri?Mc:_s,ct=ri?_s:Mc,Oc=y(fn(s,2,B)),Xe=y(fn(s,0,B)),Qe=y(y(Vr(s+364|0,B))-Fr),rt=y(y(Vr(s+380|0,B))-Fr),_e=y(y(Vr(s+372|0,k))-ct),Ge=y(y(Vr(s+388|0,k))-ct),Mu=ri?Qe:_e,Uu=ri?rt:Ge,Oc=y(l-Oc),l=y(Oc-Fr),Ot(l)|0?Fr=l:Fr=y(Yn(y(M0(l,rt)),Qe)),af=y(c-Xe),l=y(af-ct),Ot(l)|0?Ao=l:Ao=y(Yn(y(M0(l,Ge)),_e)),Qe=ri?Fr:Ao,Un=ri?Ao:Fr;e:do if((ur|0)==1)for(f=0,j=0;;){if(O=rs(s,j)|0,!f)y(WA(O))>y(0)&&y(Ip(O))>y(0)?f=O:f=0;else if(xI(O)|0){We=0;break e}if(j=j+1|0,j>>>0>=Hs>>>0){We=f;break}}else We=0;while(!1);Nt=We+500|0,_r=We+504|0,f=0,O=0,l=y(0),oe=0;do{if(j=n[(n[po>>2]|0)+(oe<<2)>>2]|0,(n[j+36>>2]|0)==1)Rd(j),o[j+985>>0]=1,o[j+984>>0]=0;else{Pu(j),F&&mp(j,At(j,Is)|0,Qe,Un,Fr);do if((n[j+24>>2]|0)!=1)if((j|0)==(We|0)){n[Nt>>2]=n[2278],h[_r>>2]=y(0);break}else{cD(s,j,Fr,d,Ao,Fr,Ao,m,Is,M);break}else O|0&&(n[O+960>>2]=j),n[j+960>>2]=0,O=j,f=f|0?f:j;while(!1);Cs=y(h[j+504>>2]),l=y(l+y(Cs+y(fn(j,Lr,Fr))))}oe=oe+1|0}while((oe|0)!=(Hs|0));for(co=l>Qe,Rl=Lc&((ur|0)==2&co)?1:ur,Ln=(Tl|0)==1,Ia=Ln&(F^1),Lp=(Rl|0)==1,Np=(Rl|0)==2,kl=976+(Lr<<2)|0,Op=(Tl|2|0)==2,_p=Ln&(Lc^1),Nu=1040+(Ar<<2)|0,Ou=1040+(Lr<<2)|0,Mp=976+(Ar<<2)|0,Up=(Tl|0)!=1,co=Lc&((ur|0)!=0&co),lo=s+976|0,Ln=Ln^1,l=Qe,Or=0,uo=0,Cs=y(0),Nc=y(0);;){e:do if(Or>>>0>>0)for(_r=n[po>>2]|0,oe=0,Ge=y(0),_e=y(0),rt=y(0),Qe=y(0),j=0,O=0,We=Or;;){if(Nt=n[_r+(We<<2)>>2]|0,(n[Nt+36>>2]|0)!=1&&(n[Nt+940>>2]=uo,(n[Nt+24>>2]|0)!=1)){if(Xe=y(fn(Nt,Lr,Fr)),$r=n[kl>>2]|0,c=y(Vr(Nt+380+($r<<3)|0,fo)),ct=y(h[Nt+504>>2]),c=y(M0(c,ct)),c=y(Yn(y(Vr(Nt+364+($r<<3)|0,fo)),c)),Lc&(oe|0)!=0&y(Xe+y(_e+c))>l){m=oe,Xe=Ge,ur=We;break e}Xe=y(Xe+c),c=y(_e+Xe),Xe=y(Ge+Xe),xI(Nt)|0&&(rt=y(rt+y(WA(Nt))),Qe=y(Qe-y(ct*y(Ip(Nt))))),O|0&&(n[O+960>>2]=Nt),n[Nt+960>>2]=0,oe=oe+1|0,O=Nt,j=j|0?j:Nt}else Xe=Ge,c=_e;if(We=We+1|0,We>>>0>>0)Ge=Xe,_e=c;else{m=oe,ur=We;break}}else m=0,Xe=y(0),rt=y(0),Qe=y(0),j=0,ur=Or;while(!1);$r=rt>y(0)&rty(0)&QeUu&((Ot(Uu)|0)^1))l=Uu,$r=51;else if(o[(n[lo>>2]|0)+3>>0]|0)$r=51;else{if(Zt!=y(0)&&y(WA(s))!=y(0)){$r=53;break}l=Xe,$r=53}while(!1);if(($r|0)==51&&($r=0,Ot(l)|0?$r=53:(kr=y(l-Xe),lr=l)),($r|0)==53&&($r=0,Xe>2]|0,We=kry(0),_e=y(kr/Zt),rt=y(0),Xe=y(0),l=y(0),O=j;do c=y(Vr(O+380+(oe<<3)|0,fo)),Qe=y(Vr(O+364+(oe<<3)|0,fo)),Qe=y(M0(c,y(Yn(Qe,y(h[O+504>>2]))))),We?(c=y(Qe*y(Ip(O))),c!=y(-0)&&(Kt=y(Qe-y(ct*c)),nf=y(Mn(O,Lr,Kt,lr,Fr)),Kt!=nf)&&(rt=y(rt-y(nf-Qe)),l=y(l+c))):Nt&&(_u=y(WA(O)),_u!=y(0))&&(Kt=y(Qe+y(_e*_u)),sf=y(Mn(O,Lr,Kt,lr,Fr)),Kt!=sf)&&(rt=y(rt-y(sf-Qe)),Xe=y(Xe-_u)),O=n[O+960>>2]|0;while(O|0);if(l=y(Ge+l),Qe=y(kr+rt),rf)l=y(0);else{ct=y(Zt+Xe),We=n[kl>>2]|0,Nt=Qey(0),ct=y(Qe/ct),l=y(0);do{Kt=y(Vr(j+380+(We<<3)|0,fo)),rt=y(Vr(j+364+(We<<3)|0,fo)),rt=y(M0(Kt,y(Yn(rt,y(h[j+504>>2]))))),Nt?(Kt=y(rt*y(Ip(j))),Qe=y(-Kt),Kt!=y(-0)?(Kt=y(_e*Qe),Qe=y(Mn(j,Lr,y(rt+(_r?Qe:Kt)),lr,Fr))):Qe=rt):oe&&(of=y(WA(j)),of!=y(0))?Qe=y(Mn(j,Lr,y(rt+y(ct*of)),lr,Fr)):Qe=rt,l=y(l-y(Qe-rt)),Xe=y(fn(j,Lr,Fr)),c=y(fn(j,Ar,Fr)),Qe=y(Qe+Xe),h[rl>>2]=Qe,n[Fl>>2]=1,rt=y(h[j+396>>2]);e:do if(Ot(rt)|0){O=Ot(Un)|0;do if(!O){if(co|(Ns(j,Ar,Un)|0|Ln)||(Wi(s,j)|0)!=4||(n[(Ja(j,Ar)|0)+4>>2]|0)==3||(n[(za(j,Ar)|0)+4>>2]|0)==3)break;h[Ms>>2]=Un,n[Go>>2]=1;break e}while(!1);if(Ns(j,Ar,Un)|0){O=n[j+992+(n[Mp>>2]<<2)>>2]|0,Kt=y(c+y(Vr(O,Un))),h[Ms>>2]=Kt,O=Up&(n[O+4>>2]|0)==2,n[Go>>2]=((Ot(Kt)|0|O)^1)&1;break}else{h[Ms>>2]=Un,n[Go>>2]=O?0:2;break}}else Kt=y(Qe-Xe),Zt=y(Kt/rt),Kt=y(rt*Kt),n[Go>>2]=1,h[Ms>>2]=y(c+(ri?Zt:Kt));while(!1);xc(j,Lr,lr,Fr,Fl,rl),xc(j,Ar,Un,Fr,Go,Ms);do if(!(Ns(j,Ar,Un)|0)&&(Wi(s,j)|0)==4){if((n[(Ja(j,Ar)|0)+4>>2]|0)==3){O=0;break}O=(n[(za(j,Ar)|0)+4>>2]|0)!=3}else O=0;while(!1);Kt=y(h[rl>>2]),Zt=y(h[Ms>>2]),pf=n[Fl>>2]|0,hi=n[Go>>2]|0,Ka(j,ri?Kt:Zt,ri?Zt:Kt,Is,ri?pf:hi,ri?hi:pf,Fr,Ao,F&(O^1),3488,M)|0,o[Ql>>0]=o[Ql>>0]|o[j+508>>0],j=n[j+960>>2]|0}while(j|0)}}else l=y(0);if(l=y(kr+l),hi=l>0]=hi|u[Ql>>0],Np&l>y(0)?(O=n[kl>>2]|0,n[s+364+(O<<3)+4>>2]|0&&(Us=y(Vr(s+364+(O<<3)|0,fo)),Us>=y(0))?Qe=y(Yn(y(0),y(Us-y(lr-l)))):Qe=y(0)):Qe=l,Nt=Or>>>0>>0,Nt){We=n[po>>2]|0,oe=Or,O=0;do j=n[We+(oe<<2)>>2]|0,n[j+24>>2]|0||(O=((n[(Ja(j,Lr)|0)+4>>2]|0)==3&1)+O|0,O=O+((n[(za(j,Lr)|0)+4>>2]|0)==3&1)|0),oe=oe+1|0;while((oe|0)!=(ur|0));O?(Xe=y(0),c=y(0)):$r=101}else $r=101;e:do if(($r|0)==101)switch($r=0,Hp|0){case 1:{O=0,Xe=y(Qe*y(.5)),c=y(0);break e}case 2:{O=0,Xe=Qe,c=y(0);break e}case 3:{if(m>>>0<=1){O=0,Xe=y(0),c=y(0);break e}c=y((m+-1|0)>>>0),O=0,Xe=y(0),c=y(y(Yn(Qe,y(0)))/c);break e}case 5:{c=y(Qe/y((m+1|0)>>>0)),O=0,Xe=c;break e}case 4:{c=y(Qe/y(m>>>0)),O=0,Xe=y(c*y(.5));break e}default:{O=0,Xe=y(0),c=y(0);break e}}while(!1);if(l=y(qp+Xe),Nt){rt=y(Qe/y(O|0)),oe=n[po>>2]|0,j=Or,Qe=y(0);do{O=n[oe+(j<<2)>>2]|0;e:do if((n[O+36>>2]|0)!=1){switch(n[O+24>>2]|0){case 1:{if(Ho(O,Lr)|0){if(!F)break e;Kt=y(YA(O,Lr,lr)),Kt=y(Kt+y(Ir(s,Lr))),Kt=y(Kt+y(K(O,Lr,Fr))),h[O+400+(n[Ou>>2]<<2)>>2]=Kt;break e}break}case 0:if(hi=(n[(Ja(O,Lr)|0)+4>>2]|0)==3,Kt=y(rt+l),l=hi?Kt:l,F&&(hi=O+400+(n[Ou>>2]<<2)|0,h[hi>>2]=y(l+y(h[hi>>2]))),hi=(n[(za(O,Lr)|0)+4>>2]|0)==3,Kt=y(rt+l),l=hi?Kt:l,Ia){Kt=y(c+y(fn(O,Lr,Fr))),Qe=Un,l=y(l+y(Kt+y(h[O+504>>2])));break e}else{l=y(l+y(c+y(VA(O,Lr,Fr)))),Qe=y(Yn(Qe,y(VA(O,Ar,Fr))));break e}default:}F&&(Kt=y(Xe+y(Ir(s,Lr))),hi=O+400+(n[Ou>>2]<<2)|0,h[hi>>2]=y(Kt+y(h[hi>>2])))}while(!1);j=j+1|0}while((j|0)!=(ur|0))}else Qe=y(0);if(c=y(jp+l),Op?Xe=y(y(Mn(s,Ar,y(_s+Qe),Uc,B))-_s):Xe=Un,rt=y(y(Mn(s,Ar,y(_s+(_p?Un:Qe)),Uc,B))-_s),Nt&F){j=Or;do{oe=n[(n[po>>2]|0)+(j<<2)>>2]|0;do if((n[oe+36>>2]|0)!=1){if((n[oe+24>>2]|0)==1){if(Ho(oe,Ar)|0){if(Kt=y(YA(oe,Ar,Un)),Kt=y(Kt+y(Ir(s,Ar))),Kt=y(Kt+y(K(oe,Ar,Fr))),O=n[Nu>>2]|0,h[oe+400+(O<<2)>>2]=Kt,!(Ot(Kt)|0))break}else O=n[Nu>>2]|0;Kt=y(Ir(s,Ar)),h[oe+400+(O<<2)>>2]=y(Kt+y(K(oe,Ar,Fr)));break}O=Wi(s,oe)|0;do if((O|0)==4){if((n[(Ja(oe,Ar)|0)+4>>2]|0)==3){$r=139;break}if((n[(za(oe,Ar)|0)+4>>2]|0)==3){$r=139;break}if(Ns(oe,Ar,Un)|0){l=Oe;break}pf=n[oe+908+(n[kl>>2]<<2)>>2]|0,n[Ms>>2]=pf,l=y(h[oe+396>>2]),hi=Ot(l)|0,Qe=(n[D>>2]=pf,y(h[D>>2])),hi?l=rt:(kr=y(fn(oe,Ar,Fr)),Kt=y(Qe/l),l=y(l*Qe),l=y(kr+(ri?Kt:l))),h[rl>>2]=l,h[Ms>>2]=y(y(fn(oe,Lr,Fr))+Qe),n[Go>>2]=1,n[Fl>>2]=1,xc(oe,Lr,lr,Fr,Go,Ms),xc(oe,Ar,Un,Fr,Fl,rl),l=y(h[Ms>>2]),kr=y(h[rl>>2]),Kt=ri?l:kr,l=ri?kr:l,hi=((Ot(Kt)|0)^1)&1,Ka(oe,Kt,l,Is,hi,((Ot(l)|0)^1)&1,Fr,Ao,1,3493,M)|0,l=Oe}else $r=139;while(!1);e:do if(($r|0)==139){$r=0,l=y(Xe-y(VA(oe,Ar,Fr)));do if((n[(Ja(oe,Ar)|0)+4>>2]|0)==3){if((n[(za(oe,Ar)|0)+4>>2]|0)!=3)break;l=y(Oe+y(Yn(y(0),y(l*y(.5)))));break e}while(!1);if((n[(za(oe,Ar)|0)+4>>2]|0)==3){l=Oe;break}if((n[(Ja(oe,Ar)|0)+4>>2]|0)==3){l=y(Oe+y(Yn(y(0),l)));break}switch(O|0){case 1:{l=Oe;break e}case 2:{l=y(Oe+y(l*y(.5)));break e}default:{l=y(Oe+l);break e}}}while(!1);Kt=y(Cs+l),hi=oe+400+(n[Nu>>2]<<2)|0,h[hi>>2]=y(Kt+y(h[hi>>2]))}while(!1);j=j+1|0}while((j|0)!=(ur|0))}if(Cs=y(Cs+rt),Nc=y(Yn(Nc,c)),m=uo+1|0,ur>>>0>=Hs>>>0)break;l=lr,Or=ur,uo=m}do if(F){if(O=m>>>0>1,!O&&!(HF(s)|0))break;if(!(Ot(Un)|0)){l=y(Un-Cs);e:do switch(n[s+12>>2]|0){case 3:{Oe=y(Oe+l),_e=y(0);break}case 2:{Oe=y(Oe+y(l*y(.5))),_e=y(0);break}case 4:{Un>Cs?_e=y(l/y(m>>>0)):_e=y(0);break}case 7:if(Un>Cs){Oe=y(Oe+y(l/y(m<<1>>>0))),_e=y(l/y(m>>>0)),_e=O?_e:y(0);break e}else{Oe=y(Oe+y(l*y(.5))),_e=y(0);break e}case 6:{_e=y(l/y(uo>>>0)),_e=Un>Cs&O?_e:y(0);break}default:_e=y(0)}while(!1);if(m|0)for(Nt=1040+(Ar<<2)|0,_r=976+(Ar<<2)|0,We=0,j=0;;){e:do if(j>>>0>>0)for(Qe=y(0),rt=y(0),l=y(0),oe=j;;){O=n[(n[po>>2]|0)+(oe<<2)>>2]|0;do if((n[O+36>>2]|0)!=1&&!(n[O+24>>2]|0)){if((n[O+940>>2]|0)!=(We|0))break e;if(qF(O,Ar)|0&&(Kt=y(h[O+908+(n[_r>>2]<<2)>>2]),l=y(Yn(l,y(Kt+y(fn(O,Ar,Fr)))))),(Wi(s,O)|0)!=5)break;Us=y(m0(O)),Us=y(Us+y(K(O,0,Fr))),Kt=y(h[O+912>>2]),Kt=y(y(Kt+y(fn(O,0,Fr)))-Us),Us=y(Yn(rt,Us)),Kt=y(Yn(Qe,Kt)),Qe=Kt,rt=Us,l=y(Yn(l,y(Us+Kt)))}while(!1);if(O=oe+1|0,O>>>0>>0)oe=O;else{oe=O;break}}else rt=y(0),l=y(0),oe=j;while(!1);if(ct=y(_e+l),c=Oe,Oe=y(Oe+ct),j>>>0>>0){Xe=y(c+rt),O=j;do{j=n[(n[po>>2]|0)+(O<<2)>>2]|0;e:do if((n[j+36>>2]|0)!=1&&!(n[j+24>>2]|0))switch(Wi(s,j)|0){case 1:{Kt=y(c+y(K(j,Ar,Fr))),h[j+400+(n[Nt>>2]<<2)>>2]=Kt;break e}case 3:{Kt=y(y(Oe-y(re(j,Ar,Fr)))-y(h[j+908+(n[_r>>2]<<2)>>2])),h[j+400+(n[Nt>>2]<<2)>>2]=Kt;break e}case 2:{Kt=y(c+y(y(ct-y(h[j+908+(n[_r>>2]<<2)>>2]))*y(.5))),h[j+400+(n[Nt>>2]<<2)>>2]=Kt;break e}case 4:{if(Kt=y(c+y(K(j,Ar,Fr))),h[j+400+(n[Nt>>2]<<2)>>2]=Kt,Ns(j,Ar,Un)|0||(ri?(Qe=y(h[j+908>>2]),l=y(Qe+y(fn(j,Lr,Fr))),rt=ct):(rt=y(h[j+912>>2]),rt=y(rt+y(fn(j,Ar,Fr))),l=ct,Qe=y(h[j+908>>2])),An(l,Qe)|0&&An(rt,y(h[j+912>>2]))|0))break e;Ka(j,l,rt,Is,1,1,Fr,Ao,1,3501,M)|0;break e}case 5:{h[j+404>>2]=y(y(Xe-y(m0(j)))+y(YA(j,0,Un)));break e}default:break e}while(!1);O=O+1|0}while((O|0)!=(oe|0))}if(We=We+1|0,(We|0)==(m|0))break;j=oe}}}while(!1);if(h[s+908>>2]=y(Mn(s,2,Oc,B,B)),h[s+912>>2]=y(Mn(s,0,af,k,B)),Rl|0&&(lf=n[s+32>>2]|0,cf=(Rl|0)==2,!(cf&(lf|0)!=2))?cf&(lf|0)==2&&(l=y(Mc+lr),l=y(Yn(y(M0(l,y(y0(s,Lr,Nc,fo)))),Mc)),$r=198):(l=y(Mn(s,Lr,Nc,fo,B)),$r=198),($r|0)==198&&(h[s+908+(n[976+(Lr<<2)>>2]<<2)>>2]=l),Tl|0&&(Af=n[s+32>>2]|0,ff=(Tl|0)==2,!(ff&(Af|0)!=2))?ff&(Af|0)==2&&(l=y(_s+Un),l=y(Yn(y(M0(l,y(y0(s,Ar,y(_s+Cs),Uc)))),_s)),$r=204):(l=y(Mn(s,Ar,y(_s+Cs),Uc,B)),$r=204),($r|0)==204&&(h[s+908+(n[976+(Ar<<2)>>2]<<2)>>2]=l),F){if((n[uf>>2]|0)==2){j=976+(Ar<<2)|0,oe=1040+(Ar<<2)|0,O=0;do We=rs(s,O)|0,n[We+24>>2]|0||(pf=n[j>>2]|0,Kt=y(h[s+908+(pf<<2)>>2]),hi=We+400+(n[oe>>2]<<2)|0,Kt=y(Kt-y(h[hi>>2])),h[hi>>2]=y(Kt-y(h[We+908+(pf<<2)>>2]))),O=O+1|0;while((O|0)!=(Hs|0))}if(f|0){O=ri?Rl:d;do jF(s,f,Fr,O,Ao,Is,M),f=n[f+960>>2]|0;while(f|0)}if(O=(Lr|2|0)==3,j=(Ar|2|0)==3,O|j){f=0;do oe=n[(n[po>>2]|0)+(f<<2)>>2]|0,(n[oe+36>>2]|0)!=1&&(O&&bI(s,oe,Lr),j&&bI(s,oe,Ar)),f=f+1|0;while((f|0)!=(Hs|0))}}}while(!1);C=Ll}function dp(s,l){s=s|0,l=y(l);var c=0;ua(s,l>=y(0),3147),c=l==y(0),h[s+4>>2]=c?y(0):l}function qA(s,l,c,f){s=s|0,l=y(l),c=y(c),f=f|0;var d=Ze,m=Ze,B=0,k=0,F=0;n[2278]=(n[2278]|0)+1,Pu(s),Ns(s,2,l)|0?(d=y(Vr(n[s+992>>2]|0,l)),F=1,d=y(d+y(fn(s,2,l)))):(d=y(Vr(s+380|0,l)),d>=y(0)?F=2:(F=((Ot(l)|0)^1)&1,d=l)),Ns(s,0,c)|0?(m=y(Vr(n[s+996>>2]|0,c)),k=1,m=y(m+y(fn(s,0,l)))):(m=y(Vr(s+388|0,c)),m>=y(0)?k=2:(k=((Ot(c)|0)^1)&1,m=c)),B=s+976|0,Ka(s,d,m,f,F,k,l,c,1,3189,n[B>>2]|0)|0&&(mp(s,n[s+496>>2]|0,l,c,l),jA(s,y(h[(n[B>>2]|0)+4>>2]),y(0),y(0)),o[11696]|0)&&h0(s,7)}function Pu(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;k=C,C=C+32|0,B=k+24|0,m=k+16|0,f=k+8|0,d=k,c=0;do l=s+380+(c<<3)|0,n[s+380+(c<<3)+4>>2]|0&&(F=l,M=n[F+4>>2]|0,O=f,n[O>>2]=n[F>>2],n[O+4>>2]=M,O=s+364+(c<<3)|0,M=n[O+4>>2]|0,F=d,n[F>>2]=n[O>>2],n[F+4>>2]=M,n[m>>2]=n[f>>2],n[m+4>>2]=n[f+4>>2],n[B>>2]=n[d>>2],n[B+4>>2]=n[d+4>>2],vu(m,B)|0)||(l=s+348+(c<<3)|0),n[s+992+(c<<2)>>2]=l,c=c+1|0;while((c|0)!=2);C=k}function Ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=0;switch(s=n[s+992+(n[976+(l<<2)>>2]<<2)>>2]|0,n[s+4>>2]|0){case 0:case 3:{s=0;break}case 1:{y(h[s>>2])>2])>2]|0){case 2:{l=y(y(y(h[s>>2])*l)/y(100));break}case 1:{l=y(h[s>>2]);break}default:l=y(ue)}return y(l)}function mp(s,l,c,f,d){s=s|0,l=l|0,c=y(c),f=y(f),d=y(d);var m=0,B=Ze;l=n[s+944>>2]|0?l:1,m=hr(n[s+4>>2]|0,l)|0,l=Fd(m,l)|0,c=y(uD(s,m,c)),f=y(uD(s,l,f)),B=y(c+y(K(s,m,d))),h[s+400+(n[1040+(m<<2)>>2]<<2)>>2]=B,c=y(c+y(re(s,m,d))),h[s+400+(n[1e3+(m<<2)>>2]<<2)>>2]=c,c=y(f+y(K(s,l,d))),h[s+400+(n[1040+(l<<2)>>2]<<2)>>2]=c,d=y(f+y(re(s,l,d))),h[s+400+(n[1e3+(l<<2)>>2]<<2)>>2]=d}function jA(s,l,c,f){s=s|0,l=y(l),c=y(c),f=y(f);var d=0,m=0,B=Ze,k=Ze,F=0,M=0,O=Ze,j=0,oe=Ze,We=Ze,Oe=Ze,Qe=Ze;if(l!=y(0)&&(d=s+400|0,Qe=y(h[d>>2]),m=s+404|0,Oe=y(h[m>>2]),j=s+416|0,We=y(h[j>>2]),M=s+420|0,B=y(h[M>>2]),oe=y(Qe+c),O=y(Oe+f),f=y(oe+We),k=y(O+B),F=(n[s+988>>2]|0)==1,h[d>>2]=y(Gi(Qe,l,0,F)),h[m>>2]=y(Gi(Oe,l,0,F)),c=y(lT(y(We*l),y(1))),An(c,y(0))|0?m=0:m=(An(c,y(1))|0)^1,c=y(lT(y(B*l),y(1))),An(c,y(0))|0?d=0:d=(An(c,y(1))|0)^1,Qe=y(Gi(f,l,F&m,F&(m^1))),h[j>>2]=y(Qe-y(Gi(oe,l,0,F))),Qe=y(Gi(k,l,F&d,F&(d^1))),h[M>>2]=y(Qe-y(Gi(O,l,0,F))),m=(n[s+952>>2]|0)-(n[s+948>>2]|0)>>2,m|0)){d=0;do jA(rs(s,d)|0,l,oe,O),d=d+1|0;while((d|0)!=(m|0))}}function kd(s,l,c,f,d){switch(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,c|0){case 5:case 0:{s=M7(n[489]|0,f,d)|0;break}default:s=HUe(f,d)|0}return s|0}function d0(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;d=C,C=C+16|0,m=d,n[m>>2]=f,yp(s,0,l,c,m),C=d}function yp(s,l,c,f,d){if(s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,s=s|0?s:956,sW[n[s+8>>2]&1](s,l,c,f,d)|0,(c|0)==5)Tt();else return}function xl(s,l,c){s=s|0,l=l|0,c=c|0,o[s+l>>0]=c&1}function Qd(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(Ep(s,f),bt(s,n[l>>2]|0,n[c>>2]|0,f))}function Ep(s,l){s=s|0,l=l|0;var c=0;if((L(s)|0)>>>0>>0&&Zr(s),l>>>0>1073741823)Tt();else{c=Yt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function bt(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(br(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function L(s){return s=s|0,1073741823}function K(s,l,c){return s=s|0,l=l|0,c=y(c),ge(l)|0&&n[s+96>>2]|0?s=s+92|0:s=vn(s+60|0,n[1040+(l<<2)>>2]|0,992)|0,y(Ye(s,c))}function re(s,l,c){return s=s|0,l=l|0,c=y(c),ge(l)|0&&n[s+104>>2]|0?s=s+100|0:s=vn(s+60|0,n[1e3+(l<<2)>>2]|0,992)|0,y(Ye(s,c))}function ge(s){return s=s|0,(s|1|0)==3|0}function Ye(s,l){return s=s|0,l=y(l),(n[s+4>>2]|0)==3?l=y(0):l=y(Vr(s,l)),y(l)}function At(s,l){return s=s|0,l=l|0,s=n[s>>2]|0,(s|0?s:(l|0)>1?l:1)|0}function hr(s,l){s=s|0,l=l|0;var c=0;e:do if((l|0)==2){switch(s|0){case 2:{s=3;break e}case 3:break;default:{c=4;break e}}s=2}else c=4;while(!1);return s|0}function Ir(s,l){s=s|0,l=l|0;var c=Ze;return ge(l)|0&&n[s+312>>2]|0&&(c=y(h[s+308>>2]),c>=y(0))||(c=y(Yn(y(h[(vn(s+276|0,n[1040+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function Rn(s,l){s=s|0,l=l|0;var c=Ze;return ge(l)|0&&n[s+320>>2]|0&&(c=y(h[s+316>>2]),c>=y(0))||(c=y(Yn(y(h[(vn(s+276|0,n[1e3+(l<<2)>>2]|0,992)|0)>>2]),y(0)))),y(c)}function ai(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return ge(l)|0&&n[s+240>>2]|0&&(f=y(Vr(s+236|0,c)),f>=y(0))||(f=y(Yn(y(Vr(vn(s+204|0,n[1040+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function ns(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return ge(l)|0&&n[s+248>>2]|0&&(f=y(Vr(s+244|0,c)),f>=y(0))||(f=y(Yn(y(Vr(vn(s+204|0,n[1e3+(l<<2)>>2]|0,992)|0,c)),y(0)))),y(f)}function GA(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,F=Ze,M=Ze,O=Ze,j=Ze,oe=Ze,We=0,Oe=0,Qe=0;Qe=C,C=C+16|0,We=Qe,Oe=s+964|0,pi(s,(n[Oe>>2]|0)!=0,3519),k=y(da(s,2,l)),F=y(da(s,0,l)),M=y(fn(s,2,l)),O=y(fn(s,0,l)),Ot(l)|0?j=l:j=y(Yn(y(0),y(y(l-M)-k))),Ot(c)|0?oe=c:oe=y(Yn(y(0),y(y(c-O)-F))),(f|0)==1&(d|0)==1?(h[s+908>>2]=y(Mn(s,2,y(l-M),m,m)),l=y(Mn(s,0,y(c-O),B,m))):(oW[n[Oe>>2]&1](We,s,j,f,oe,d),j=y(k+y(h[We>>2])),oe=y(l-M),h[s+908>>2]=y(Mn(s,2,(f|2|0)==2?j:oe,m,m)),oe=y(F+y(h[We+4>>2])),l=y(c-O),l=y(Mn(s,0,(d|2|0)==2?oe:l,B,m))),h[s+912>>2]=l,C=Qe}function lD(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=Ze,F=Ze,M=Ze,O=Ze;M=y(da(s,2,m)),k=y(da(s,0,m)),O=y(fn(s,2,m)),F=y(fn(s,0,m)),l=y(l-O),h[s+908>>2]=y(Mn(s,2,(f|2|0)==2?M:l,m,m)),c=y(c-F),h[s+912>>2]=y(Mn(s,0,(d|2|0)==2?k:c,B,m))}function SI(s,l,c,f,d,m,B){s=s|0,l=y(l),c=y(c),f=f|0,d=d|0,m=y(m),B=y(B);var k=0,F=Ze,M=Ze;return k=(f|0)==2,!(l<=y(0)&k)&&!(c<=y(0)&(d|0)==2)&&!((f|0)==1&(d|0)==1)?s=0:(F=y(fn(s,0,m)),M=y(fn(s,2,m)),k=l>2]=y(Mn(s,2,k?y(0):l,m,m)),l=y(c-F),k=c>2]=y(Mn(s,0,k?y(0):l,B,m)),s=1),s|0}function Fd(s,l){return s=s|0,l=l|0,E0(s)|0?s=hr(2,l)|0:s=0,s|0}function Cp(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(ai(s,l,c)),y(c+y(Ir(s,l)))}function PI(s,l,c){return s=s|0,l=l|0,c=y(c),c=y(ns(s,l,c)),y(c+y(Rn(s,l)))}function da(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(Cp(s,l,c)),y(f+y(PI(s,l,c)))}function xI(s){return s=s|0,n[s+24>>2]|0?s=0:y(WA(s))!=y(0)?s=1:s=y(Ip(s))!=y(0),s|0}function WA(s){s=s|0;var l=Ze;if(n[s+944>>2]|0){if(l=y(h[s+44>>2]),Ot(l)|0)return l=y(h[s+40>>2]),s=l>y(0)&((Ot(l)|0)^1),y(s?l:y(0))}else l=y(0);return y(l)}function Ip(s){s=s|0;var l=Ze,c=0,f=Ze;do if(n[s+944>>2]|0){if(l=y(h[s+48>>2]),Ot(l)|0){if(c=o[(n[s+976>>2]|0)+2>>0]|0,!(c<<24>>24)&&(f=y(h[s+40>>2]),f>24?y(1):y(0)}}else l=y(0);while(!1);return y(l)}function Rd(s){s=s|0;var l=0,c=0;if(sm(s+400|0,0,540)|0,o[s+985>>0]=1,ee(s),c=Di(s)|0,c|0){l=s+948|0,s=0;do Rd(n[(n[l>>2]|0)+(s<<2)>>2]|0),s=s+1|0;while((s|0)!=(c|0))}}function cD(s,l,c,f,d,m,B,k,F,M){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=y(m),B=y(B),k=k|0,F=F|0,M=M|0;var O=0,j=Ze,oe=0,We=0,Oe=Ze,Qe=Ze,rt=0,Xe=Ze,ct=0,_e=Ze,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=0,lo=0;Ln=C,C=C+16|0,_r=Ln+12|0,ur=Ln+8|0,Zt=Ln+4|0,kr=Ln,lr=hr(n[s+4>>2]|0,F)|0,Ge=ge(lr)|0,j=y(Vr(GF(l)|0,Ge?m:B)),Nt=Ns(l,2,m)|0,Or=Ns(l,0,B)|0;do if(!(Ot(j)|0)&&!(Ot(Ge?c:d)|0)){if(O=l+504|0,!(Ot(y(h[O>>2]))|0)&&(!(kI(n[l+976>>2]|0,0)|0)||(n[l+500>>2]|0)==(n[2278]|0)))break;h[O>>2]=y(Yn(j,y(da(l,lr,m))))}else oe=7;while(!1);do if((oe|0)==7){if(ct=Ge^1,!(ct|Nt^1)){B=y(Vr(n[l+992>>2]|0,m)),h[l+504>>2]=y(Yn(B,y(da(l,2,m))));break}if(!(Ge|Or^1)){B=y(Vr(n[l+996>>2]|0,B)),h[l+504>>2]=y(Yn(B,y(da(l,0,m))));break}h[_r>>2]=y(ue),h[ur>>2]=y(ue),n[Zt>>2]=0,n[kr>>2]=0,Xe=y(fn(l,2,m)),_e=y(fn(l,0,m)),Nt?(Oe=y(Xe+y(Vr(n[l+992>>2]|0,m))),h[_r>>2]=Oe,n[Zt>>2]=1,We=1):(We=0,Oe=y(ue)),Or?(j=y(_e+y(Vr(n[l+996>>2]|0,B))),h[ur>>2]=j,n[kr>>2]=1,O=1):(O=0,j=y(ue)),oe=n[s+32>>2]|0,Ge&(oe|0)==2?oe=2:Ot(Oe)|0&&!(Ot(c)|0)&&(h[_r>>2]=c,n[Zt>>2]=2,We=2,Oe=c),!((oe|0)==2&ct)&&Ot(j)|0&&!(Ot(d)|0)&&(h[ur>>2]=d,n[kr>>2]=2,O=2,j=d),Qe=y(h[l+396>>2]),rt=Ot(Qe)|0;do if(rt)oe=We;else{if((We|0)==1&ct){h[ur>>2]=y(y(Oe-Xe)/Qe),n[kr>>2]=1,O=1,oe=1;break}Ge&(O|0)==1?(h[_r>>2]=y(Qe*y(j-_e)),n[Zt>>2]=1,O=1,oe=1):oe=We}while(!1);lo=Ot(c)|0,We=(Wi(s,l)|0)!=4,!(Ge|Nt|((f|0)!=1|lo)|(We|(oe|0)==1))&&(h[_r>>2]=c,n[Zt>>2]=1,!rt)&&(h[ur>>2]=y(y(c-Xe)/Qe),n[kr>>2]=1,O=1),!(Or|ct|((k|0)!=1|(Ot(d)|0))|(We|(O|0)==1))&&(h[ur>>2]=d,n[kr>>2]=1,!rt)&&(h[_r>>2]=y(Qe*y(d-_e)),n[Zt>>2]=1),xc(l,2,m,m,Zt,_r),xc(l,0,B,m,kr,ur),c=y(h[_r>>2]),d=y(h[ur>>2]),Ka(l,c,d,F,n[Zt>>2]|0,n[kr>>2]|0,m,B,0,3565,M)|0,B=y(h[l+908+(n[976+(lr<<2)>>2]<<2)>>2]),h[l+504>>2]=y(Yn(B,y(da(l,lr,m))))}while(!1);n[l+500>>2]=n[2278],C=Ln}function Mn(s,l,c,f,d){return s=s|0,l=l|0,c=y(c),f=y(f),d=y(d),f=y(y0(s,l,c,f)),y(Yn(f,y(da(s,l,d))))}function Wi(s,l){return s=s|0,l=l|0,l=l+20|0,l=n[(n[l>>2]|0?l:s+16|0)>>2]|0,(l|0)==5&&E0(n[s+4>>2]|0)|0&&(l=1),l|0}function Ja(s,l){return s=s|0,l=l|0,ge(l)|0&&n[s+96>>2]|0?l=4:l=n[1040+(l<<2)>>2]|0,s+60+(l<<3)|0}function za(s,l){return s=s|0,l=l|0,ge(l)|0&&n[s+104>>2]|0?l=5:l=n[1e3+(l<<2)>>2]|0,s+60+(l<<3)|0}function xc(s,l,c,f,d,m){switch(s=s|0,l=l|0,c=y(c),f=y(f),d=d|0,m=m|0,c=y(Vr(s+380+(n[976+(l<<2)>>2]<<3)|0,c)),c=y(c+y(fn(s,l,f))),n[d>>2]|0){case 2:case 1:{d=Ot(c)|0,f=y(h[m>>2]),h[m>>2]=d|f>2]=2,h[m>>2]=c);break}default:}}function Ho(s,l){return s=s|0,l=l|0,s=s+132|0,ge(l)|0&&n[(vn(s,4,948)|0)+4>>2]|0?s=1:s=(n[(vn(s,n[1040+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function YA(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,ge(l)|0&&(f=vn(s,4,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=vn(s,n[1040+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Vr(f,c))),y(c)}function VA(s,l,c){s=s|0,l=l|0,c=y(c);var f=Ze;return f=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),f=y(f+y(K(s,l,c))),y(f+y(re(s,l,c)))}function HF(s){s=s|0;var l=0,c=0,f=0;e:do if(E0(n[s+4>>2]|0)|0)l=0;else if((n[s+16>>2]|0)!=5)if(c=Di(s)|0,!c)l=0;else for(l=0;;){if(f=rs(s,l)|0,!(n[f+24>>2]|0)&&(n[f+20>>2]|0)==5){l=1;break e}if(l=l+1|0,l>>>0>=c>>>0){l=0;break}}else l=1;while(!1);return l|0}function qF(s,l){s=s|0,l=l|0;var c=Ze;return c=y(h[s+908+(n[976+(l<<2)>>2]<<2)>>2]),c>=y(0)&((Ot(c)|0)^1)|0}function m0(s){s=s|0;var l=Ze,c=0,f=0,d=0,m=0,B=0,k=0,F=Ze;if(c=n[s+968>>2]|0,c)F=y(h[s+908>>2]),l=y(h[s+912>>2]),l=y(tW[c&0](s,F,l)),pi(s,(Ot(l)|0)^1,3573);else{m=Di(s)|0;do if(m|0){for(c=0,d=0;;){if(f=rs(s,d)|0,n[f+940>>2]|0){B=8;break}if((n[f+24>>2]|0)!=1)if(k=(Wi(s,f)|0)==5,k){c=f;break}else c=c|0?c:f;if(d=d+1|0,d>>>0>=m>>>0){B=8;break}}if((B|0)==8&&!c)break;return l=y(m0(c)),y(l+y(h[c+404>>2]))}while(!1);l=y(h[s+912>>2])}return y(l)}function y0(s,l,c,f){s=s|0,l=l|0,c=y(c),f=y(f);var d=Ze,m=0;return E0(l)|0?(l=1,m=3):ge(l)|0?(l=0,m=3):(f=y(ue),d=y(ue)),(m|0)==3&&(d=y(Vr(s+364+(l<<3)|0,f)),f=y(Vr(s+380+(l<<3)|0,f))),m=f=y(0)&((Ot(f)|0)^1)),c=m?f:c,m=d>=y(0)&((Ot(d)|0)^1)&c>2]|0,m)|0,Oe=Fd(rt,m)|0,Qe=ge(rt)|0,j=y(fn(l,2,c)),oe=y(fn(l,0,c)),Ns(l,2,c)|0?k=y(j+y(Vr(n[l+992>>2]|0,c))):Ho(l,2)|0&&Td(l,2)|0?(k=y(h[s+908>>2]),F=y(Ir(s,2)),F=y(k-y(F+y(Rn(s,2)))),k=y(YA(l,2,c)),k=y(Mn(l,2,y(F-y(k+y(wp(l,2,c)))),c,c))):k=y(ue),Ns(l,0,d)|0?F=y(oe+y(Vr(n[l+996>>2]|0,d))):Ho(l,0)|0&&Td(l,0)|0?(F=y(h[s+912>>2]),ct=y(Ir(s,0)),ct=y(F-y(ct+y(Rn(s,0)))),F=y(YA(l,0,d)),F=y(Mn(l,0,y(ct-y(F+y(wp(l,0,d)))),d,c))):F=y(ue),M=Ot(k)|0,O=Ot(F)|0;do if(M^O&&(We=y(h[l+396>>2]),!(Ot(We)|0)))if(M){k=y(j+y(y(F-oe)*We));break}else{ct=y(oe+y(y(k-j)/We)),F=O?ct:F;break}while(!1);O=Ot(k)|0,M=Ot(F)|0,O|M&&(_e=(O^1)&1,f=c>y(0)&((f|0)!=0&O),k=Qe?k:f?c:k,Ka(l,k,F,m,Qe?_e:f?2:_e,O&(M^1)&1,k,F,0,3623,B)|0,k=y(h[l+908>>2]),k=y(k+y(fn(l,2,c))),F=y(h[l+912>>2]),F=y(F+y(fn(l,0,c)))),Ka(l,k,F,m,1,1,k,F,1,3635,B)|0,Td(l,rt)|0&&!(Ho(l,rt)|0)?(_e=n[976+(rt<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),ct=y(ct-y(Rn(s,rt))),ct=y(ct-y(re(l,rt,c))),ct=y(ct-y(wp(l,rt,Qe?c:d))),h[l+400+(n[1040+(rt<<2)>>2]<<2)>>2]=ct):Xe=21;do if((Xe|0)==21){if(!(Ho(l,rt)|0)&&(n[s+8>>2]|0)==1){_e=n[976+(rt<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(y(ct-y(h[l+908+(_e<<2)>>2]))*y(.5)),h[l+400+(n[1040+(rt<<2)>>2]<<2)>>2]=ct;break}!(Ho(l,rt)|0)&&(n[s+8>>2]|0)==2&&(_e=n[976+(rt<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),h[l+400+(n[1040+(rt<<2)>>2]<<2)>>2]=ct)}while(!1);Td(l,Oe)|0&&!(Ho(l,Oe)|0)?(_e=n[976+(Oe<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),ct=y(ct-y(Rn(s,Oe))),ct=y(ct-y(re(l,Oe,c))),ct=y(ct-y(wp(l,Oe,Qe?d:c))),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=ct):Xe=30;do if((Xe|0)==30&&!(Ho(l,Oe)|0)){if((Wi(s,l)|0)==2){_e=n[976+(Oe<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(y(ct-y(h[l+908+(_e<<2)>>2]))*y(.5)),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=ct;break}_e=(Wi(s,l)|0)==3,_e^(n[s+28>>2]|0)==2&&(_e=n[976+(Oe<<2)>>2]|0,ct=y(h[s+908+(_e<<2)>>2]),ct=y(ct-y(h[l+908+(_e<<2)>>2])),h[l+400+(n[1040+(Oe<<2)>>2]<<2)>>2]=ct)}while(!1)}function bI(s,l,c){s=s|0,l=l|0,c=c|0;var f=Ze,d=0;d=n[976+(c<<2)>>2]|0,f=y(h[l+908+(d<<2)>>2]),f=y(y(h[s+908+(d<<2)>>2])-f),f=y(f-y(h[l+400+(n[1040+(c<<2)>>2]<<2)>>2])),h[l+400+(n[1e3+(c<<2)>>2]<<2)>>2]=f}function E0(s){return s=s|0,(s|1|0)==1|0}function GF(s){s=s|0;var l=Ze;switch(n[s+56>>2]|0){case 0:case 3:{l=y(h[s+40>>2]),l>y(0)&((Ot(l)|0)^1)?s=o[(n[s+976>>2]|0)+2>>0]|0?1056:992:s=1056;break}default:s=s+52|0}return s|0}function kI(s,l){return s=s|0,l=l|0,(o[s+l>>0]|0)!=0|0}function Td(s,l){return s=s|0,l=l|0,s=s+132|0,ge(l)|0&&n[(vn(s,5,948)|0)+4>>2]|0?s=1:s=(n[(vn(s,n[1e3+(l<<2)>>2]|0,948)|0)+4>>2]|0)!=0,s|0}function wp(s,l,c){s=s|0,l=l|0,c=y(c);var f=0,d=0;return s=s+132|0,ge(l)|0&&(f=vn(s,5,948)|0,(n[f+4>>2]|0)!=0)?d=4:(f=vn(s,n[1e3+(l<<2)>>2]|0,948)|0,n[f+4>>2]|0?d=4:c=y(0)),(d|0)==4&&(c=y(Vr(f,c))),y(c)}function uD(s,l,c){return s=s|0,l=l|0,c=y(c),Ho(s,l)|0?c=y(YA(s,l,c)):c=y(-y(wp(s,l,c))),y(c)}function AD(s){return s=y(s),h[D>>2]=s,n[D>>2]|0|0}function Ld(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Yt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function fD(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Nd(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&yt(s)}function pD(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;if(B=s+4|0,k=n[B>>2]|0,d=k-f|0,m=d>>2,s=l+(m<<2)|0,s>>>0>>0){f=k;do n[f>>2]=n[s>>2],s=s+4|0,f=(n[B>>2]|0)+4|0,n[B>>2]=f;while(s>>>0>>0)}m|0&&rw(k+(0-m<<2)|0,l|0,d|0)|0}function hD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0;return k=l+4|0,F=n[k>>2]|0,d=n[s>>2]|0,B=c,m=B-d|0,f=F+(0-(m>>2)<<2)|0,n[k>>2]=f,(m|0)>0&&br(f|0,d|0,m|0)|0,d=s+4|0,m=l+8|0,f=(n[d>>2]|0)-B|0,(f|0)>0&&(br(n[m>>2]|0,c|0,f|0)|0,n[m>>2]=(n[m>>2]|0)+(f>>>2<<2)),B=n[s>>2]|0,n[s>>2]=n[k>>2],n[k>>2]=B,B=n[d>>2]|0,n[d>>2]=n[m>>2],n[m>>2]=B,B=s+8|0,c=l+12|0,s=n[B>>2]|0,n[B>>2]=n[c>>2],n[c>>2]=s,n[l>>2]=n[k>>2],F|0}function QI(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(B=n[l>>2]|0,m=n[c>>2]|0,(B|0)!=(m|0)){d=s+8|0,c=((m+-4-B|0)>>>2)+1|0,s=B,f=n[d>>2]|0;do n[f>>2]=n[s>>2],f=(n[d>>2]|0)+4|0,n[d>>2]=f,s=s+4|0;while((s|0)!=(m|0));n[l>>2]=B+(c<<2)}}function FI(){Oo()}function gD(){var s=0;return s=Yt(4)|0,RI(s),s|0}function RI(s){s=s|0,n[s>>2]=Pl()|0}function dD(s){s=s|0,s|0&&(C0(s),yt(s))}function C0(s){s=s|0,st(n[s>>2]|0)}function WF(s,l,c){s=s|0,l=l|0,c=c|0,xl(n[s>>2]|0,l,c)}function Od(s,l){s=s|0,l=y(l),dp(n[s>>2]|0,l)}function Md(s,l){return s=s|0,l=l|0,kI(n[s>>2]|0,l)|0}function Ud(){var s=0;return s=Yt(8)|0,I0(s,0),s|0}function I0(s,l){s=s|0,l=l|0,l?l=Mo(n[l>>2]|0)|0:l=qi()|0,n[s>>2]=l,n[s+4>>2]=0,Sn(l,s)}function _d(s){s=s|0;var l=0;return l=Yt(8)|0,I0(l,s),l|0}function w0(s){s=s|0,s|0&&(Hd(s),yt(s))}function Hd(s){s=s|0;var l=0;Dl(n[s>>2]|0),l=s+4|0,s=n[l>>2]|0,n[l>>2]=0,s|0&&(xu(s),yt(s))}function xu(s){s=s|0,bu(s)}function bu(s){s=s|0,s=n[s>>2]|0,s|0&&sa(s|0)}function TI(s){return s=s|0,fa(s)|0}function LI(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(xu(l),yt(l)),Sl(n[s>>2]|0)}function qd(s,l){s=s|0,l=l|0,sn(n[s>>2]|0,n[l>>2]|0)}function YF(s,l){s=s|0,l=l|0,fp(n[s>>2]|0,l)}function VF(s,l,c){s=s|0,l=l|0,c=+c,Sd(n[s>>2]|0,l,y(c))}function jd(s,l,c){s=s|0,l=l|0,c=+c,Pd(n[s>>2]|0,l,y(c))}function NI(s,l){s=s|0,l=l|0,cp(n[s>>2]|0,l)}function OI(s,l){s=s|0,l=l|0,to(n[s>>2]|0,l)}function Pr(s,l){s=s|0,l=l|0,Ap(n[s>>2]|0,l)}function Os(s,l){s=s|0,l=l|0,wd(n[s>>2]|0,l)}function Oi(s,l){s=s|0,l=l|0,o0(n[s>>2]|0,l)}function ms(s,l){s=s|0,l=l|0,eo(n[s>>2]|0,l)}function KA(s,l,c){s=s|0,l=l|0,c=+c,OA(n[s>>2]|0,l,y(c))}function MI(s,l,c){s=s|0,l=l|0,c=+c,W(n[s>>2]|0,l,y(c))}function is(s,l){s=s|0,l=l|0,MA(n[s>>2]|0,l)}function Gd(s,l){s=s|0,l=l|0,vd(n[s>>2]|0,l)}function Bp(s,l){s=s|0,l=l|0,ro(n[s>>2]|0,l)}function B0(s,l){s=s|0,l=+l,pp(n[s>>2]|0,y(l))}function vp(s,l){s=s|0,l=+l,Ya(n[s>>2]|0,y(l))}function UI(s,l){s=s|0,l=+l,Dd(n[s>>2]|0,y(l))}function _I(s,l){s=s|0,l=+l,l0(n[s>>2]|0,y(l))}function HI(s,l){s=s|0,l=+l,Wa(n[s>>2]|0,y(l))}function qI(s,l){s=s|0,l=+l,c0(n[s>>2]|0,y(l))}function ku(s,l){s=s|0,l=+l,DI(n[s>>2]|0,y(l))}function ir(s){s=s|0,hp(n[s>>2]|0)}function Wd(s,l){s=s|0,l=+l,Ni(n[s>>2]|0,y(l))}function jI(s,l){s=s|0,l=+l,Iu(n[s>>2]|0,y(l))}function bl(s){s=s|0,pa(n[s>>2]|0)}function Qu(s,l){s=s|0,l=+l,Bc(n[s>>2]|0,y(l))}function v0(s,l){s=s|0,l=+l,wu(n[s>>2]|0,y(l))}function D0(s,l){s=s|0,l=+l,oi(n[s>>2]|0,y(l))}function GI(s,l){s=s|0,l=+l,UA(n[s>>2]|0,y(l))}function WI(s,l){s=s|0,l=+l,Uo(n[s>>2]|0,y(l))}function bc(s,l){s=s|0,l=+l,ga(n[s>>2]|0,y(l))}function S0(s,l){s=s|0,l=+l,gp(n[s>>2]|0,y(l))}function YI(s,l){s=s|0,l=+l,f0(n[s>>2]|0,y(l))}function Yd(s,l){s=s|0,l=+l,_A(n[s>>2]|0,y(l))}function kc(s,l,c){s=s|0,l=l|0,c=+c,wc(n[s>>2]|0,l,y(c))}function Vd(s,l,c){s=s|0,l=l|0,c=+c,no(n[s>>2]|0,l,y(c))}function P0(s,l,c){s=s|0,l=l|0,c=+c,Cu(n[s>>2]|0,l,y(c))}function x0(s){return s=s|0,s0(n[s>>2]|0)|0}function oo(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,NA(d,n[l>>2]|0,c),ss(s,d),C=f}function ss(s,l){s=s|0,l=l|0,Xa(s,n[l+4>>2]|0,+y(h[l>>2]))}function Xa(s,l,c){s=s|0,l=l|0,c=+c,n[s>>2]=l,E[s+8>>3]=c}function Kd(s){return s=s|0,vI(n[s>>2]|0)|0}function qo(s){return s=s|0,up(n[s>>2]|0)|0}function mD(s){return s=s|0,Ic(n[s>>2]|0)|0}function Dp(s){return s=s|0,BI(n[s>>2]|0)|0}function VI(s){return s=s|0,a0(n[s>>2]|0)|0}function KF(s){return s=s|0,Bd(n[s>>2]|0)|0}function yD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,xt(d,n[l>>2]|0,c),ss(s,d),C=f}function ED(s){return s=s|0,Eu(n[s>>2]|0)|0}function Jd(s){return s=s|0,Ga(n[s>>2]|0)|0}function KI(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,LA(f,n[l>>2]|0),ss(s,f),C=c}function Sp(s){return s=s|0,+ +y(ei(n[s>>2]|0))}function CD(s){return s=s|0,+ +y(Qi(n[s>>2]|0))}function ID(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,cr(f,n[l>>2]|0),ss(s,f),C=c}function b0(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,u0(f,n[l>>2]|0),ss(s,f),C=c}function JF(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,wt(f,n[l>>2]|0),ss(s,f),C=c}function zF(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,ha(f,n[l>>2]|0),ss(s,f),C=c}function wD(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,A0(f,n[l>>2]|0),ss(s,f),C=c}function BD(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,bd(f,n[l>>2]|0),ss(s,f),C=c}function JA(s){return s=s|0,+ +y(p0(n[s>>2]|0))}function XF(s,l){return s=s|0,l=l|0,+ +y(xd(n[s>>2]|0,l))}function ZF(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,dt(d,n[l>>2]|0,c),ss(s,d),C=f}function Qc(s,l,c){s=s|0,l=l|0,c=c|0,ar(n[s>>2]|0,n[l>>2]|0,c)}function $F(s,l){s=s|0,l=l|0,yu(n[s>>2]|0,n[l>>2]|0)}function vD(s){return s=s|0,Di(n[s>>2]|0)|0}function eR(s){return s=s|0,s=mt(n[s>>2]|0)|0,s?s=TI(s)|0:s=0,s|0}function DD(s,l){return s=s|0,l=l|0,s=rs(n[s>>2]|0,l)|0,s?s=TI(s)|0:s=0,s|0}function Fu(s,l){s=s|0,l=l|0;var c=0,f=0;f=Yt(4)|0,SD(f,l),c=s+4|0,l=n[c>>2]|0,n[c>>2]=f,l|0&&(xu(l),yt(l)),vt(n[s>>2]|0,1)}function SD(s,l){s=s|0,l=l|0,iR(s,l)}function tR(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,PD(k,fa(l)|0,+c,f,+d,m),h[s>>2]=y(+E[k>>3]),h[s+4>>2]=y(+E[k+8>>3]),C=B}function PD(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0,k=0,F=0,M=0,O=0;B=C,C=C+32|0,O=B+8|0,M=B+20|0,F=B,k=B+16|0,E[O>>3]=c,n[M>>2]=f,E[F>>3]=d,n[k>>2]=m,zd(s,n[l+4>>2]|0,O,M,F,k),C=B}function zd(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0;B=C,C=C+16|0,k=B,$a(k),l=ys(l)|0,xD(s,l,+E[c>>3],n[f>>2]|0,+E[d>>3],n[m>>2]|0),el(k),C=B}function ys(s){return s=s|0,n[s>>2]|0}function xD(s,l,c,f,d,m){s=s|0,l=l|0,c=+c,f=f|0,d=+d,m=m|0;var B=0;B=jo(JI()|0)|0,c=+ma(c),f=Xd(f)|0,d=+ma(d),rR(s,qn(0,B|0,l|0,+c,f|0,+d,Xd(m)|0)|0)}function JI(){var s=0;return o[7608]|0||(XI(9120),s=7608,n[s>>2]=1,n[s+4>>2]=0),9120}function jo(s){return s=s|0,n[s+8>>2]|0}function ma(s){return s=+s,+ +Ru(s)}function Xd(s){return s=s|0,k0(s)|0}function rR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=l,f&1?(ya(c,0),ia(f|0,c|0)|0,zI(s,c),nR(c)):(n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]),C=d}function ya(s,l){s=s|0,l=l|0,Fc(s,l),n[s+8>>2]=0,o[s+24>>0]=0}function zI(s,l){s=s|0,l=l|0,l=l+8|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2]}function nR(s){s=s|0,o[s+24>>0]=0}function Fc(s,l){s=s|0,l=l|0,n[s>>2]=l}function k0(s){return s=s|0,s|0}function Ru(s){return s=+s,+s}function XI(s){s=s|0,ao(s,ZI()|0,4)}function ZI(){return 1064}function ao(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=ki(l|0,c+1|0)|0}function iR(s,l){s=s|0,l=l|0,l=n[l>>2]|0,n[s>>2]=l,hc(l|0)}function bD(s){s=s|0;var l=0,c=0;c=s+4|0,l=n[c>>2]|0,n[c>>2]=0,l|0&&(xu(l),yt(l)),vt(n[s>>2]|0,0)}function kD(s){s=s|0,Dt(n[s>>2]|0)}function Zd(s){return s=s|0,er(n[s>>2]|0)|0}function sR(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,qA(n[s>>2]|0,y(l),y(c),f)}function oR(s){return s=s|0,+ +y(vc(n[s>>2]|0))}function v(s){return s=s|0,+ +y(Bu(n[s>>2]|0))}function S(s){return s=s|0,+ +y(Dc(n[s>>2]|0))}function Q(s){return s=s|0,+ +y(gs(n[s>>2]|0))}function H(s){return s=s|0,+ +y(Sc(n[s>>2]|0))}function Y(s){return s=s|0,+ +y(On(n[s>>2]|0))}function ne(s,l){s=s|0,l=l|0,E[s>>3]=+y(vc(n[l>>2]|0)),E[s+8>>3]=+y(Bu(n[l>>2]|0)),E[s+16>>3]=+y(Dc(n[l>>2]|0)),E[s+24>>3]=+y(gs(n[l>>2]|0)),E[s+32>>3]=+y(Sc(n[l>>2]|0)),E[s+40>>3]=+y(On(n[l>>2]|0))}function Be(s,l){return s=s|0,l=l|0,+ +y(ji(n[s>>2]|0,l))}function Ue(s,l){return s=s|0,l=l|0,+ +y(Ci(n[s>>2]|0,l))}function ft(s,l){return s=s|0,l=l|0,+ +y(HA(n[s>>2]|0,l))}function jt(){return Dn()|0}function wr(){Tr(),Xt(),jn(),li(),Ea(),$e()}function Tr(){PLe(11713,4938,1)}function Xt(){YTe(10448)}function jn(){PTe(10408)}function li(){zRe(10324)}function Ea(){iFe(10096)}function $e(){je(9132)}function je(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=0,lo=0,co=0,uo=0,Ia=0,Lp=0,Np=0,kl=0,Op=0,Nu=0,Ou=0,Mp=0,Up=0,_p=0,$r=0,Ql=0,Hp=0,Lc=0,qp=0,jp=0,Mu=0,Uu=0,Nc=0,Ms=0,rl=0,Go=0,Fl=0,rf=0,nf=0,_u=0,sf=0,of=0,Us=0,Cs=0,Rl=0,Un=0,af=0,Ao=0,Oc=0,fo=0,Mc=0,lf=0,cf=0,Uc=0,_s=0,Tl=0,uf=0,Af=0,ff=0,Fr=0,ri=0,Is=0,po=0,Hs=0,Lr=0,Ar=0,Ll=0;l=C,C=C+672|0,c=l+656|0,Ll=l+648|0,Ar=l+640|0,Lr=l+632|0,Hs=l+624|0,po=l+616|0,Is=l+608|0,ri=l+600|0,Fr=l+592|0,ff=l+584|0,Af=l+576|0,uf=l+568|0,Tl=l+560|0,_s=l+552|0,Uc=l+544|0,cf=l+536|0,lf=l+528|0,Mc=l+520|0,fo=l+512|0,Oc=l+504|0,Ao=l+496|0,af=l+488|0,Un=l+480|0,Rl=l+472|0,Cs=l+464|0,Us=l+456|0,of=l+448|0,sf=l+440|0,_u=l+432|0,nf=l+424|0,rf=l+416|0,Fl=l+408|0,Go=l+400|0,rl=l+392|0,Ms=l+384|0,Nc=l+376|0,Uu=l+368|0,Mu=l+360|0,jp=l+352|0,qp=l+344|0,Lc=l+336|0,Hp=l+328|0,Ql=l+320|0,$r=l+312|0,_p=l+304|0,Up=l+296|0,Mp=l+288|0,Ou=l+280|0,Nu=l+272|0,Op=l+264|0,kl=l+256|0,Np=l+248|0,Lp=l+240|0,Ia=l+232|0,uo=l+224|0,co=l+216|0,lo=l+208|0,Ln=l+200|0,lr=l+192|0,Or=l+184|0,kr=l+176|0,Zt=l+168|0,ur=l+160|0,_r=l+152|0,Nt=l+144|0,Ge=l+136|0,_e=l+128|0,ct=l+120|0,Xe=l+112|0,rt=l+104|0,Qe=l+96|0,Oe=l+88|0,We=l+80|0,oe=l+72|0,j=l+64|0,O=l+56|0,M=l+48|0,F=l+40|0,k=l+32|0,B=l+24|0,m=l+16|0,d=l+8|0,f=l,pt(s,3646),zt(s,3651,2)|0,Br(s,3665,2)|0,Wn(s,3682,18)|0,n[Ll>>2]=19,n[Ll+4>>2]=0,n[c>>2]=n[Ll>>2],n[c+4>>2]=n[Ll+4>>2],xr(s,3690,c)|0,n[Ar>>2]=1,n[Ar+4>>2]=0,n[c>>2]=n[Ar>>2],n[c+4>>2]=n[Ar+4>>2],Pn(s,3696,c)|0,n[Lr>>2]=2,n[Lr+4>>2]=0,n[c>>2]=n[Lr>>2],n[c+4>>2]=n[Lr+4>>2],Tn(s,3706,c)|0,n[Hs>>2]=1,n[Hs+4>>2]=0,n[c>>2]=n[Hs>>2],n[c+4>>2]=n[Hs+4>>2],Yr(s,3722,c)|0,n[po>>2]=2,n[po+4>>2]=0,n[c>>2]=n[po>>2],n[c+4>>2]=n[po+4>>2],Yr(s,3734,c)|0,n[Is>>2]=3,n[Is+4>>2]=0,n[c>>2]=n[Is>>2],n[c+4>>2]=n[Is+4>>2],Tn(s,3753,c)|0,n[ri>>2]=4,n[ri+4>>2]=0,n[c>>2]=n[ri>>2],n[c+4>>2]=n[ri+4>>2],Tn(s,3769,c)|0,n[Fr>>2]=5,n[Fr+4>>2]=0,n[c>>2]=n[Fr>>2],n[c+4>>2]=n[Fr+4>>2],Tn(s,3783,c)|0,n[ff>>2]=6,n[ff+4>>2]=0,n[c>>2]=n[ff>>2],n[c+4>>2]=n[ff+4>>2],Tn(s,3796,c)|0,n[Af>>2]=7,n[Af+4>>2]=0,n[c>>2]=n[Af>>2],n[c+4>>2]=n[Af+4>>2],Tn(s,3813,c)|0,n[uf>>2]=8,n[uf+4>>2]=0,n[c>>2]=n[uf>>2],n[c+4>>2]=n[uf+4>>2],Tn(s,3825,c)|0,n[Tl>>2]=3,n[Tl+4>>2]=0,n[c>>2]=n[Tl>>2],n[c+4>>2]=n[Tl+4>>2],Yr(s,3843,c)|0,n[_s>>2]=4,n[_s+4>>2]=0,n[c>>2]=n[_s>>2],n[c+4>>2]=n[_s+4>>2],Yr(s,3853,c)|0,n[Uc>>2]=9,n[Uc+4>>2]=0,n[c>>2]=n[Uc>>2],n[c+4>>2]=n[Uc+4>>2],Tn(s,3870,c)|0,n[cf>>2]=10,n[cf+4>>2]=0,n[c>>2]=n[cf>>2],n[c+4>>2]=n[cf+4>>2],Tn(s,3884,c)|0,n[lf>>2]=11,n[lf+4>>2]=0,n[c>>2]=n[lf>>2],n[c+4>>2]=n[lf+4>>2],Tn(s,3896,c)|0,n[Mc>>2]=1,n[Mc+4>>2]=0,n[c>>2]=n[Mc>>2],n[c+4>>2]=n[Mc+4>>2],ti(s,3907,c)|0,n[fo>>2]=2,n[fo+4>>2]=0,n[c>>2]=n[fo>>2],n[c+4>>2]=n[fo+4>>2],ti(s,3915,c)|0,n[Oc>>2]=3,n[Oc+4>>2]=0,n[c>>2]=n[Oc>>2],n[c+4>>2]=n[Oc+4>>2],ti(s,3928,c)|0,n[Ao>>2]=4,n[Ao+4>>2]=0,n[c>>2]=n[Ao>>2],n[c+4>>2]=n[Ao+4>>2],ti(s,3948,c)|0,n[af>>2]=5,n[af+4>>2]=0,n[c>>2]=n[af>>2],n[c+4>>2]=n[af+4>>2],ti(s,3960,c)|0,n[Un>>2]=6,n[Un+4>>2]=0,n[c>>2]=n[Un>>2],n[c+4>>2]=n[Un+4>>2],ti(s,3974,c)|0,n[Rl>>2]=7,n[Rl+4>>2]=0,n[c>>2]=n[Rl>>2],n[c+4>>2]=n[Rl+4>>2],ti(s,3983,c)|0,n[Cs>>2]=20,n[Cs+4>>2]=0,n[c>>2]=n[Cs>>2],n[c+4>>2]=n[Cs+4>>2],xr(s,3999,c)|0,n[Us>>2]=8,n[Us+4>>2]=0,n[c>>2]=n[Us>>2],n[c+4>>2]=n[Us+4>>2],ti(s,4012,c)|0,n[of>>2]=9,n[of+4>>2]=0,n[c>>2]=n[of>>2],n[c+4>>2]=n[of+4>>2],ti(s,4022,c)|0,n[sf>>2]=21,n[sf+4>>2]=0,n[c>>2]=n[sf>>2],n[c+4>>2]=n[sf+4>>2],xr(s,4039,c)|0,n[_u>>2]=10,n[_u+4>>2]=0,n[c>>2]=n[_u>>2],n[c+4>>2]=n[_u+4>>2],ti(s,4053,c)|0,n[nf>>2]=11,n[nf+4>>2]=0,n[c>>2]=n[nf>>2],n[c+4>>2]=n[nf+4>>2],ti(s,4065,c)|0,n[rf>>2]=12,n[rf+4>>2]=0,n[c>>2]=n[rf>>2],n[c+4>>2]=n[rf+4>>2],ti(s,4084,c)|0,n[Fl>>2]=13,n[Fl+4>>2]=0,n[c>>2]=n[Fl>>2],n[c+4>>2]=n[Fl+4>>2],ti(s,4097,c)|0,n[Go>>2]=14,n[Go+4>>2]=0,n[c>>2]=n[Go>>2],n[c+4>>2]=n[Go+4>>2],ti(s,4117,c)|0,n[rl>>2]=15,n[rl+4>>2]=0,n[c>>2]=n[rl>>2],n[c+4>>2]=n[rl+4>>2],ti(s,4129,c)|0,n[Ms>>2]=16,n[Ms+4>>2]=0,n[c>>2]=n[Ms>>2],n[c+4>>2]=n[Ms+4>>2],ti(s,4148,c)|0,n[Nc>>2]=17,n[Nc+4>>2]=0,n[c>>2]=n[Nc>>2],n[c+4>>2]=n[Nc+4>>2],ti(s,4161,c)|0,n[Uu>>2]=18,n[Uu+4>>2]=0,n[c>>2]=n[Uu>>2],n[c+4>>2]=n[Uu+4>>2],ti(s,4181,c)|0,n[Mu>>2]=5,n[Mu+4>>2]=0,n[c>>2]=n[Mu>>2],n[c+4>>2]=n[Mu+4>>2],Yr(s,4196,c)|0,n[jp>>2]=6,n[jp+4>>2]=0,n[c>>2]=n[jp>>2],n[c+4>>2]=n[jp+4>>2],Yr(s,4206,c)|0,n[qp>>2]=7,n[qp+4>>2]=0,n[c>>2]=n[qp>>2],n[c+4>>2]=n[qp+4>>2],Yr(s,4217,c)|0,n[Lc>>2]=3,n[Lc+4>>2]=0,n[c>>2]=n[Lc>>2],n[c+4>>2]=n[Lc+4>>2],Rc(s,4235,c)|0,n[Hp>>2]=1,n[Hp+4>>2]=0,n[c>>2]=n[Hp>>2],n[c+4>>2]=n[Hp+4>>2],aR(s,4251,c)|0,n[Ql>>2]=4,n[Ql+4>>2]=0,n[c>>2]=n[Ql>>2],n[c+4>>2]=n[Ql+4>>2],Rc(s,4263,c)|0,n[$r>>2]=5,n[$r+4>>2]=0,n[c>>2]=n[$r>>2],n[c+4>>2]=n[$r+4>>2],Rc(s,4279,c)|0,n[_p>>2]=6,n[_p+4>>2]=0,n[c>>2]=n[_p>>2],n[c+4>>2]=n[_p+4>>2],Rc(s,4293,c)|0,n[Up>>2]=7,n[Up+4>>2]=0,n[c>>2]=n[Up>>2],n[c+4>>2]=n[Up+4>>2],Rc(s,4306,c)|0,n[Mp>>2]=8,n[Mp+4>>2]=0,n[c>>2]=n[Mp>>2],n[c+4>>2]=n[Mp+4>>2],Rc(s,4323,c)|0,n[Ou>>2]=9,n[Ou+4>>2]=0,n[c>>2]=n[Ou>>2],n[c+4>>2]=n[Ou+4>>2],Rc(s,4335,c)|0,n[Nu>>2]=2,n[Nu+4>>2]=0,n[c>>2]=n[Nu>>2],n[c+4>>2]=n[Nu+4>>2],aR(s,4353,c)|0,n[Op>>2]=12,n[Op+4>>2]=0,n[c>>2]=n[Op>>2],n[c+4>>2]=n[Op+4>>2],Q0(s,4363,c)|0,n[kl>>2]=1,n[kl+4>>2]=0,n[c>>2]=n[kl>>2],n[c+4>>2]=n[kl+4>>2],zA(s,4376,c)|0,n[Np>>2]=2,n[Np+4>>2]=0,n[c>>2]=n[Np>>2],n[c+4>>2]=n[Np+4>>2],zA(s,4388,c)|0,n[Lp>>2]=13,n[Lp+4>>2]=0,n[c>>2]=n[Lp>>2],n[c+4>>2]=n[Lp+4>>2],Q0(s,4402,c)|0,n[Ia>>2]=14,n[Ia+4>>2]=0,n[c>>2]=n[Ia>>2],n[c+4>>2]=n[Ia+4>>2],Q0(s,4411,c)|0,n[uo>>2]=15,n[uo+4>>2]=0,n[c>>2]=n[uo>>2],n[c+4>>2]=n[uo+4>>2],Q0(s,4421,c)|0,n[co>>2]=16,n[co+4>>2]=0,n[c>>2]=n[co>>2],n[c+4>>2]=n[co+4>>2],Q0(s,4433,c)|0,n[lo>>2]=17,n[lo+4>>2]=0,n[c>>2]=n[lo>>2],n[c+4>>2]=n[lo+4>>2],Q0(s,4446,c)|0,n[Ln>>2]=18,n[Ln+4>>2]=0,n[c>>2]=n[Ln>>2],n[c+4>>2]=n[Ln+4>>2],Q0(s,4458,c)|0,n[lr>>2]=3,n[lr+4>>2]=0,n[c>>2]=n[lr>>2],n[c+4>>2]=n[lr+4>>2],zA(s,4471,c)|0,n[Or>>2]=1,n[Or+4>>2]=0,n[c>>2]=n[Or>>2],n[c+4>>2]=n[Or+4>>2],QD(s,4486,c)|0,n[kr>>2]=10,n[kr+4>>2]=0,n[c>>2]=n[kr>>2],n[c+4>>2]=n[kr+4>>2],Rc(s,4496,c)|0,n[Zt>>2]=11,n[Zt+4>>2]=0,n[c>>2]=n[Zt>>2],n[c+4>>2]=n[Zt+4>>2],Rc(s,4508,c)|0,n[ur>>2]=3,n[ur+4>>2]=0,n[c>>2]=n[ur>>2],n[c+4>>2]=n[ur+4>>2],aR(s,4519,c)|0,n[_r>>2]=4,n[_r+4>>2]=0,n[c>>2]=n[_r>>2],n[c+4>>2]=n[_r+4>>2],Lve(s,4530,c)|0,n[Nt>>2]=19,n[Nt+4>>2]=0,n[c>>2]=n[Nt>>2],n[c+4>>2]=n[Nt+4>>2],Nve(s,4542,c)|0,n[Ge>>2]=12,n[Ge+4>>2]=0,n[c>>2]=n[Ge>>2],n[c+4>>2]=n[Ge+4>>2],Ove(s,4554,c)|0,n[_e>>2]=13,n[_e+4>>2]=0,n[c>>2]=n[_e>>2],n[c+4>>2]=n[_e+4>>2],Mve(s,4568,c)|0,n[ct>>2]=2,n[ct+4>>2]=0,n[c>>2]=n[ct>>2],n[c+4>>2]=n[ct+4>>2],Uve(s,4578,c)|0,n[Xe>>2]=20,n[Xe+4>>2]=0,n[c>>2]=n[Xe>>2],n[c+4>>2]=n[Xe+4>>2],_ve(s,4587,c)|0,n[rt>>2]=22,n[rt+4>>2]=0,n[c>>2]=n[rt>>2],n[c+4>>2]=n[rt+4>>2],xr(s,4602,c)|0,n[Qe>>2]=23,n[Qe+4>>2]=0,n[c>>2]=n[Qe>>2],n[c+4>>2]=n[Qe+4>>2],xr(s,4619,c)|0,n[Oe>>2]=14,n[Oe+4>>2]=0,n[c>>2]=n[Oe>>2],n[c+4>>2]=n[Oe+4>>2],Hve(s,4629,c)|0,n[We>>2]=1,n[We+4>>2]=0,n[c>>2]=n[We>>2],n[c+4>>2]=n[We+4>>2],qve(s,4637,c)|0,n[oe>>2]=4,n[oe+4>>2]=0,n[c>>2]=n[oe>>2],n[c+4>>2]=n[oe+4>>2],zA(s,4653,c)|0,n[j>>2]=5,n[j+4>>2]=0,n[c>>2]=n[j>>2],n[c+4>>2]=n[j+4>>2],zA(s,4669,c)|0,n[O>>2]=6,n[O+4>>2]=0,n[c>>2]=n[O>>2],n[c+4>>2]=n[O+4>>2],zA(s,4686,c)|0,n[M>>2]=7,n[M+4>>2]=0,n[c>>2]=n[M>>2],n[c+4>>2]=n[M+4>>2],zA(s,4701,c)|0,n[F>>2]=8,n[F+4>>2]=0,n[c>>2]=n[F>>2],n[c+4>>2]=n[F+4>>2],zA(s,4719,c)|0,n[k>>2]=9,n[k+4>>2]=0,n[c>>2]=n[k>>2],n[c+4>>2]=n[k+4>>2],zA(s,4736,c)|0,n[B>>2]=21,n[B+4>>2]=0,n[c>>2]=n[B>>2],n[c+4>>2]=n[B+4>>2],jve(s,4754,c)|0,n[m>>2]=2,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],QD(s,4772,c)|0,n[d>>2]=3,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],QD(s,4790,c)|0,n[f>>2]=4,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],QD(s,4808,c)|0,C=l}function pt(s,l){s=s|0,l=l|0;var c=0;c=JQe()|0,n[s>>2]=c,zQe(c,l),Fp(n[s>>2]|0)}function zt(s,l,c){return s=s|0,l=l|0,c=c|0,LQe(s,mn(l)|0,c,0),s|0}function Br(s,l,c){return s=s|0,l=l|0,c=c|0,EQe(s,mn(l)|0,c,0),s|0}function Wn(s,l,c){return s=s|0,l=l|0,c=c|0,sQe(s,mn(l)|0,c,0),s|0}function xr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jke(s,l,d),C=f,s|0}function Pn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vke(s,l,d),C=f,s|0}function Tn(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lke(s,l,d),C=f,s|0}function Yr(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Ybe(s,l,d),C=f,s|0}function ti(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kbe(s,l,d),C=f,s|0}function Rc(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hbe(s,l,d),C=f,s|0}function aR(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Zxe(s,l,d),C=f,s|0}function Q0(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vxe(s,l,d),C=f,s|0}function zA(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],lxe(s,l,d),C=f,s|0}function QD(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YPe(s,l,d),C=f,s|0}function Lve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],kPe(s,l,d),C=f,s|0}function Nve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],hPe(s,l,d),C=f,s|0}function Ove(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$Se(s,l,d),C=f,s|0}function Mve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],MSe(s,l,d),C=f,s|0}function Uve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ISe(s,l,d),C=f,s|0}function _ve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],iSe(s,l,d),C=f,s|0}function Hve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qDe(s,l,d),C=f,s|0}function qve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],vDe(s,l,d),C=f,s|0}function jve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Gve(s,l,d),C=f,s|0}function Gve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Wve(s,c,d,1),C=f}function mn(s){return s=s|0,s|0}function Wve(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=lR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Yve(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Vve(m,f)|0,f),C=d}function lR(){var s=0,l=0;if(o[7616]|0||(L5(9136),pr(24,9136,U|0)|0,l=7616,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9136)|0)){s=9136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));L5(9136)}return 9136}function Yve(s){return s=s|0,0}function Vve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=lR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],T5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zve(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function yn(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0;B=C,C=C+32|0,oe=B+24|0,j=B+20|0,F=B+16|0,O=B+12|0,M=B+8|0,k=B+4|0,We=B,n[j>>2]=l,n[F>>2]=c,n[O>>2]=f,n[M>>2]=d,n[k>>2]=m,m=s+28|0,n[We>>2]=n[m>>2],n[oe>>2]=n[We>>2],Kve(s+24|0,oe,j,O,M,F,k)|0,n[m>>2]=n[n[m>>2]>>2],C=B}function Kve(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,s=Jve(l)|0,l=Yt(24)|0,R5(l+4|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0,n[B>>2]|0),n[l>>2]=n[s>>2],n[s>>2]=l,l|0}function Jve(s){return s=s|0,n[s>>2]|0}function R5(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function dr(s,l){return s=s|0,l=l|0,l|s|0}function T5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zve(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Xve(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Zve(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],T5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$ve(s,k),eDe(k),C=M;return}}function Xve(s){return s=s|0,357913941}function Zve(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $ve(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function L5(s){s=s|0,nDe(s)}function tDe(s){s=s|0,rDe(s+24|0)}function Nr(s){return s=s|0,n[s>>2]|0}function rDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nDe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,3,l,iDe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Jr(){return 9228}function iDe(){return 1140}function sDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=oDe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=aDe(l,f)|0,C=c,l|0}function zr(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,n[s>>2]=l,n[s+4>>2]=c,n[s+8>>2]=f,n[s+12>>2]=d,n[s+16>>2]=m}function oDe(s){return s=s|0,(n[(lR()|0)+24>>2]|0)+(s*12|0)|0}function aDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+48|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=lDe(f)|0,C=d,f|0}function lDe(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=cR(N5()|0)|0,f?(uR(l,f),AR(c,l),cDe(s,c),s=fR(l)|0):s=uDe(s)|0,C=d,s|0}function N5(){var s=0;return o[7632]|0||(CDe(9184),pr(25,9184,U|0)|0,s=7632,n[s>>2]=1,n[s+4>>2]=0),9184}function cR(s){return s=s|0,n[s+36>>2]|0}function uR(s,l){s=s|0,l=l|0,n[s>>2]=l,n[s+4>>2]=s,n[s+8>>2]=0}function AR(s,l){s=s|0,l=l|0,n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=0}function cDe(s,l){s=s|0,l=l|0,hDe(l,s,s+8|0,s+16|0,s+24|0,s+32|0,s+40|0)|0}function fR(s){return s=s|0,n[(n[s+4>>2]|0)+8>>2]|0}function uDe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0;F=C,C=C+16|0,c=F+4|0,f=F,d=Za(8)|0,m=d,B=Yt(48)|0,k=B,l=k+48|0;do n[k>>2]=n[s>>2],k=k+4|0,s=s+4|0;while((k|0)<(l|0));return l=m+4|0,n[l>>2]=B,k=Yt(8)|0,B=n[l>>2]|0,n[f>>2]=0,n[c>>2]=n[f>>2],O5(k,B,c),n[d>>2]=k,C=F,m|0}function O5(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1092,n[c+12>>2]=l,n[s+4>>2]=c}function ADe(s){s=s|0,im(s),yt(s)}function fDe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function pDe(s){s=s|0,yt(s)}function hDe(s,l,c,f,d,m,B){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,m=gDe(n[s>>2]|0,l,c,f,d,m,B)|0,B=s+4|0,n[(n[B>>2]|0)+8>>2]=m,n[(n[B>>2]|0)+8>>2]|0}function gDe(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0;var k=0,F=0;return k=C,C=C+16|0,F=k,$a(F),s=ys(s)|0,B=dDe(s,+E[l>>3],+E[c>>3],+E[f>>3],+E[d>>3],+E[m>>3],+E[B>>3])|0,el(F),C=k,B|0}function dDe(s,l,c,f,d,m,B){s=s|0,l=+l,c=+c,f=+f,d=+d,m=+m,B=+B;var k=0;return k=jo(mDe()|0)|0,l=+ma(l),c=+ma(c),f=+ma(f),d=+ma(d),m=+ma(m),Ts(0,k|0,s|0,+l,+c,+f,+d,+m,+ +ma(B))|0}function mDe(){var s=0;return o[7624]|0||(yDe(9172),s=7624,n[s>>2]=1,n[s+4>>2]=0),9172}function yDe(s){s=s|0,ao(s,EDe()|0,6)}function EDe(){return 1112}function CDe(s){s=s|0,Pp(s)}function IDe(s){s=s|0,M5(s+24|0),U5(s+16|0)}function M5(s){s=s|0,BDe(s)}function U5(s){s=s|0,wDe(s)}function wDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,yt(c);while(l|0);n[s>>2]=0}function BDe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,yt(c);while(l|0);n[s>>2]=0}function Pp(s){s=s|0;var l=0;n[s+16>>2]=0,n[s+20>>2]=0,l=s+24|0,n[l>>2]=0,n[s+28>>2]=l,n[s+36>>2]=0,o[s+40>>0]=0,o[s+41>>0]=0}function vDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],DDe(s,c,d,0),C=f}function DDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=pR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=SDe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,PDe(m,f)|0,f),C=d}function pR(){var s=0,l=0;if(o[7640]|0||(H5(9232),pr(26,9232,U|0)|0,l=7640,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9232)|0)){s=9232,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));H5(9232)}return 9232}function SDe(s){return s=s|0,0}function PDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=pR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(xDe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function _5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function xDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=bDe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,kDe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,QDe(s,k),FDe(k),C=M;return}}function bDe(s){return s=s|0,357913941}function kDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function QDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function FDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function H5(s){s=s|0,LDe(s)}function RDe(s){s=s|0,TDe(s+24|0)}function TDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function LDe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,NDe()|0,3),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function NDe(){return 1144}function ODe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,F=0;m=C,C=C+16|0,B=m+8|0,k=m,F=MDe(s)|0,s=n[F+4>>2]|0,n[k>>2]=n[F>>2],n[k+4>>2]=s,n[B>>2]=n[k>>2],n[B+4>>2]=n[k+4>>2],UDe(l,B,c,f,d),C=m}function MDe(s){return s=s|0,(n[(pR()|0)+24>>2]|0)+(s*12|0)|0}function UDe(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0;var m=0,B=0,k=0,F=0,M=0;M=C,C=C+16|0,B=M+2|0,k=M+1|0,F=M,m=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(m=n[(n[s>>2]|0)+m>>2]|0),Tu(B,c),c=+Lu(B,c),Tu(k,f),f=+Lu(k,f),XA(F,d),F=ZA(F,d)|0,rW[m&1](s,c,f,F),C=M}function Tu(s,l){s=s|0,l=+l}function Lu(s,l){return s=s|0,l=+l,+ +HDe(l)}function XA(s,l){s=s|0,l=l|0}function ZA(s,l){return s=s|0,l=l|0,_De(l)|0}function _De(s){return s=s|0,s|0}function HDe(s){return s=+s,+s}function qDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],jDe(s,c,d,1),C=f}function jDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=hR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=GDe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,WDe(m,f)|0,f),C=d}function hR(){var s=0,l=0;if(o[7648]|0||(j5(9268),pr(27,9268,U|0)|0,l=7648,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9268)|0)){s=9268,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j5(9268)}return 9268}function GDe(s){return s=s|0,0}function WDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=hR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],q5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(YDe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function q5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function YDe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=VDe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,KDe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],q5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,JDe(s,k),zDe(k),C=M;return}}function VDe(s){return s=s|0,357913941}function KDe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function JDe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function zDe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function j5(s){s=s|0,$De(s)}function XDe(s){s=s|0,ZDe(s+24|0)}function ZDe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function $De(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,4,l,eSe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function eSe(){return 1160}function tSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=rSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=nSe(l,f)|0,C=c,l|0}function rSe(s){return s=s|0,(n[(hR()|0)+24>>2]|0)+(s*12|0)|0}function nSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),G5(_0[c&31](s)|0)|0}function G5(s){return s=s|0,s&1|0}function iSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],sSe(s,c,d,0),C=f}function sSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=gR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=oSe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,aSe(m,f)|0,f),C=d}function gR(){var s=0,l=0;if(o[7656]|0||(Y5(9304),pr(28,9304,U|0)|0,l=7656,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9304)|0)){s=9304,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Y5(9304)}return 9304}function oSe(s){return s=s|0,0}function aSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=gR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],W5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(lSe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function W5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function lSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=cSe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,uSe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],W5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,ASe(s,k),fSe(k),C=M;return}}function cSe(s){return s=s|0,357913941}function uSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function ASe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function Y5(s){s=s|0,gSe(s)}function pSe(s){s=s|0,hSe(s+24|0)}function hSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function gSe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,dSe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dSe(){return 1164}function mSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=ySe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ESe(l,d,c),C=f}function ySe(s){return s=s|0,(n[(gR()|0)+24>>2]|0)+(s*12|0)|0}function ESe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),xp(d,c),c=bp(d,c)|0,tf[f&31](s,c),kp(d),C=m}function xp(s,l){s=s|0,l=l|0,CSe(s,l)}function bp(s,l){return s=s|0,l=l|0,s|0}function kp(s){s=s|0,xu(s)}function CSe(s,l){s=s|0,l=l|0,dR(s,l)}function dR(s,l){s=s|0,l=l|0,n[s>>2]=l}function ISe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],wSe(s,c,d,0),C=f}function wSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=mR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=BSe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,vSe(m,f)|0,f),C=d}function mR(){var s=0,l=0;if(o[7664]|0||(K5(9340),pr(29,9340,U|0)|0,l=7664,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9340)|0)){s=9340,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));K5(9340)}return 9340}function BSe(s){return s=s|0,0}function vSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=mR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],V5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(DSe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function V5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function DSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=SSe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,PSe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],V5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,xSe(s,k),bSe(k),C=M;return}}function SSe(s){return s=s|0,357913941}function PSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function xSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function bSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function K5(s){s=s|0,FSe(s)}function kSe(s){s=s|0,QSe(s+24|0)}function QSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function FSe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,4,l,RSe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function RSe(){return 1180}function TSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=LSe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=NSe(l,d,c)|0,C=f,c|0}function LSe(s){return s=s|0,(n[(mR()|0)+24>>2]|0)+(s*12|0)|0}function NSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),F0(d,c),d=R0(d,c)|0,d=FD(pT[f&15](s,d)|0)|0,C=m,d|0}function F0(s,l){s=s|0,l=l|0}function R0(s,l){return s=s|0,l=l|0,OSe(l)|0}function FD(s){return s=s|0,s|0}function OSe(s){return s=s|0,s|0}function MSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],USe(s,c,d,0),C=f}function USe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=yR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=_Se(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,HSe(m,f)|0,f),C=d}function yR(){var s=0,l=0;if(o[7672]|0||(z5(9376),pr(30,9376,U|0)|0,l=7672,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9376)|0)){s=9376,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));z5(9376)}return 9376}function _Se(s){return s=s|0,0}function HSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=yR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],J5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(qSe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function J5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function qSe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=jSe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,GSe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],J5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,WSe(s,k),YSe(k),C=M;return}}function jSe(s){return s=s|0,357913941}function GSe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function WSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function YSe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function z5(s){s=s|0,JSe(s)}function VSe(s){s=s|0,KSe(s+24|0)}function KSe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function JSe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,X5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function X5(){return 1196}function zSe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=XSe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=ZSe(l,f)|0,C=c,l|0}function XSe(s){return s=s|0,(n[(yR()|0)+24>>2]|0)+(s*12|0)|0}function ZSe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),FD(_0[c&31](s)|0)|0}function $Se(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],ePe(s,c,d,1),C=f}function ePe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=ER()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=tPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,rPe(m,f)|0,f),C=d}function ER(){var s=0,l=0;if(o[7680]|0||($5(9412),pr(31,9412,U|0)|0,l=7680,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9412)|0)){s=9412,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));$5(9412)}return 9412}function tPe(s){return s=s|0,0}function rPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=ER()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],Z5(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(nPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function Z5(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function nPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=iPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,sPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],Z5(m,f,c),n[F>>2]=(n[F>>2]|0)+12,oPe(s,k),aPe(k),C=M;return}}function iPe(s){return s=s|0,357913941}function sPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function oPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function aPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function $5(s){s=s|0,uPe(s)}function lPe(s){s=s|0,cPe(s+24|0)}function cPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function uPe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,6,l,e9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function e9(){return 1200}function APe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=fPe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=pPe(l,f)|0,C=c,l|0}function fPe(s){return s=s|0,(n[(ER()|0)+24>>2]|0)+(s*12|0)|0}function pPe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),RD(_0[c&31](s)|0)|0}function RD(s){return s=s|0,s|0}function hPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gPe(s,c,d,0),C=f}function gPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=CR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=dPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,mPe(m,f)|0,f),C=d}function CR(){var s=0,l=0;if(o[7688]|0||(r9(9448),pr(32,9448,U|0)|0,l=7688,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9448)|0)){s=9448,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));r9(9448)}return 9448}function dPe(s){return s=s|0,0}function mPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=CR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],t9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(yPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function t9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function yPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=EPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,CPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],t9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,IPe(s,k),wPe(k),C=M;return}}function EPe(s){return s=s|0,357913941}function CPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function IPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function wPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function r9(s){s=s|0,DPe(s)}function BPe(s){s=s|0,vPe(s+24|0)}function vPe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function DPe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,6,l,n9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function n9(){return 1204}function SPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=PPe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xPe(l,d,c),C=f}function PPe(s){return s=s|0,(n[(CR()|0)+24>>2]|0)+(s*12|0)|0}function xPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),IR(d,c),d=wR(d,c)|0,tf[f&31](s,d),C=m}function IR(s,l){s=s|0,l=l|0}function wR(s,l){return s=s|0,l=l|0,bPe(l)|0}function bPe(s){return s=s|0,s|0}function kPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],QPe(s,c,d,0),C=f}function QPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=BR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=FPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,RPe(m,f)|0,f),C=d}function BR(){var s=0,l=0;if(o[7696]|0||(s9(9484),pr(33,9484,U|0)|0,l=7696,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9484)|0)){s=9484,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));s9(9484)}return 9484}function FPe(s){return s=s|0,0}function RPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=BR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],i9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(TPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function i9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function TPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=LPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,NPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],i9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,OPe(s,k),MPe(k),C=M;return}}function LPe(s){return s=s|0,357913941}function NPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function OPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function MPe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function s9(s){s=s|0,HPe(s)}function UPe(s){s=s|0,_Pe(s+24|0)}function _Pe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function HPe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,qPe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function qPe(){return 1212}function jPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=GPe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],WPe(l,m,c,f),C=d}function GPe(s){return s=s|0,(n[(BR()|0)+24>>2]|0)+(s*12|0)|0}function WPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),IR(m,c),m=wR(m,c)|0,F0(B,f),B=R0(B,f)|0,sw[d&15](s,m,B),C=k}function YPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],VPe(s,c,d,1),C=f}function VPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=vR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=KPe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,JPe(m,f)|0,f),C=d}function vR(){var s=0,l=0;if(o[7704]|0||(a9(9520),pr(34,9520,U|0)|0,l=7704,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9520)|0)){s=9520,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));a9(9520)}return 9520}function KPe(s){return s=s|0,0}function JPe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=vR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],o9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zPe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function o9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zPe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=XPe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,ZPe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],o9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$Pe(s,k),exe(k),C=M;return}}function XPe(s){return s=s|0,357913941}function ZPe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $Pe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function exe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function a9(s){s=s|0,nxe(s)}function txe(s){s=s|0,rxe(s+24|0)}function rxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nxe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,ixe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ixe(){return 1224}function sxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;return d=C,C=C+16|0,m=d+8|0,B=d,k=oxe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],f=+axe(l,m,c),C=d,+f}function oxe(s){return s=s|0,(n[(vR()|0)+24>>2]|0)+(s*12|0)|0}function axe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,B=+Ru(+iW[f&7](s,d)),C=m,+B}function lxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cxe(s,c,d,1),C=f}function cxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=DR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=uxe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Axe(m,f)|0,f),C=d}function DR(){var s=0,l=0;if(o[7712]|0||(c9(9556),pr(35,9556,U|0)|0,l=7712,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9556)|0)){s=9556,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));c9(9556)}return 9556}function uxe(s){return s=s|0,0}function Axe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=DR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],l9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(fxe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function l9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function fxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=pxe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,hxe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],l9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,gxe(s,k),dxe(k),C=M;return}}function pxe(s){return s=s|0,357913941}function hxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function gxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function dxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function c9(s){s=s|0,Exe(s)}function mxe(s){s=s|0,yxe(s+24|0)}function yxe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Exe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,Cxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Cxe(){return 1232}function Ixe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=wxe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=+Bxe(l,d),C=f,+c}function wxe(s){return s=s|0,(n[(DR()|0)+24>>2]|0)+(s*12|0)|0}function Bxe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),+ +Ru(+nW[c&15](s))}function vxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Dxe(s,c,d,1),C=f}function Dxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=SR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Sxe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Pxe(m,f)|0,f),C=d}function SR(){var s=0,l=0;if(o[7720]|0||(A9(9592),pr(36,9592,U|0)|0,l=7720,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9592)|0)){s=9592,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));A9(9592)}return 9592}function Sxe(s){return s=s|0,0}function Pxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=SR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],u9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(xxe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function u9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function xxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=bxe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,kxe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],u9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Qxe(s,k),Fxe(k),C=M;return}}function bxe(s){return s=s|0,357913941}function kxe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Qxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Fxe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function A9(s){s=s|0,Lxe(s)}function Rxe(s){s=s|0,Txe(s+24|0)}function Txe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Lxe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,7,l,Nxe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Nxe(){return 1276}function Oxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=Mxe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=Uxe(l,f)|0,C=c,l|0}function Mxe(s){return s=s|0,(n[(SR()|0)+24>>2]|0)+(s*12|0)|0}function Uxe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;return d=C,C=C+16|0,f=d,c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),tf[c&31](f,s),f=f9(f)|0,C=d,f|0}function f9(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=cR(p9()|0)|0,f?(uR(l,f),AR(c,l),_xe(s,c),s=fR(l)|0):s=Hxe(s)|0,C=d,s|0}function p9(){var s=0;return o[7736]|0||(Xxe(9640),pr(25,9640,U|0)|0,s=7736,n[s>>2]=1,n[s+4>>2]=0),9640}function _xe(s,l){s=s|0,l=l|0,Wxe(l,s,s+8|0)|0}function Hxe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Za(8)|0,l=f,k=Yt(16)|0,n[k>>2]=n[s>>2],n[k+4>>2]=n[s+4>>2],n[k+8>>2]=n[s+8>>2],n[k+12>>2]=n[s+12>>2],m=l+4|0,n[m>>2]=k,s=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],PR(s,m,d),n[f>>2]=s,C=c,l|0}function PR(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1244,n[c+12>>2]=l,n[s+4>>2]=c}function qxe(s){s=s|0,im(s),yt(s)}function jxe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function Gxe(s){s=s|0,yt(s)}function Wxe(s,l,c){return s=s|0,l=l|0,c=c|0,l=Yxe(n[s>>2]|0,l,c)|0,c=s+4|0,n[(n[c>>2]|0)+8>>2]=l,n[(n[c>>2]|0)+8>>2]|0}function Yxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return f=C,C=C+16|0,d=f,$a(d),s=ys(s)|0,c=Vxe(s,n[l>>2]|0,+E[c>>3])|0,el(d),C=f,c|0}function Vxe(s,l,c){s=s|0,l=l|0,c=+c;var f=0;return f=jo(Kxe()|0)|0,l=Xd(l)|0,pc(0,f|0,s|0,l|0,+ +ma(c))|0}function Kxe(){var s=0;return o[7728]|0||(Jxe(9628),s=7728,n[s>>2]=1,n[s+4>>2]=0),9628}function Jxe(s){s=s|0,ao(s,zxe()|0,2)}function zxe(){return 1264}function Xxe(s){s=s|0,Pp(s)}function Zxe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],$xe(s,c,d,1),C=f}function $xe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=xR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=ebe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,tbe(m,f)|0,f),C=d}function xR(){var s=0,l=0;if(o[7744]|0||(g9(9684),pr(37,9684,U|0)|0,l=7744,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9684)|0)){s=9684,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));g9(9684)}return 9684}function ebe(s){return s=s|0,0}function tbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=xR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],h9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(rbe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function h9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function rbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=nbe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,ibe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],h9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,sbe(s,k),obe(k),C=M;return}}function nbe(s){return s=s|0,357913941}function ibe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function sbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function obe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function g9(s){s=s|0,cbe(s)}function abe(s){s=s|0,lbe(s+24|0)}function lbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function cbe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,5,l,ube()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ube(){return 1280}function Abe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=fbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=pbe(l,d,c)|0,C=f,c|0}function fbe(s){return s=s|0,(n[(xR()|0)+24>>2]|0)+(s*12|0)|0}function pbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return B=C,C=C+32|0,d=B,m=B+16|0,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(m,c),m=ZA(m,c)|0,sw[f&15](d,s,m),m=f9(d)|0,C=B,m|0}function hbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],gbe(s,c,d,1),C=f}function gbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=bR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=dbe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,mbe(m,f)|0,f),C=d}function bR(){var s=0,l=0;if(o[7752]|0||(m9(9720),pr(38,9720,U|0)|0,l=7752,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9720)|0)){s=9720,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));m9(9720)}return 9720}function dbe(s){return s=s|0,0}function mbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=bR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],d9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(ybe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function d9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function ybe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Ebe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Cbe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],d9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Ibe(s,k),wbe(k),C=M;return}}function Ebe(s){return s=s|0,357913941}function Cbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Ibe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function wbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function m9(s){s=s|0,Dbe(s)}function Bbe(s){s=s|0,vbe(s+24|0)}function vbe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Dbe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,8,l,Sbe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Sbe(){return 1288}function Pbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;return c=C,C=C+16|0,f=c+8|0,d=c,m=xbe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],l=bbe(l,f)|0,C=c,l|0}function xbe(s){return s=s|0,(n[(bR()|0)+24>>2]|0)+(s*12|0)|0}function bbe(s,l){s=s|0,l=l|0;var c=0;return c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),k0(_0[c&31](s)|0)|0}function kbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Qbe(s,c,d,0),C=f}function Qbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=kR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Fbe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Rbe(m,f)|0,f),C=d}function kR(){var s=0,l=0;if(o[7760]|0||(E9(9756),pr(39,9756,U|0)|0,l=7760,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9756)|0)){s=9756,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));E9(9756)}return 9756}function Fbe(s){return s=s|0,0}function Rbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=kR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],y9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Tbe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function y9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Tbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Lbe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Nbe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],y9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Obe(s,k),Mbe(k),C=M;return}}function Lbe(s){return s=s|0,357913941}function Nbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Obe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Mbe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function E9(s){s=s|0,Hbe(s)}function Ube(s){s=s|0,_be(s+24|0)}function _be(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Hbe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,8,l,qbe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function qbe(){return 1292}function jbe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Gbe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Wbe(l,d,c),C=f}function Gbe(s){return s=s|0,(n[(kR()|0)+24>>2]|0)+(s*12|0)|0}function Wbe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),Tu(d,c),c=+Lu(d,c),eW[f&31](s,c),C=m}function Ybe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Vbe(s,c,d,0),C=f}function Vbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=QR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Kbe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Jbe(m,f)|0,f),C=d}function QR(){var s=0,l=0;if(o[7768]|0||(I9(9792),pr(40,9792,U|0)|0,l=7768,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9792)|0)){s=9792,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));I9(9792)}return 9792}function Kbe(s){return s=s|0,0}function Jbe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=QR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],C9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zbe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function C9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zbe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Xbe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Zbe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],C9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$be(s,k),eke(k),C=M;return}}function Xbe(s){return s=s|0,357913941}function Zbe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $be(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function I9(s){s=s|0,nke(s)}function tke(s){s=s|0,rke(s+24|0)}function rke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nke(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,1,l,ike()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ike(){return 1300}function ske(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=oke(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],ake(l,m,c,f),C=d}function oke(s){return s=s|0,(n[(QR()|0)+24>>2]|0)+(s*12|0)|0}function ake(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,Tu(B,f),f=+Lu(B,f),lW[d&15](s,m,f),C=k}function lke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],cke(s,c,d,0),C=f}function cke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=FR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=uke(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Ake(m,f)|0,f),C=d}function FR(){var s=0,l=0;if(o[7776]|0||(B9(9828),pr(41,9828,U|0)|0,l=7776,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9828)|0)){s=9828,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));B9(9828)}return 9828}function uke(s){return s=s|0,0}function Ake(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=FR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],w9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(fke(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function w9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function fke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=pke(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,hke(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],w9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,gke(s,k),dke(k),C=M;return}}function pke(s){return s=s|0,357913941}function hke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function gke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function dke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function B9(s){s=s|0,Eke(s)}function mke(s){s=s|0,yke(s+24|0)}function yke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Eke(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,7,l,Cke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Cke(){return 1312}function Ike(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=wke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Bke(l,d,c),C=f}function wke(s){return s=s|0,(n[(FR()|0)+24>>2]|0)+(s*12|0)|0}function Bke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,tf[f&31](s,d),C=m}function vke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Dke(s,c,d,0),C=f}function Dke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=RR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Ske(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Pke(m,f)|0,f),C=d}function RR(){var s=0,l=0;if(o[7784]|0||(D9(9864),pr(42,9864,U|0)|0,l=7784,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9864)|0)){s=9864,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));D9(9864)}return 9864}function Ske(s){return s=s|0,0}function Pke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=RR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],v9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(xke(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function v9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function xke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=bke(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,kke(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],v9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,Qke(s,k),Fke(k),C=M;return}}function bke(s){return s=s|0,357913941}function kke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function Qke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Fke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function D9(s){s=s|0,Lke(s)}function Rke(s){s=s|0,Tke(s+24|0)}function Tke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function Lke(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,8,l,Nke()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function Nke(){return 1320}function Oke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=Mke(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Uke(l,d,c),C=f}function Mke(s){return s=s|0,(n[(RR()|0)+24>>2]|0)+(s*12|0)|0}function Uke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),_ke(d,c),d=Hke(d,c)|0,tf[f&31](s,d),C=m}function _ke(s,l){s=s|0,l=l|0}function Hke(s,l){return s=s|0,l=l|0,qke(l)|0}function qke(s){return s=s|0,s|0}function jke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],Gke(s,c,d,0),C=f}function Gke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=TR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=Wke(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,Yke(m,f)|0,f),C=d}function TR(){var s=0,l=0;if(o[7792]|0||(P9(9900),pr(43,9900,U|0)|0,l=7792,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9900)|0)){s=9900,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));P9(9900)}return 9900}function Wke(s){return s=s|0,0}function Yke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=TR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],S9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(Vke(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function S9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function Vke(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=Kke(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,Jke(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],S9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,zke(s,k),Xke(k),C=M;return}}function Kke(s){return s=s|0,357913941}function Jke(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function zke(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function Xke(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function P9(s){s=s|0,eQe(s)}function Zke(s){s=s|0,$ke(s+24|0)}function $ke(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function eQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,22,l,tQe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function tQe(){return 1344}function rQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0;c=C,C=C+16|0,f=c+8|0,d=c,m=nQe(s)|0,s=n[m+4>>2]|0,n[d>>2]=n[m>>2],n[d+4>>2]=s,n[f>>2]=n[d>>2],n[f+4>>2]=n[d+4>>2],iQe(l,f),C=c}function nQe(s){return s=s|0,(n[(TR()|0)+24>>2]|0)+(s*12|0)|0}function iQe(s,l){s=s|0,l=l|0;var c=0;c=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(c=n[(n[s>>2]|0)+c>>2]|0),ef[c&127](s)}function sQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=LR()|0,s=oQe(c)|0,yn(m,l,d,s,aQe(c,f)|0,f)}function LR(){var s=0,l=0;if(o[7800]|0||(b9(9936),pr(44,9936,U|0)|0,l=7800,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9936)|0)){s=9936,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));b9(9936)}return 9936}function oQe(s){return s=s|0,s|0}function aQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=LR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(x9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(lQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function x9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function lQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=cQe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,uQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,x9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,AQe(s,d),fQe(d),C=k;return}}function cQe(s){return s=s|0,536870911}function uQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function AQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function fQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function b9(s){s=s|0,gQe(s)}function pQe(s){s=s|0,hQe(s+24|0)}function hQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function gQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,23,l,n9()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function dQe(s,l){s=s|0,l=l|0,yQe(n[(mQe(s)|0)>>2]|0,l)}function mQe(s){return s=s|0,(n[(LR()|0)+24>>2]|0)+(s<<3)|0}function yQe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,IR(f,l),l=wR(f,l)|0,ef[s&127](l),C=c}function EQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=NR()|0,s=CQe(c)|0,yn(m,l,d,s,IQe(c,f)|0,f)}function NR(){var s=0,l=0;if(o[7808]|0||(Q9(9972),pr(45,9972,U|0)|0,l=7808,n[l>>2]=1,n[l+4>>2]=0),!(Nr(9972)|0)){s=9972,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));Q9(9972)}return 9972}function CQe(s){return s=s|0,s|0}function IQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=NR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(k9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(wQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function k9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function wQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=BQe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,vQe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,k9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,DQe(s,d),SQe(d),C=k;return}}function BQe(s){return s=s|0,536870911}function vQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function DQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function SQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function Q9(s){s=s|0,bQe(s)}function PQe(s){s=s|0,xQe(s+24|0)}function xQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function bQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,9,l,kQe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function kQe(){return 1348}function QQe(s,l){return s=s|0,l=l|0,RQe(n[(FQe(s)|0)>>2]|0,l)|0}function FQe(s){return s=s|0,(n[(NR()|0)+24>>2]|0)+(s<<3)|0}function RQe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,F9(f,l),l=R9(f,l)|0,l=FD(_0[s&31](l)|0)|0,C=c,l|0}function F9(s,l){s=s|0,l=l|0}function R9(s,l){return s=s|0,l=l|0,TQe(l)|0}function TQe(s){return s=s|0,s|0}function LQe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=OR()|0,s=NQe(c)|0,yn(m,l,d,s,OQe(c,f)|0,f)}function OR(){var s=0,l=0;if(o[7816]|0||(L9(10008),pr(46,10008,U|0)|0,l=7816,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10008)|0)){s=10008,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));L9(10008)}return 10008}function NQe(s){return s=s|0,s|0}function OQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=OR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(T9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(MQe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function T9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function MQe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=UQe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,_Qe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,T9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,HQe(s,d),qQe(d),C=k;return}}function UQe(s){return s=s|0,536870911}function _Qe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function HQe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function qQe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function L9(s){s=s|0,WQe(s)}function jQe(s){s=s|0,GQe(s+24|0)}function GQe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function WQe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,15,l,X5()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function YQe(s){return s=s|0,KQe(n[(VQe(s)|0)>>2]|0)|0}function VQe(s){return s=s|0,(n[(OR()|0)+24>>2]|0)+(s<<3)|0}function KQe(s){return s=s|0,FD(VD[s&7]()|0)|0}function JQe(){var s=0;return o[7832]|0||(nFe(10052),pr(25,10052,U|0)|0,s=7832,n[s>>2]=1,n[s+4>>2]=0),10052}function zQe(s,l){s=s|0,l=l|0,n[s>>2]=XQe()|0,n[s+4>>2]=ZQe()|0,n[s+12>>2]=l,n[s+8>>2]=$Qe()|0,n[s+32>>2]=2}function XQe(){return 11709}function ZQe(){return 1188}function $Qe(){return TD()|0}function eFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(tFe(c),yt(c)):l|0&&(Hd(l),yt(l))}function Qp(s,l){return s=s|0,l=l|0,l&s|0}function tFe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function TD(){var s=0;return o[7824]|0||(n[2511]=rFe()|0,n[2512]=0,s=7824,n[s>>2]=1,n[s+4>>2]=0),10044}function rFe(){return 0}function nFe(s){s=s|0,Pp(s)}function iFe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0;l=C,C=C+32|0,c=l+24|0,m=l+16|0,d=l+8|0,f=l,sFe(s,4827),oFe(s,4834,3)|0,aFe(s,3682,47)|0,n[m>>2]=9,n[m+4>>2]=0,n[c>>2]=n[m>>2],n[c+4>>2]=n[m+4>>2],lFe(s,4841,c)|0,n[d>>2]=1,n[d+4>>2]=0,n[c>>2]=n[d>>2],n[c+4>>2]=n[d+4>>2],cFe(s,4871,c)|0,n[f>>2]=10,n[f+4>>2]=0,n[c>>2]=n[f>>2],n[c+4>>2]=n[f+4>>2],uFe(s,4891,c)|0,C=l}function sFe(s,l){s=s|0,l=l|0;var c=0;c=qRe()|0,n[s>>2]=c,jRe(c,l),Fp(n[s>>2]|0)}function oFe(s,l,c){return s=s|0,l=l|0,c=c|0,SRe(s,mn(l)|0,c,0),s|0}function aFe(s,l,c){return s=s|0,l=l|0,c=c|0,ARe(s,mn(l)|0,c,0),s|0}function lFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],YFe(s,l,d),C=f,s|0}function cFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],PFe(s,l,d),C=f,s|0}function uFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=n[c+4>>2]|0,n[m>>2]=n[c>>2],n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],AFe(s,l,d),C=f,s|0}function AFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],fFe(s,c,d,1),C=f}function fFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=MR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=pFe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,hFe(m,f)|0,f),C=d}function MR(){var s=0,l=0;if(o[7840]|0||(O9(10100),pr(48,10100,U|0)|0,l=7840,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10100)|0)){s=10100,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));O9(10100)}return 10100}function pFe(s){return s=s|0,0}function hFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=MR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],N9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(gFe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function N9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function gFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=dFe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,mFe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],N9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,yFe(s,k),EFe(k),C=M;return}}function dFe(s){return s=s|0,357913941}function mFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function yFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function EFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function O9(s){s=s|0,wFe(s)}function CFe(s){s=s|0,IFe(s+24|0)}function IFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function wFe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,6,l,BFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function BFe(){return 1364}function vFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;return f=C,C=C+16|0,d=f+8|0,m=f,B=DFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],c=SFe(l,d,c)|0,C=f,c|0}function DFe(s){return s=s|0,(n[(MR()|0)+24>>2]|0)+(s*12|0)|0}function SFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),XA(d,c),d=ZA(d,c)|0,d=G5(pT[f&15](s,d)|0)|0,C=m,d|0}function PFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],xFe(s,c,d,0),C=f}function xFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=UR()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=bFe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,kFe(m,f)|0,f),C=d}function UR(){var s=0,l=0;if(o[7848]|0||(U9(10136),pr(49,10136,U|0)|0,l=7848,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10136)|0)){s=10136,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));U9(10136)}return 10136}function bFe(s){return s=s|0,0}function kFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=UR()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],M9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(QFe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function M9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function QFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=FFe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,RFe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],M9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,TFe(s,k),LFe(k),C=M;return}}function FFe(s){return s=s|0,357913941}function RFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function TFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function LFe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function U9(s){s=s|0,MFe(s)}function NFe(s){s=s|0,OFe(s+24|0)}function OFe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function MFe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,9,l,UFe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function UFe(){return 1372}function _Fe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,d=f+8|0,m=f,B=HFe(s)|0,s=n[B+4>>2]|0,n[m>>2]=n[B>>2],n[m+4>>2]=s,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],qFe(l,d,c),C=f}function HFe(s){return s=s|0,(n[(UR()|0)+24>>2]|0)+(s*12|0)|0}function qFe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=Ze;m=C,C=C+16|0,d=m,f=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(f=n[(n[s>>2]|0)+f>>2]|0),jFe(d,c),B=y(GFe(d,c)),$7[f&1](s,B),C=m}function jFe(s,l){s=s|0,l=+l}function GFe(s,l){return s=s|0,l=+l,y(WFe(l))}function WFe(s){return s=+s,y(s)}function YFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,d=f+8|0,m=f,k=n[c>>2]|0,B=n[c+4>>2]|0,c=mn(l)|0,n[m>>2]=k,n[m+4>>2]=B,n[d>>2]=n[m>>2],n[d+4>>2]=n[m+4>>2],VFe(s,c,d,0),C=f}function VFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0,F=0,M=0,O=0;d=C,C=C+32|0,m=d+16|0,O=d+8|0,k=d,M=n[c>>2]|0,F=n[c+4>>2]|0,B=n[s>>2]|0,s=_R()|0,n[O>>2]=M,n[O+4>>2]=F,n[m>>2]=n[O>>2],n[m+4>>2]=n[O+4>>2],c=KFe(m)|0,n[k>>2]=M,n[k+4>>2]=F,n[m>>2]=n[k>>2],n[m+4>>2]=n[k+4>>2],yn(B,l,s,c,JFe(m,f)|0,f),C=d}function _R(){var s=0,l=0;if(o[7856]|0||(H9(10172),pr(50,10172,U|0)|0,l=7856,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10172)|0)){s=10172,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));H9(10172)}return 10172}function KFe(s){return s=s|0,0}function JFe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0;return O=C,C=C+32|0,d=O+24|0,B=O+16|0,k=O,F=O+8|0,m=n[s>>2]|0,f=n[s+4>>2]|0,n[k>>2]=m,n[k+4>>2]=f,j=_R()|0,M=j+24|0,s=dr(l,4)|0,n[F>>2]=s,l=j+28|0,c=n[l>>2]|0,c>>>0<(n[j+32>>2]|0)>>>0?(n[B>>2]=m,n[B+4>>2]=f,n[d>>2]=n[B>>2],n[d+4>>2]=n[B+4>>2],_9(c,d,s),s=(n[l>>2]|0)+12|0,n[l>>2]=s):(zFe(M,k,F),s=n[l>>2]|0),C=O,((s-(n[M>>2]|0)|0)/12|0)+-1|0}function _9(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=n[l+4>>2]|0,n[s>>2]=n[l>>2],n[s+4>>2]=f,n[s+8>>2]=c}function zFe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;if(M=C,C=C+48|0,f=M+32|0,B=M+24|0,k=M,F=s+4|0,d=(((n[F>>2]|0)-(n[s>>2]|0)|0)/12|0)+1|0,m=XFe(s)|0,m>>>0>>0)Zr(s);else{O=n[s>>2]|0,oe=((n[s+8>>2]|0)-O|0)/12|0,j=oe<<1,ZFe(k,oe>>>0>>1>>>0?j>>>0>>0?d:j:m,((n[F>>2]|0)-O|0)/12|0,s+8|0),F=k+8|0,m=n[F>>2]|0,d=n[l+4>>2]|0,c=n[c>>2]|0,n[B>>2]=n[l>>2],n[B+4>>2]=d,n[f>>2]=n[B>>2],n[f+4>>2]=n[B+4>>2],_9(m,f,c),n[F>>2]=(n[F>>2]|0)+12,$Fe(s,k),eRe(k),C=M;return}}function XFe(s){return s=s|0,357913941}function ZFe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>357913941)Tt();else{d=Yt(l*12|0)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c*12|0)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l*12|0)}function $Fe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(((d|0)/-12|0)*12|0)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function eRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~(((f+-12-l|0)>>>0)/12|0)*12|0)),s=n[s>>2]|0,s|0&&yt(s)}function H9(s){s=s|0,nRe(s)}function tRe(s){s=s|0,rRe(s+24|0)}function rRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~(((l+-12-f|0)>>>0)/12|0)*12|0)),yt(c))}function nRe(s){s=s|0;var l=0;l=Jr()|0,zr(s,2,3,l,iRe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function iRe(){return 1380}function sRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+8|0,B=d,k=oRe(s)|0,s=n[k+4>>2]|0,n[B>>2]=n[k>>2],n[B+4>>2]=s,n[m>>2]=n[B>>2],n[m+4>>2]=n[B+4>>2],aRe(l,m,c,f),C=d}function oRe(s){return s=s|0,(n[(_R()|0)+24>>2]|0)+(s*12|0)|0}function aRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;k=C,C=C+16|0,m=k+1|0,B=k,d=n[l>>2]|0,l=n[l+4>>2]|0,s=s+(l>>1)|0,l&1&&(d=n[(n[s>>2]|0)+d>>2]|0),XA(m,c),m=ZA(m,c)|0,lRe(B,f),B=cRe(B,f)|0,sw[d&15](s,m,B),C=k}function lRe(s,l){s=s|0,l=l|0}function cRe(s,l){return s=s|0,l=l|0,uRe(l)|0}function uRe(s){return s=s|0,(s|0)!=0|0}function ARe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=HR()|0,s=fRe(c)|0,yn(m,l,d,s,pRe(c,f)|0,f)}function HR(){var s=0,l=0;if(o[7864]|0||(j9(10208),pr(51,10208,U|0)|0,l=7864,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10208)|0)){s=10208,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));j9(10208)}return 10208}function fRe(s){return s=s|0,s|0}function pRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=HR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(q9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(hRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function q9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function hRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=gRe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,dRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,q9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,mRe(s,d),yRe(d),C=k;return}}function gRe(s){return s=s|0,536870911}function dRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function mRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function yRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function j9(s){s=s|0,IRe(s)}function ERe(s){s=s|0,CRe(s+24|0)}function CRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function IRe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,24,l,wRe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function wRe(){return 1392}function BRe(s,l){s=s|0,l=l|0,DRe(n[(vRe(s)|0)>>2]|0,l)}function vRe(s){return s=s|0,(n[(HR()|0)+24>>2]|0)+(s<<3)|0}function DRe(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,F9(f,l),l=R9(f,l)|0,ef[s&127](l),C=c}function SRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=qR()|0,s=PRe(c)|0,yn(m,l,d,s,xRe(c,f)|0,f)}function qR(){var s=0,l=0;if(o[7872]|0||(W9(10244),pr(52,10244,U|0)|0,l=7872,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10244)|0)){s=10244,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));W9(10244)}return 10244}function PRe(s){return s=s|0,s|0}function xRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=qR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(G9(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(bRe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function G9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function bRe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=kRe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,QRe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,G9(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,FRe(s,d),RRe(d),C=k;return}}function kRe(s){return s=s|0,536870911}function QRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function FRe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function RRe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function W9(s){s=s|0,NRe(s)}function TRe(s){s=s|0,LRe(s+24|0)}function LRe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function NRe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,16,l,ORe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function ORe(){return 1400}function MRe(s){return s=s|0,_Re(n[(URe(s)|0)>>2]|0)|0}function URe(s){return s=s|0,(n[(qR()|0)+24>>2]|0)+(s<<3)|0}function _Re(s){return s=s|0,HRe(VD[s&7]()|0)|0}function HRe(s){return s=s|0,s|0}function qRe(){var s=0;return o[7880]|0||(JRe(10280),pr(25,10280,U|0)|0,s=7880,n[s>>2]=1,n[s+4>>2]=0),10280}function jRe(s,l){s=s|0,l=l|0,n[s>>2]=GRe()|0,n[s+4>>2]=WRe()|0,n[s+12>>2]=l,n[s+8>>2]=YRe()|0,n[s+32>>2]=4}function GRe(){return 11711}function WRe(){return 1356}function YRe(){return TD()|0}function VRe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(KRe(c),yt(c)):l|0&&(C0(l),yt(l))}function KRe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function JRe(s){s=s|0,Pp(s)}function zRe(s){s=s|0,XRe(s,4920),ZRe(s)|0,$Re(s)|0}function XRe(s,l){s=s|0,l=l|0;var c=0;c=p9()|0,n[s>>2]=c,CTe(c,l),Fp(n[s>>2]|0)}function ZRe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,uTe()|0),s|0}function $Re(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,eTe()|0),s|0}function eTe(){var s=0;return o[7888]|0||(Y9(10328),pr(53,10328,U|0)|0,s=7888,n[s>>2]=1,n[s+4>>2]=0),Nr(10328)|0||Y9(10328),10328}function T0(s,l){s=s|0,l=l|0,yn(s,0,l,0,0,0)}function Y9(s){s=s|0,nTe(s),L0(s,10)}function tTe(s){s=s|0,rTe(s+24|0)}function rTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function nTe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,1,l,aTe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function iTe(s,l,c){s=s|0,l=l|0,c=+c,sTe(s,l,c)}function L0(s,l){s=s|0,l=l|0,n[s+20>>2]=l}function sTe(s,l,c){s=s|0,l=l|0,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+16|0,m=f+8|0,k=f+13|0,d=f,B=f+12|0,XA(k,l),n[m>>2]=ZA(k,l)|0,Tu(B,c),E[d>>3]=+Lu(B,c),oTe(s,m,d),C=f}function oTe(s,l,c){s=s|0,l=l|0,c=c|0,Xa(s+8|0,n[l>>2]|0,+E[c>>3]),o[s+24>>0]=1}function aTe(){return 1404}function lTe(s,l){return s=s|0,l=+l,cTe(s,l)|0}function cTe(s,l){s=s|0,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return f=C,C=C+16|0,m=f+4|0,B=f+8|0,k=f,d=Za(8)|0,c=d,F=Yt(16)|0,XA(m,s),s=ZA(m,s)|0,Tu(B,l),Xa(F,s,+Lu(B,l)),B=c+4|0,n[B>>2]=F,s=Yt(8)|0,B=n[B>>2]|0,n[k>>2]=0,n[m>>2]=n[k>>2],PR(s,B,m),n[d>>2]=s,C=f,c|0}function uTe(){var s=0;return o[7896]|0||(V9(10364),pr(54,10364,U|0)|0,s=7896,n[s>>2]=1,n[s+4>>2]=0),Nr(10364)|0||V9(10364),10364}function V9(s){s=s|0,pTe(s),L0(s,55)}function ATe(s){s=s|0,fTe(s+24|0)}function fTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function pTe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,4,l,mTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function hTe(s){s=s|0,gTe(s)}function gTe(s){s=s|0,dTe(s)}function dTe(s){s=s|0,K9(s+8|0),o[s+24>>0]=1}function K9(s){s=s|0,n[s>>2]=0,E[s+8>>3]=0}function mTe(){return 1424}function yTe(){return ETe()|0}function ETe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Za(8)|0,s=c,f=Yt(16)|0,K9(f),m=s+4|0,n[m>>2]=f,f=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],PR(f,m,d),n[c>>2]=f,C=l,s|0}function CTe(s,l){s=s|0,l=l|0,n[s>>2]=ITe()|0,n[s+4>>2]=wTe()|0,n[s+12>>2]=l,n[s+8>>2]=BTe()|0,n[s+32>>2]=5}function ITe(){return 11710}function wTe(){return 1416}function BTe(){return LD()|0}function vTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(DTe(c),yt(c)):l|0&&yt(l)}function DTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function LD(){var s=0;return o[7904]|0||(n[2600]=STe()|0,n[2601]=0,s=7904,n[s>>2]=1,n[s+4>>2]=0),10400}function STe(){return n[357]|0}function PTe(s){s=s|0,xTe(s,4926),bTe(s)|0}function xTe(s,l){s=s|0,l=l|0;var c=0;c=N5()|0,n[s>>2]=c,_Te(c,l),Fp(n[s>>2]|0)}function bTe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,kTe()|0),s|0}function kTe(){var s=0;return o[7912]|0||(J9(10412),pr(56,10412,U|0)|0,s=7912,n[s>>2]=1,n[s+4>>2]=0),Nr(10412)|0||J9(10412),10412}function J9(s){s=s|0,RTe(s),L0(s,57)}function QTe(s){s=s|0,FTe(s+24|0)}function FTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function RTe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,5,l,OTe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function TTe(s){s=s|0,LTe(s)}function LTe(s){s=s|0,NTe(s)}function NTe(s){s=s|0;var l=0,c=0;l=s+8|0,c=l+48|0;do n[l>>2]=0,l=l+4|0;while((l|0)<(c|0));o[s+56>>0]=1}function OTe(){return 1432}function MTe(){return UTe()|0}function UTe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0;B=C,C=C+16|0,s=B+4|0,l=B,c=Za(8)|0,f=c,d=Yt(48)|0,m=d,k=m+48|0;do n[m>>2]=0,m=m+4|0;while((m|0)<(k|0));return m=f+4|0,n[m>>2]=d,k=Yt(8)|0,m=n[m>>2]|0,n[l>>2]=0,n[s>>2]=n[l>>2],O5(k,m,s),n[c>>2]=k,C=B,f|0}function _Te(s,l){s=s|0,l=l|0,n[s>>2]=HTe()|0,n[s+4>>2]=qTe()|0,n[s+12>>2]=l,n[s+8>>2]=jTe()|0,n[s+32>>2]=6}function HTe(){return 11704}function qTe(){return 1436}function jTe(){return LD()|0}function GTe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(WTe(c),yt(c)):l|0&&yt(l)}function WTe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function YTe(s){s=s|0,VTe(s,4933),KTe(s)|0,JTe(s)|0}function VTe(s,l){s=s|0,l=l|0;var c=0;c=ELe()|0,n[s>>2]=c,CLe(c,l),Fp(n[s>>2]|0)}function KTe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,cLe()|0),s|0}function JTe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,zTe()|0),s|0}function zTe(){var s=0;return o[7920]|0||(z9(10452),pr(58,10452,U|0)|0,s=7920,n[s>>2]=1,n[s+4>>2]=0),Nr(10452)|0||z9(10452),10452}function z9(s){s=s|0,$Te(s),L0(s,1)}function XTe(s){s=s|0,ZTe(s+24|0)}function ZTe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function $Te(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,1,l,nLe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function eLe(s,l,c){s=s|0,l=+l,c=+c,tLe(s,l,c)}function tLe(s,l,c){s=s|0,l=+l,c=+c;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,m=f+8|0,k=f+17|0,d=f,B=f+16|0,Tu(k,l),E[m>>3]=+Lu(k,l),Tu(B,c),E[d>>3]=+Lu(B,c),rLe(s,m,d),C=f}function rLe(s,l,c){s=s|0,l=l|0,c=c|0,X9(s+8|0,+E[l>>3],+E[c>>3]),o[s+24>>0]=1}function X9(s,l,c){s=s|0,l=+l,c=+c,E[s>>3]=l,E[s+8>>3]=c}function nLe(){return 1472}function iLe(s,l){return s=+s,l=+l,sLe(s,l)|0}function sLe(s,l){s=+s,l=+l;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return f=C,C=C+16|0,B=f+4|0,k=f+8|0,F=f,d=Za(8)|0,c=d,m=Yt(16)|0,Tu(B,s),s=+Lu(B,s),Tu(k,l),X9(m,s,+Lu(k,l)),k=c+4|0,n[k>>2]=m,m=Yt(8)|0,k=n[k>>2]|0,n[F>>2]=0,n[B>>2]=n[F>>2],Z9(m,k,B),n[d>>2]=m,C=f,c|0}function Z9(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1452,n[c+12>>2]=l,n[s+4>>2]=c}function oLe(s){s=s|0,im(s),yt(s)}function aLe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function lLe(s){s=s|0,yt(s)}function cLe(){var s=0;return o[7928]|0||($9(10488),pr(59,10488,U|0)|0,s=7928,n[s>>2]=1,n[s+4>>2]=0),Nr(10488)|0||$9(10488),10488}function $9(s){s=s|0,fLe(s),L0(s,60)}function uLe(s){s=s|0,ALe(s+24|0)}function ALe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function fLe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,6,l,dLe()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function pLe(s){s=s|0,hLe(s)}function hLe(s){s=s|0,gLe(s)}function gLe(s){s=s|0,e7(s+8|0),o[s+24>>0]=1}function e7(s){s=s|0,n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,n[s+12>>2]=0}function dLe(){return 1492}function mLe(){return yLe()|0}function yLe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Za(8)|0,s=c,f=Yt(16)|0,e7(f),m=s+4|0,n[m>>2]=f,f=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],Z9(f,m,d),n[c>>2]=f,C=l,s|0}function ELe(){var s=0;return o[7936]|0||(SLe(10524),pr(25,10524,U|0)|0,s=7936,n[s>>2]=1,n[s+4>>2]=0),10524}function CLe(s,l){s=s|0,l=l|0,n[s>>2]=ILe()|0,n[s+4>>2]=wLe()|0,n[s+12>>2]=l,n[s+8>>2]=BLe()|0,n[s+32>>2]=7}function ILe(){return 11700}function wLe(){return 1484}function BLe(){return LD()|0}function vLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(DLe(c),yt(c)):l|0&&yt(l)}function DLe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function SLe(s){s=s|0,Pp(s)}function PLe(s,l,c){s=s|0,l=l|0,c=c|0,s=mn(l)|0,l=xLe(c)|0,c=bLe(c,0)|0,sNe(s,l,c,jR()|0,0)}function xLe(s){return s=s|0,s|0}function bLe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=jR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(r7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(NLe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function jR(){var s=0,l=0;if(o[7944]|0||(t7(10568),pr(61,10568,U|0)|0,l=7944,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10568)|0)){s=10568,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));t7(10568)}return 10568}function t7(s){s=s|0,FLe(s)}function kLe(s){s=s|0,QLe(s+24|0)}function QLe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function FLe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,17,l,e9()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function RLe(s){return s=s|0,LLe(n[(TLe(s)|0)>>2]|0)|0}function TLe(s){return s=s|0,(n[(jR()|0)+24>>2]|0)+(s<<3)|0}function LLe(s){return s=s|0,RD(VD[s&7]()|0)|0}function r7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function NLe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=OLe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,MLe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,r7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,ULe(s,d),_Le(d),C=k;return}}function OLe(s){return s=s|0,536870911}function MLe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function ULe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function _Le(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function HLe(){qLe()}function qLe(){jLe(10604)}function jLe(s){s=s|0,GLe(s,4955)}function GLe(s,l){s=s|0,l=l|0;var c=0;c=WLe()|0,n[s>>2]=c,YLe(c,l),Fp(n[s>>2]|0)}function WLe(){var s=0;return o[7952]|0||(tNe(10612),pr(25,10612,U|0)|0,s=7952,n[s>>2]=1,n[s+4>>2]=0),10612}function YLe(s,l){s=s|0,l=l|0,n[s>>2]=zLe()|0,n[s+4>>2]=XLe()|0,n[s+12>>2]=l,n[s+8>>2]=ZLe()|0,n[s+32>>2]=8}function Fp(s){s=s|0;var l=0,c=0;l=C,C=C+16|0,c=l,$d()|0,n[c>>2]=s,VLe(10608,c),C=l}function $d(){return o[11714]|0||(n[2652]=0,pr(62,10608,U|0)|0,o[11714]=1),10608}function VLe(s,l){s=s|0,l=l|0;var c=0;c=Yt(8)|0,n[c+4>>2]=n[l>>2],n[c>>2]=n[s>>2],n[s>>2]=c}function KLe(s){s=s|0,JLe(s)}function JLe(s){s=s|0;var l=0,c=0;if(l=n[s>>2]|0,l|0)do c=l,l=n[l>>2]|0,yt(c);while(l|0);n[s>>2]=0}function zLe(){return 11715}function XLe(){return 1496}function ZLe(){return TD()|0}function $Le(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(eNe(c),yt(c)):l|0&&yt(l)}function eNe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function tNe(s){s=s|0,Pp(s)}function rNe(s,l){s=s|0,l=l|0;var c=0,f=0;$d()|0,c=n[2652]|0;e:do if(c|0){for(;f=n[c+4>>2]|0,!(f|0&&!(O7(GR(f)|0,s)|0));)if(c=n[c>>2]|0,!c)break e;nNe(f,l)}while(!1)}function GR(s){return s=s|0,n[s+12>>2]|0}function nNe(s,l){s=s|0,l=l|0;var c=0;s=s+36|0,c=n[s>>2]|0,c|0&&(xu(c),yt(c)),c=Yt(4)|0,SD(c,l),n[s>>2]=c}function WR(){return o[11716]|0||(n[2664]=0,pr(63,10656,U|0)|0,o[11716]=1),10656}function n7(){var s=0;return o[11717]|0?s=n[2665]|0:(iNe(),n[2665]=1504,o[11717]=1,s=1504),s|0}function iNe(){o[11740]|0||(o[11718]=dr(dr(8,0)|0,0)|0,o[11719]=dr(dr(0,0)|0,0)|0,o[11720]=dr(dr(0,16)|0,0)|0,o[11721]=dr(dr(8,0)|0,0)|0,o[11722]=dr(dr(0,0)|0,0)|0,o[11723]=dr(dr(8,0)|0,0)|0,o[11724]=dr(dr(0,0)|0,0)|0,o[11725]=dr(dr(8,0)|0,0)|0,o[11726]=dr(dr(0,0)|0,0)|0,o[11727]=dr(dr(8,0)|0,0)|0,o[11728]=dr(dr(0,0)|0,0)|0,o[11729]=dr(dr(0,0)|0,32)|0,o[11730]=dr(dr(0,0)|0,32)|0,o[11740]=1)}function i7(){return 1572}function sNe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0;m=C,C=C+32|0,O=m+16|0,M=m+12|0,F=m+8|0,k=m+4|0,B=m,n[O>>2]=s,n[M>>2]=l,n[F>>2]=c,n[k>>2]=f,n[B>>2]=d,WR()|0,oNe(10656,O,M,F,k,B),C=m}function oNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0;B=Yt(24)|0,R5(B+4|0,n[l>>2]|0,n[c>>2]|0,n[f>>2]|0,n[d>>2]|0,n[m>>2]|0),n[B>>2]=n[s>>2],n[s>>2]=B}function s7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0;if(ct=C,C=C+32|0,Oe=ct+20|0,Qe=ct+8|0,rt=ct+4|0,Xe=ct,l=n[l>>2]|0,l|0){We=Oe+4|0,F=Oe+8|0,M=Qe+4|0,O=Qe+8|0,j=Qe+8|0,oe=Oe+8|0;do{if(B=l+4|0,k=YR(B)|0,k|0){if(d=$I(k)|0,n[Oe>>2]=0,n[We>>2]=0,n[F>>2]=0,f=(ew(k)|0)+1|0,aNe(Oe,f),f|0)for(;f=f+-1|0,Tc(Qe,n[d>>2]|0),m=n[We>>2]|0,m>>>0<(n[oe>>2]|0)>>>0?(n[m>>2]=n[Qe>>2],n[We>>2]=(n[We>>2]|0)+4):VR(Oe,Qe),f;)d=d+4|0;f=tw(k)|0,n[Qe>>2]=0,n[M>>2]=0,n[O>>2]=0;e:do if(n[f>>2]|0)for(d=0,m=0;;){if((d|0)==(m|0)?lNe(Qe,f):(n[d>>2]=n[f>>2],n[M>>2]=(n[M>>2]|0)+4),f=f+4|0,!(n[f>>2]|0))break e;d=n[M>>2]|0,m=n[j>>2]|0}while(!1);n[rt>>2]=ND(B)|0,n[Xe>>2]=Nr(k)|0,cNe(c,s,rt,Xe,Oe,Qe),KR(Qe),$A(Oe)}l=n[l>>2]|0}while(l|0)}C=ct}function YR(s){return s=s|0,n[s+12>>2]|0}function $I(s){return s=s|0,n[s+12>>2]|0}function ew(s){return s=s|0,n[s+16>>2]|0}function aNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+32|0,c=d,f=n[s>>2]|0,(n[s+8>>2]|0)-f>>2>>>0>>0&&(p7(c,l,(n[s+4>>2]|0)-f>>2,s+8|0),h7(s,c),g7(c)),C=d}function VR(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=f7(s)|0,m>>>0>>0)Zr(s);else{k=n[s>>2]|0,M=(n[s+8>>2]|0)-k|0,F=M>>1,p7(c,M>>2>>>0>>1>>>0?F>>>0>>0?d:F:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,h7(s,c),g7(c),C=B;return}}function tw(s){return s=s|0,n[s+8>>2]|0}function lNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;if(B=C,C=C+32|0,c=B,f=s+4|0,d=((n[f>>2]|0)-(n[s>>2]|0)>>2)+1|0,m=A7(s)|0,m>>>0>>0)Zr(s);else{k=n[s>>2]|0,M=(n[s+8>>2]|0)-k|0,F=M>>1,xNe(c,M>>2>>>0>>1>>>0?F>>>0>>0?d:F:m,(n[f>>2]|0)-k>>2,s+8|0),m=c+8|0,n[n[m>>2]>>2]=n[l>>2],n[m>>2]=(n[m>>2]|0)+4,bNe(s,c),kNe(c),C=B;return}}function ND(s){return s=s|0,n[s>>2]|0}function cNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,uNe(s,l,c,f,d,m)}function KR(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),yt(c))}function $A(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-4-f|0)>>>2)<<2)),yt(c))}function uNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0;B=C,C=C+48|0,O=B+40|0,k=B+32|0,j=B+24|0,F=B+12|0,M=B,$a(k),s=ys(s)|0,n[j>>2]=n[l>>2],c=n[c>>2]|0,f=n[f>>2]|0,JR(F,d),ANe(M,m),n[O>>2]=n[j>>2],fNe(s,O,c,f,F,M),KR(M),$A(F),el(k),C=B}function JR(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(SNe(s,f),PNe(s,n[l>>2]|0,n[c>>2]|0,f))}function ANe(s,l){s=s|0,l=l|0;var c=0,f=0;n[s>>2]=0,n[s+4>>2]=0,n[s+8>>2]=0,c=l+4|0,f=(n[c>>2]|0)-(n[l>>2]|0)>>2,f|0&&(vNe(s,f),DNe(s,n[l>>2]|0,n[c>>2]|0,f))}function fNe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0;B=C,C=C+32|0,O=B+28|0,j=B+24|0,k=B+12|0,F=B,M=jo(pNe()|0)|0,n[j>>2]=n[l>>2],n[O>>2]=n[j>>2],l=N0(O)|0,c=o7(c)|0,f=zR(f)|0,n[k>>2]=n[d>>2],O=d+4|0,n[k+4>>2]=n[O>>2],j=d+8|0,n[k+8>>2]=n[j>>2],n[j>>2]=0,n[O>>2]=0,n[d>>2]=0,d=XR(k)|0,n[F>>2]=n[m>>2],O=m+4|0,n[F+4>>2]=n[O>>2],j=m+8|0,n[F+8>>2]=n[j>>2],n[j>>2]=0,n[O>>2]=0,n[m>>2]=0,gc(0,M|0,s|0,l|0,c|0,f|0,d|0,hNe(F)|0)|0,KR(F),$A(k),C=B}function pNe(){var s=0;return o[7968]|0||(wNe(10708),s=7968,n[s>>2]=1,n[s+4>>2]=0),10708}function N0(s){return s=s|0,l7(s)|0}function o7(s){return s=s|0,a7(s)|0}function zR(s){return s=s|0,RD(s)|0}function XR(s){return s=s|0,dNe(s)|0}function hNe(s){return s=s|0,gNe(s)|0}function gNe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Za(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=a7(n[(n[s>>2]|0)+(l<<2)>>2]|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function a7(s){return s=s|0,s|0}function dNe(s){s=s|0;var l=0,c=0,f=0;if(f=(n[s+4>>2]|0)-(n[s>>2]|0)|0,c=f>>2,f=Za(f+4|0)|0,n[f>>2]=c,c|0){l=0;do n[f+4+(l<<2)>>2]=l7((n[s>>2]|0)+(l<<2)|0)|0,l=l+1|0;while((l|0)!=(c|0))}return f|0}function l7(s){s=s|0;var l=0,c=0,f=0,d=0;return d=C,C=C+32|0,l=d+12|0,c=d,f=cR(c7()|0)|0,f?(uR(l,f),AR(c,l),Z4e(s,c),s=fR(l)|0):s=mNe(s)|0,C=d,s|0}function c7(){var s=0;return o[7960]|0||(INe(10664),pr(25,10664,U|0)|0,s=7960,n[s>>2]=1,n[s+4>>2]=0),10664}function mNe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Za(8)|0,l=f,k=Yt(4)|0,n[k>>2]=n[s>>2],m=l+4|0,n[m>>2]=k,s=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],u7(s,m,d),n[f>>2]=s,C=c,l|0}function u7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1656,n[c+12>>2]=l,n[s+4>>2]=c}function yNe(s){s=s|0,im(s),yt(s)}function ENe(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function CNe(s){s=s|0,yt(s)}function INe(s){s=s|0,Pp(s)}function wNe(s){s=s|0,ao(s,BNe()|0,5)}function BNe(){return 1676}function vNe(s,l){s=s|0,l=l|0;var c=0;if((A7(s)|0)>>>0>>0&&Zr(s),l>>>0>1073741823)Tt();else{c=Yt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function DNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(br(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function A7(s){return s=s|0,1073741823}function SNe(s,l){s=s|0,l=l|0;var c=0;if((f7(s)|0)>>>0>>0&&Zr(s),l>>>0>1073741823)Tt();else{c=Yt(l<<2)|0,n[s+4>>2]=c,n[s>>2]=c,n[s+8>>2]=c+(l<<2);return}}function PNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,f=s+4|0,s=c-l|0,(s|0)>0&&(br(n[f>>2]|0,l|0,s|0)|0,n[f>>2]=(n[f>>2]|0)+(s>>>2<<2))}function f7(s){return s=s|0,1073741823}function xNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Yt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function bNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function kNe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&yt(s)}function p7(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>1073741823)Tt();else{d=Yt(l<<2)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<2)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<2)}function h7(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>2)<<2)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function g7(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-4-l|0)>>>2)<<2)),s=n[s>>2]|0,s|0&&yt(s)}function QNe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0;if(Qe=C,C=C+32|0,O=Qe+20|0,j=Qe+12|0,M=Qe+16|0,oe=Qe+4|0,We=Qe,Oe=Qe+8|0,k=n7()|0,m=n[k>>2]|0,B=n[m>>2]|0,B|0)for(F=n[k+8>>2]|0,k=n[k+4>>2]|0;Tc(O,B),FNe(s,O,k,F),m=m+4|0,B=n[m>>2]|0,B;)F=F+1|0,k=k+1|0;if(m=i7()|0,B=n[m>>2]|0,B|0)do Tc(O,B),n[j>>2]=n[m+4>>2],RNe(l,O,j),m=m+8|0,B=n[m>>2]|0;while(B|0);if(m=n[($d()|0)>>2]|0,m|0)do l=n[m+4>>2]|0,Tc(O,n[(em(l)|0)>>2]|0),n[j>>2]=GR(l)|0,TNe(c,O,j),m=n[m>>2]|0;while(m|0);if(Tc(M,0),m=WR()|0,n[O>>2]=n[M>>2],s7(O,m,d),m=n[($d()|0)>>2]|0,m|0){s=O+4|0,l=O+8|0,c=O+8|0;do{if(F=n[m+4>>2]|0,Tc(j,n[(em(F)|0)>>2]|0),LNe(oe,d7(F)|0),B=n[oe>>2]|0,B|0){n[O>>2]=0,n[s>>2]=0,n[l>>2]=0;do Tc(We,n[(em(n[B+4>>2]|0)|0)>>2]|0),k=n[s>>2]|0,k>>>0<(n[c>>2]|0)>>>0?(n[k>>2]=n[We>>2],n[s>>2]=(n[s>>2]|0)+4):VR(O,We),B=n[B>>2]|0;while(B|0);NNe(f,j,O),$A(O)}n[Oe>>2]=n[j>>2],M=m7(F)|0,n[O>>2]=n[Oe>>2],s7(O,M,d),U5(oe),m=n[m>>2]|0}while(m|0)}C=Qe}function FNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,KNe(s,l,c,f)}function RNe(s,l,c){s=s|0,l=l|0,c=c|0,VNe(s,l,c)}function em(s){return s=s|0,s|0}function TNe(s,l,c){s=s|0,l=l|0,c=c|0,jNe(s,l,c)}function d7(s){return s=s|0,s+16|0}function LNe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;if(m=C,C=C+16|0,d=m+8|0,c=m,n[s>>2]=0,f=n[l>>2]|0,n[d>>2]=f,n[c>>2]=s,c=qNe(c)|0,f|0){if(f=Yt(12)|0,B=(y7(d)|0)+4|0,s=n[B+4>>2]|0,l=f+4|0,n[l>>2]=n[B>>2],n[l+4>>2]=s,l=n[n[d>>2]>>2]|0,n[d>>2]=l,!l)s=f;else for(l=f;s=Yt(12)|0,F=(y7(d)|0)+4|0,k=n[F+4>>2]|0,B=s+4|0,n[B>>2]=n[F>>2],n[B+4>>2]=k,n[l>>2]=s,B=n[n[d>>2]>>2]|0,n[d>>2]=B,B;)l=s;n[s>>2]=n[c>>2],n[c>>2]=f}C=m}function NNe(s,l,c){s=s|0,l=l|0,c=c|0,ONe(s,l,c)}function m7(s){return s=s|0,s+24|0}function ONe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+24|0,d=f+16|0,k=f+12|0,m=f,$a(d),s=ys(s)|0,n[k>>2]=n[l>>2],JR(m,c),n[B>>2]=n[k>>2],MNe(s,B,m),$A(m),el(d),C=f}function MNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=C,C=C+32|0,B=f+16|0,k=f+12|0,d=f,m=jo(UNe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=N0(B)|0,n[d>>2]=n[c>>2],B=c+4|0,n[d+4>>2]=n[B>>2],k=c+8|0,n[d+8>>2]=n[k>>2],n[k>>2]=0,n[B>>2]=0,n[c>>2]=0,hs(0,m|0,s|0,l|0,XR(d)|0)|0,$A(d),C=f}function UNe(){var s=0;return o[7976]|0||(_Ne(10720),s=7976,n[s>>2]=1,n[s+4>>2]=0),10720}function _Ne(s){s=s|0,ao(s,HNe()|0,2)}function HNe(){return 1732}function qNe(s){return s=s|0,n[s>>2]|0}function y7(s){return s=s|0,n[s>>2]|0}function jNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,$a(d),s=ys(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],E7(s,m,c),el(d),C=f}function E7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+16|0,m=f+4|0,B=f,d=jo(GNe()|0)|0,n[B>>2]=n[l>>2],n[m>>2]=n[B>>2],l=N0(m)|0,hs(0,d|0,s|0,l|0,o7(c)|0)|0,C=f}function GNe(){var s=0;return o[7984]|0||(WNe(10732),s=7984,n[s>>2]=1,n[s+4>>2]=0),10732}function WNe(s){s=s|0,ao(s,YNe()|0,2)}function YNe(){return 1744}function VNe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;f=C,C=C+32|0,m=f+16|0,d=f+8|0,B=f,$a(d),s=ys(s)|0,n[B>>2]=n[l>>2],c=n[c>>2]|0,n[m>>2]=n[B>>2],E7(s,m,c),el(d),C=f}function KNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,$a(m),s=ys(s)|0,n[k>>2]=n[l>>2],c=o[c>>0]|0,f=o[f>>0]|0,n[B>>2]=n[k>>2],JNe(s,B,c,f),el(m),C=d}function JNe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,B=d+4|0,k=d,m=jo(zNe()|0)|0,n[k>>2]=n[l>>2],n[B>>2]=n[k>>2],l=N0(B)|0,c=tm(c)|0,vi(0,m|0,s|0,l|0,c|0,tm(f)|0)|0,C=d}function zNe(){var s=0;return o[7992]|0||(ZNe(10744),s=7992,n[s>>2]=1,n[s+4>>2]=0),10744}function tm(s){return s=s|0,XNe(s)|0}function XNe(s){return s=s|0,s&255|0}function ZNe(s){s=s|0,ao(s,$Ne()|0,3)}function $Ne(){return 1756}function eOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;switch(oe=C,C=C+32|0,k=oe+8|0,F=oe+4|0,M=oe+20|0,O=oe,dR(s,0),f=X4e(l)|0,n[k>>2]=0,j=k+4|0,n[j>>2]=0,n[k+8>>2]=0,f<<24>>24){case 0:{o[M>>0]=0,tOe(F,c,M),OD(s,F)|0,bu(F);break}case 8:{j=nT(l)|0,o[M>>0]=8,Tc(O,n[j+4>>2]|0),rOe(F,c,M,O,j+8|0),OD(s,F)|0,bu(F);break}case 9:{if(m=nT(l)|0,l=n[m+4>>2]|0,l|0)for(B=k+8|0,d=m+12|0;l=l+-1|0,Tc(F,n[d>>2]|0),f=n[j>>2]|0,f>>>0<(n[B>>2]|0)>>>0?(n[f>>2]=n[F>>2],n[j>>2]=(n[j>>2]|0)+4):VR(k,F),l;)d=d+4|0;o[M>>0]=9,Tc(O,n[m+8>>2]|0),nOe(F,c,M,O,k),OD(s,F)|0,bu(F);break}default:j=nT(l)|0,o[M>>0]=f,Tc(O,n[j+4>>2]|0),iOe(F,c,M,O),OD(s,F)|0,bu(F)}$A(k),C=oe}function tOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;f=C,C=C+16|0,d=f,$a(d),l=ys(l)|0,mOe(s,l,o[c>>0]|0),el(d),C=f}function OD(s,l){s=s|0,l=l|0;var c=0;return c=n[s>>2]|0,c|0&&sa(c|0),n[s>>2]=n[l>>2],n[l>>2]=0,s|0}function rOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0;m=C,C=C+32|0,k=m+16|0,B=m+8|0,F=m,$a(B),l=ys(l)|0,c=o[c>>0]|0,n[F>>2]=n[f>>2],d=n[d>>2]|0,n[k>>2]=n[F>>2],pOe(s,l,c,k,d),el(B),C=m}function nOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0;m=C,C=C+32|0,F=m+24|0,B=m+16|0,M=m+12|0,k=m,$a(B),l=ys(l)|0,c=o[c>>0]|0,n[M>>2]=n[f>>2],JR(k,d),n[F>>2]=n[M>>2],cOe(s,l,c,F,k),$A(k),el(B),C=m}function iOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+32|0,B=d+16|0,m=d+8|0,k=d,$a(m),l=ys(l)|0,c=o[c>>0]|0,n[k>>2]=n[f>>2],n[B>>2]=n[k>>2],sOe(s,l,c,B),el(m),C=d}function sOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0,B=0,k=0;d=C,C=C+16|0,m=d+4|0,k=d,B=jo(oOe()|0)|0,c=tm(c)|0,n[k>>2]=n[f>>2],n[m>>2]=n[k>>2],MD(s,hs(0,B|0,l|0,c|0,N0(m)|0)|0),C=d}function oOe(){var s=0;return o[8e3]|0||(aOe(10756),s=8e3,n[s>>2]=1,n[s+4>>2]=0),10756}function MD(s,l){s=s|0,l=l|0,dR(s,l)}function aOe(s){s=s|0,ao(s,lOe()|0,2)}function lOe(){return 1772}function cOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0;m=C,C=C+32|0,F=m+16|0,M=m+12|0,B=m,k=jo(uOe()|0)|0,c=tm(c)|0,n[M>>2]=n[f>>2],n[F>>2]=n[M>>2],f=N0(F)|0,n[B>>2]=n[d>>2],F=d+4|0,n[B+4>>2]=n[F>>2],M=d+8|0,n[B+8>>2]=n[M>>2],n[M>>2]=0,n[F>>2]=0,n[d>>2]=0,MD(s,vi(0,k|0,l|0,c|0,f|0,XR(B)|0)|0),$A(B),C=m}function uOe(){var s=0;return o[8008]|0||(AOe(10768),s=8008,n[s>>2]=1,n[s+4>>2]=0),10768}function AOe(s){s=s|0,ao(s,fOe()|0,3)}function fOe(){return 1784}function pOe(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0;m=C,C=C+16|0,k=m+4|0,F=m,B=jo(hOe()|0)|0,c=tm(c)|0,n[F>>2]=n[f>>2],n[k>>2]=n[F>>2],f=N0(k)|0,MD(s,vi(0,B|0,l|0,c|0,f|0,zR(d)|0)|0),C=m}function hOe(){var s=0;return o[8016]|0||(gOe(10780),s=8016,n[s>>2]=1,n[s+4>>2]=0),10780}function gOe(s){s=s|0,ao(s,dOe()|0,3)}function dOe(){return 1800}function mOe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;f=jo(yOe()|0)|0,MD(s,un(0,f|0,l|0,tm(c)|0)|0)}function yOe(){var s=0;return o[8024]|0||(EOe(10792),s=8024,n[s>>2]=1,n[s+4>>2]=0),10792}function EOe(s){s=s|0,ao(s,COe()|0,1)}function COe(){return 1816}function IOe(){wOe(),BOe(),vOe()}function wOe(){n[2702]=V7(65536)|0}function BOe(){GOe(10856)}function vOe(){DOe(10816)}function DOe(s){s=s|0,SOe(s,5044),POe(s)|0}function SOe(s,l){s=s|0,l=l|0;var c=0;c=c7()|0,n[s>>2]=c,MOe(c,l),Fp(n[s>>2]|0)}function POe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,xOe()|0),s|0}function xOe(){var s=0;return o[8032]|0||(C7(10820),pr(64,10820,U|0)|0,s=8032,n[s>>2]=1,n[s+4>>2]=0),Nr(10820)|0||C7(10820),10820}function C7(s){s=s|0,QOe(s),L0(s,25)}function bOe(s){s=s|0,kOe(s+24|0)}function kOe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function QOe(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,18,l,LOe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function FOe(s,l){s=s|0,l=l|0,ROe(s,l)}function ROe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;c=C,C=C+16|0,f=c,d=c+4|0,F0(d,l),n[f>>2]=R0(d,l)|0,TOe(s,f),C=c}function TOe(s,l){s=s|0,l=l|0,I7(s+4|0,n[l>>2]|0),o[s+8>>0]=1}function I7(s,l){s=s|0,l=l|0,n[s>>2]=l}function LOe(){return 1824}function NOe(s){return s=s|0,OOe(s)|0}function OOe(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0;return c=C,C=C+16|0,d=c+4|0,B=c,f=Za(8)|0,l=f,k=Yt(4)|0,F0(d,s),I7(k,R0(d,s)|0),m=l+4|0,n[m>>2]=k,s=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],u7(s,m,d),n[f>>2]=s,C=c,l|0}function Za(s){s=s|0;var l=0,c=0;return s=s+7&-8,s>>>0<=32768&&(l=n[2701]|0,s>>>0<=(65536-l|0)>>>0)?(c=(n[2702]|0)+l|0,n[2701]=l+s,s=c):(s=V7(s+8|0)|0,n[s>>2]=n[2703],n[2703]=s,s=s+8|0),s|0}function MOe(s,l){s=s|0,l=l|0,n[s>>2]=UOe()|0,n[s+4>>2]=_Oe()|0,n[s+12>>2]=l,n[s+8>>2]=HOe()|0,n[s+32>>2]=9}function UOe(){return 11744}function _Oe(){return 1832}function HOe(){return LD()|0}function qOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(jOe(c),yt(c)):l|0&&yt(l)}function jOe(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function GOe(s){s=s|0,WOe(s,5052),YOe(s)|0,VOe(s,5058,26)|0,KOe(s,5069,1)|0,JOe(s,5077,10)|0,zOe(s,5087,19)|0,XOe(s,5094,27)|0}function WOe(s,l){s=s|0,l=l|0;var c=0;c=j4e()|0,n[s>>2]=c,G4e(c,l),Fp(n[s>>2]|0)}function YOe(s){s=s|0;var l=0;return l=n[s>>2]|0,T0(l,b4e()|0),s|0}function VOe(s,l,c){return s=s|0,l=l|0,c=c|0,A4e(s,mn(l)|0,c,0),s|0}function KOe(s,l,c){return s=s|0,l=l|0,c=c|0,zMe(s,mn(l)|0,c,0),s|0}function JOe(s,l,c){return s=s|0,l=l|0,c=c|0,xMe(s,mn(l)|0,c,0),s|0}function zOe(s,l,c){return s=s|0,l=l|0,c=c|0,pMe(s,mn(l)|0,c,0),s|0}function w7(s,l){s=s|0,l=l|0;var c=0,f=0;e:for(;;){for(c=n[2703]|0;;){if((c|0)==(l|0))break e;if(f=n[c>>2]|0,n[2703]=f,!c)c=f;else break}yt(c)}n[2701]=s}function XOe(s,l,c){return s=s|0,l=l|0,c=c|0,ZOe(s,mn(l)|0,c,0),s|0}function ZOe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=ZR()|0,s=$Oe(c)|0,yn(m,l,d,s,eMe(c,f)|0,f)}function ZR(){var s=0,l=0;if(o[8040]|0||(v7(10860),pr(65,10860,U|0)|0,l=8040,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10860)|0)){s=10860,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));v7(10860)}return 10860}function $Oe(s){return s=s|0,s|0}function eMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=ZR()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(B7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(tMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function B7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function tMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=rMe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,nMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,B7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,iMe(s,d),sMe(d),C=k;return}}function rMe(s){return s=s|0,536870911}function nMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function iMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function sMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function v7(s){s=s|0,lMe(s)}function oMe(s){s=s|0,aMe(s+24|0)}function aMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function lMe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,11,l,cMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function cMe(){return 1840}function uMe(s,l,c){s=s|0,l=l|0,c=c|0,fMe(n[(AMe(s)|0)>>2]|0,l,c)}function AMe(s){return s=s|0,(n[(ZR()|0)+24>>2]|0)+(s<<3)|0}function fMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+1|0,d=f,F0(m,l),l=R0(m,l)|0,F0(d,c),c=R0(d,c)|0,tf[s&31](l,c),C=f}function pMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=$R()|0,s=hMe(c)|0,yn(m,l,d,s,gMe(c,f)|0,f)}function $R(){var s=0,l=0;if(o[8048]|0||(S7(10896),pr(66,10896,U|0)|0,l=8048,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10896)|0)){s=10896,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));S7(10896)}return 10896}function hMe(s){return s=s|0,s|0}function gMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=$R()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(D7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(dMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function D7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function dMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=mMe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,yMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,D7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,EMe(s,d),CMe(d),C=k;return}}function mMe(s){return s=s|0,536870911}function yMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function EMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function CMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function S7(s){s=s|0,BMe(s)}function IMe(s){s=s|0,wMe(s+24|0)}function wMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function BMe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,11,l,vMe()|0,1),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function vMe(){return 1852}function DMe(s,l){return s=s|0,l=l|0,PMe(n[(SMe(s)|0)>>2]|0,l)|0}function SMe(s){return s=s|0,(n[($R()|0)+24>>2]|0)+(s<<3)|0}function PMe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,F0(f,l),l=R0(f,l)|0,l=RD(_0[s&31](l)|0)|0,C=c,l|0}function xMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=eT()|0,s=bMe(c)|0,yn(m,l,d,s,kMe(c,f)|0,f)}function eT(){var s=0,l=0;if(o[8056]|0||(x7(10932),pr(67,10932,U|0)|0,l=8056,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10932)|0)){s=10932,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));x7(10932)}return 10932}function bMe(s){return s=s|0,s|0}function kMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=eT()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(P7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(QMe(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function P7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function QMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=FMe(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,RMe(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,P7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,TMe(s,d),LMe(d),C=k;return}}function FMe(s){return s=s|0,536870911}function RMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function TMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function LMe(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function x7(s){s=s|0,MMe(s)}function NMe(s){s=s|0,OMe(s+24|0)}function OMe(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function MMe(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,7,l,UMe()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function UMe(){return 1860}function _Me(s,l,c){return s=s|0,l=l|0,c=c|0,qMe(n[(HMe(s)|0)>>2]|0,l,c)|0}function HMe(s){return s=s|0,(n[(eT()|0)+24>>2]|0)+(s<<3)|0}function qMe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0;return f=C,C=C+32|0,B=f+12|0,m=f+8|0,k=f,F=f+16|0,d=f+4|0,jMe(F,l),GMe(k,F,l),xp(d,c),c=bp(d,c)|0,n[B>>2]=n[k>>2],sw[s&15](m,B,c),c=WMe(m)|0,bu(m),kp(d),C=f,c|0}function jMe(s,l){s=s|0,l=l|0}function GMe(s,l,c){s=s|0,l=l|0,c=c|0,YMe(s,c)}function WMe(s){return s=s|0,ys(s)|0}function YMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0;d=C,C=C+16|0,c=d,f=l,f&1?(VMe(c,0),ia(f|0,c|0)|0,KMe(s,c),JMe(c)):n[s>>2]=n[l>>2],C=d}function VMe(s,l){s=s|0,l=l|0,Fc(s,l),n[s+4>>2]=0,o[s+8>>0]=0}function KMe(s,l){s=s|0,l=l|0,n[s>>2]=n[l+4>>2]}function JMe(s){s=s|0,o[s+8>>0]=0}function zMe(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=tT()|0,s=XMe(c)|0,yn(m,l,d,s,ZMe(c,f)|0,f)}function tT(){var s=0,l=0;if(o[8064]|0||(k7(10968),pr(68,10968,U|0)|0,l=8064,n[l>>2]=1,n[l+4>>2]=0),!(Nr(10968)|0)){s=10968,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));k7(10968)}return 10968}function XMe(s){return s=s|0,s|0}function ZMe(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=tT()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(b7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):($Me(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function b7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function $Me(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=e4e(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,t4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,b7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,r4e(s,d),n4e(d),C=k;return}}function e4e(s){return s=s|0,536870911}function t4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function r4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function n4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function k7(s){s=s|0,o4e(s)}function i4e(s){s=s|0,s4e(s+24|0)}function s4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function o4e(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,1,l,a4e()|0,5),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function a4e(){return 1872}function l4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,u4e(n[(c4e(s)|0)>>2]|0,l,c,f,d,m)}function c4e(s){return s=s|0,(n[(tT()|0)+24>>2]|0)+(s<<3)|0}function u4e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0;B=C,C=C+32|0,k=B+16|0,F=B+12|0,M=B+8|0,O=B+4|0,j=B,xp(k,l),l=bp(k,l)|0,xp(F,c),c=bp(F,c)|0,xp(M,f),f=bp(M,f)|0,xp(O,d),d=bp(O,d)|0,xp(j,m),m=bp(j,m)|0,Z7[s&1](l,c,f,d,m),kp(j),kp(O),kp(M),kp(F),kp(k),C=B}function A4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;m=n[s>>2]|0,d=rT()|0,s=f4e(c)|0,yn(m,l,d,s,p4e(c,f)|0,f)}function rT(){var s=0,l=0;if(o[8072]|0||(F7(11004),pr(69,11004,U|0)|0,l=8072,n[l>>2]=1,n[l+4>>2]=0),!(Nr(11004)|0)){s=11004,l=s+36|0;do n[s>>2]=0,s=s+4|0;while((s|0)<(l|0));F7(11004)}return 11004}function f4e(s){return s=s|0,s|0}function p4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0,k=0,F=0;return k=C,C=C+16|0,d=k,m=k+4|0,n[d>>2]=s,F=rT()|0,B=F+24|0,l=dr(l,4)|0,n[m>>2]=l,c=F+28|0,f=n[c>>2]|0,f>>>0<(n[F+32>>2]|0)>>>0?(Q7(f,s,l),l=(n[c>>2]|0)+8|0,n[c>>2]=l):(h4e(B,d,m),l=n[c>>2]|0),C=k,(l-(n[B>>2]|0)>>3)+-1|0}function Q7(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,n[s+4>>2]=c}function h4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0;if(k=C,C=C+32|0,d=k,m=s+4|0,B=((n[m>>2]|0)-(n[s>>2]|0)>>3)+1|0,f=g4e(s)|0,f>>>0>>0)Zr(s);else{F=n[s>>2]|0,O=(n[s+8>>2]|0)-F|0,M=O>>2,d4e(d,O>>3>>>0>>1>>>0?M>>>0>>0?B:M:f,(n[m>>2]|0)-F>>3,s+8|0),B=d+8|0,Q7(n[B>>2]|0,n[l>>2]|0,n[c>>2]|0),n[B>>2]=(n[B>>2]|0)+8,m4e(s,d),y4e(d),C=k;return}}function g4e(s){return s=s|0,536870911}function d4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0;n[s+12>>2]=0,n[s+16>>2]=f;do if(l)if(l>>>0>536870911)Tt();else{d=Yt(l<<3)|0;break}else d=0;while(!1);n[s>>2]=d,f=d+(c<<3)|0,n[s+8>>2]=f,n[s+4>>2]=f,n[s+12>>2]=d+(l<<3)}function m4e(s,l){s=s|0,l=l|0;var c=0,f=0,d=0,m=0,B=0;f=n[s>>2]|0,B=s+4|0,m=l+4|0,d=(n[B>>2]|0)-f|0,c=(n[m>>2]|0)+(0-(d>>3)<<3)|0,n[m>>2]=c,(d|0)>0?(br(c|0,f|0,d|0)|0,f=m,c=n[m>>2]|0):f=m,m=n[s>>2]|0,n[s>>2]=c,n[f>>2]=m,m=l+8|0,d=n[B>>2]|0,n[B>>2]=n[m>>2],n[m>>2]=d,m=s+8|0,B=l+12|0,s=n[m>>2]|0,n[m>>2]=n[B>>2],n[B>>2]=s,n[l>>2]=n[f>>2]}function y4e(s){s=s|0;var l=0,c=0,f=0;l=n[s+4>>2]|0,c=s+8|0,f=n[c>>2]|0,(f|0)!=(l|0)&&(n[c>>2]=f+(~((f+-8-l|0)>>>3)<<3)),s=n[s>>2]|0,s|0&&yt(s)}function F7(s){s=s|0,I4e(s)}function E4e(s){s=s|0,C4e(s+24|0)}function C4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function I4e(s){s=s|0;var l=0;l=Jr()|0,zr(s,1,12,l,w4e()|0,2),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function w4e(){return 1896}function B4e(s,l,c){s=s|0,l=l|0,c=c|0,D4e(n[(v4e(s)|0)>>2]|0,l,c)}function v4e(s){return s=s|0,(n[(rT()|0)+24>>2]|0)+(s<<3)|0}function D4e(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;f=C,C=C+16|0,m=f+4|0,d=f,S4e(m,l),l=P4e(m,l)|0,xp(d,c),c=bp(d,c)|0,tf[s&31](l,c),kp(d),C=f}function S4e(s,l){s=s|0,l=l|0}function P4e(s,l){return s=s|0,l=l|0,x4e(l)|0}function x4e(s){return s=s|0,s|0}function b4e(){var s=0;return o[8080]|0||(R7(11040),pr(70,11040,U|0)|0,s=8080,n[s>>2]=1,n[s+4>>2]=0),Nr(11040)|0||R7(11040),11040}function R7(s){s=s|0,F4e(s),L0(s,71)}function k4e(s){s=s|0,Q4e(s+24|0)}function Q4e(s){s=s|0;var l=0,c=0,f=0;c=n[s>>2]|0,f=c,c|0&&(s=s+4|0,l=n[s>>2]|0,(l|0)!=(c|0)&&(n[s>>2]=l+(~((l+-8-f|0)>>>3)<<3)),yt(c))}function F4e(s){s=s|0;var l=0;l=Jr()|0,zr(s,5,7,l,N4e()|0,0),n[s+24>>2]=0,n[s+28>>2]=0,n[s+32>>2]=0}function R4e(s){s=s|0,T4e(s)}function T4e(s){s=s|0,L4e(s)}function L4e(s){s=s|0,o[s+8>>0]=1}function N4e(){return 1936}function O4e(){return M4e()|0}function M4e(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0;return l=C,C=C+16|0,d=l+4|0,B=l,c=Za(8)|0,s=c,m=s+4|0,n[m>>2]=Yt(1)|0,f=Yt(8)|0,m=n[m>>2]|0,n[B>>2]=0,n[d>>2]=n[B>>2],U4e(f,m,d),n[c>>2]=f,C=l,s|0}function U4e(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]=l,c=Yt(16)|0,n[c+4>>2]=0,n[c+8>>2]=0,n[c>>2]=1916,n[c+12>>2]=l,n[s+4>>2]=c}function _4e(s){s=s|0,im(s),yt(s)}function H4e(s){s=s|0,s=n[s+12>>2]|0,s|0&&yt(s)}function q4e(s){s=s|0,yt(s)}function j4e(){var s=0;return o[8088]|0||(z4e(11076),pr(25,11076,U|0)|0,s=8088,n[s>>2]=1,n[s+4>>2]=0),11076}function G4e(s,l){s=s|0,l=l|0,n[s>>2]=W4e()|0,n[s+4>>2]=Y4e()|0,n[s+12>>2]=l,n[s+8>>2]=V4e()|0,n[s+32>>2]=10}function W4e(){return 11745}function Y4e(){return 1940}function V4e(){return TD()|0}function K4e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,(Qp(f,896)|0)==512?c|0&&(J4e(c),yt(c)):l|0&&yt(l)}function J4e(s){s=s|0,s=n[s+4>>2]|0,s|0&&Rp(s)}function z4e(s){s=s|0,Pp(s)}function Tc(s,l){s=s|0,l=l|0,n[s>>2]=l}function nT(s){return s=s|0,n[s>>2]|0}function X4e(s){return s=s|0,o[n[s>>2]>>0]|0}function Z4e(s,l){s=s|0,l=l|0;var c=0,f=0;c=C,C=C+16|0,f=c,n[f>>2]=n[s>>2],$4e(l,f)|0,C=c}function $4e(s,l){s=s|0,l=l|0;var c=0;return c=eUe(n[s>>2]|0,l)|0,l=s+4|0,n[(n[l>>2]|0)+8>>2]=c,n[(n[l>>2]|0)+8>>2]|0}function eUe(s,l){s=s|0,l=l|0;var c=0,f=0;return c=C,C=C+16|0,f=c,$a(f),s=ys(s)|0,l=tUe(s,n[l>>2]|0)|0,el(f),C=c,l|0}function $a(s){s=s|0,n[s>>2]=n[2701],n[s+4>>2]=n[2703]}function tUe(s,l){s=s|0,l=l|0;var c=0;return c=jo(rUe()|0)|0,un(0,c|0,s|0,zR(l)|0)|0}function el(s){s=s|0,w7(n[s>>2]|0,n[s+4>>2]|0)}function rUe(){var s=0;return o[8096]|0||(nUe(11120),s=8096,n[s>>2]=1,n[s+4>>2]=0),11120}function nUe(s){s=s|0,ao(s,iUe()|0,1)}function iUe(){return 1948}function sUe(){oUe()}function oUe(){var s=0,l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0;if(Oe=C,C=C+16|0,O=Oe+4|0,j=Oe,Ro(65536,10804,n[2702]|0,10812),c=n7()|0,l=n[c>>2]|0,s=n[l>>2]|0,s|0)for(f=n[c+8>>2]|0,c=n[c+4>>2]|0;du(s|0,u[c>>0]|0|0,o[f>>0]|0),l=l+4|0,s=n[l>>2]|0,s;)f=f+1|0,c=c+1|0;if(s=i7()|0,l=n[s>>2]|0,l|0)do QA(l|0,n[s+4>>2]|0),s=s+8|0,l=n[s>>2]|0;while(l|0);QA(aUe()|0,5167),M=$d()|0,s=n[M>>2]|0;e:do if(s|0){do lUe(n[s+4>>2]|0),s=n[s>>2]|0;while(s|0);if(s=n[M>>2]|0,s|0){F=M;do{for(;d=s,s=n[s>>2]|0,d=n[d+4>>2]|0,!!(cUe(d)|0);)if(n[j>>2]=F,n[O>>2]=n[j>>2],uUe(M,O)|0,!s)break e;if(AUe(d),F=n[F>>2]|0,l=T7(d)|0,m=Bi()|0,B=C,C=C+((1*(l<<2)|0)+15&-16)|0,k=C,C=C+((1*(l<<2)|0)+15&-16)|0,l=n[(d7(d)|0)>>2]|0,l|0)for(c=B,f=k;n[c>>2]=n[(em(n[l+4>>2]|0)|0)>>2],n[f>>2]=n[l+8>>2],l=n[l>>2]|0,l;)c=c+4|0,f=f+4|0;Qe=em(d)|0,l=fUe(d)|0,c=T7(d)|0,f=pUe(d)|0,Il(Qe|0,l|0,B|0,k|0,c|0,f|0,GR(d)|0),kA(m|0)}while(s|0)}}while(!1);if(s=n[(WR()|0)>>2]|0,s|0)do Qe=s+4|0,M=YR(Qe)|0,d=tw(M)|0,m=$I(M)|0,B=(ew(M)|0)+1|0,k=UD(M)|0,F=L7(Qe)|0,M=Nr(M)|0,O=ND(Qe)|0,j=iT(Qe)|0,mc(0,d|0,m|0,B|0,k|0,F|0,M|0,O|0,j|0,sT(Qe)|0),s=n[s>>2]|0;while(s|0);s=n[($d()|0)>>2]|0;e:do if(s|0){t:for(;;){if(l=n[s+4>>2]|0,l|0&&(oe=n[(em(l)|0)>>2]|0,We=n[(m7(l)|0)>>2]|0,We|0)){c=We;do{l=c+4|0,f=YR(l)|0;r:do if(f|0)switch(Nr(f)|0){case 0:break t;case 4:case 3:case 2:{k=tw(f)|0,F=$I(f)|0,M=(ew(f)|0)+1|0,O=UD(f)|0,j=Nr(f)|0,Qe=ND(l)|0,mc(oe|0,k|0,F|0,M|0,O|0,0,j|0,Qe|0,iT(l)|0,sT(l)|0);break r}case 1:{B=tw(f)|0,k=$I(f)|0,F=(ew(f)|0)+1|0,M=UD(f)|0,O=L7(l)|0,j=Nr(f)|0,Qe=ND(l)|0,mc(oe|0,B|0,k|0,F|0,M|0,O|0,j|0,Qe|0,iT(l)|0,sT(l)|0);break r}case 5:{M=tw(f)|0,O=$I(f)|0,j=(ew(f)|0)+1|0,Qe=UD(f)|0,mc(oe|0,M|0,O|0,j|0,Qe|0,hUe(f)|0,Nr(f)|0,0,0,0);break r}default:break r}while(!1);c=n[c>>2]|0}while(c|0)}if(s=n[s>>2]|0,!s)break e}Tt()}while(!1);we(),C=Oe}function aUe(){return 11703}function lUe(s){s=s|0,o[s+40>>0]=0}function cUe(s){return s=s|0,(o[s+40>>0]|0)!=0|0}function uUe(s,l){return s=s|0,l=l|0,l=gUe(l)|0,s=n[l>>2]|0,n[l>>2]=n[s>>2],yt(s),n[l>>2]|0}function AUe(s){s=s|0,o[s+40>>0]=1}function T7(s){return s=s|0,n[s+20>>2]|0}function fUe(s){return s=s|0,n[s+8>>2]|0}function pUe(s){return s=s|0,n[s+32>>2]|0}function UD(s){return s=s|0,n[s+4>>2]|0}function L7(s){return s=s|0,n[s+4>>2]|0}function iT(s){return s=s|0,n[s+8>>2]|0}function sT(s){return s=s|0,n[s+16>>2]|0}function hUe(s){return s=s|0,n[s+20>>2]|0}function gUe(s){return s=s|0,n[s>>2]|0}function _D(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0;Nt=C,C=C+16|0,oe=Nt;do if(s>>>0<245){if(M=s>>>0<11?16:s+11&-8,s=M>>>3,j=n[2783]|0,c=j>>>s,c&3|0)return l=(c&1^1)+s|0,s=11172+(l<<1<<2)|0,c=s+8|0,f=n[c>>2]|0,d=f+8|0,m=n[d>>2]|0,(s|0)==(m|0)?n[2783]=j&~(1<>2]=s,n[c>>2]=m),Ge=l<<3,n[f+4>>2]=Ge|3,Ge=f+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1,Ge=d,C=Nt,Ge|0;if(O=n[2785]|0,M>>>0>O>>>0){if(c|0)return l=2<>>12&16,l=l>>>B,c=l>>>5&8,l=l>>>c,d=l>>>2&4,l=l>>>d,s=l>>>1&2,l=l>>>s,f=l>>>1&1,f=(c|B|d|s|f)+(l>>>f)|0,l=11172+(f<<1<<2)|0,s=l+8|0,d=n[s>>2]|0,B=d+8|0,c=n[B>>2]|0,(l|0)==(c|0)?(s=j&~(1<>2]=l,n[s>>2]=c,s=j),m=(f<<3)-M|0,n[d+4>>2]=M|3,f=d+M|0,n[f+4>>2]=m|1,n[f+m>>2]=m,O|0&&(d=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=d,n[l+12>>2]=d,n[d+8>>2]=l,n[d+12>>2]=c),n[2785]=m,n[2788]=f,Ge=B,C=Nt,Ge|0;if(k=n[2784]|0,k){if(c=(k&0-k)+-1|0,B=c>>>12&16,c=c>>>B,m=c>>>5&8,c=c>>>m,F=c>>>2&4,c=c>>>F,f=c>>>1&2,c=c>>>f,s=c>>>1&1,s=n[11436+((m|B|F|f|s)+(c>>>s)<<2)>>2]|0,c=(n[s+4>>2]&-8)-M|0,f=n[s+16+(((n[s+16>>2]|0)==0&1)<<2)>>2]|0,!f)F=s,m=c;else{do B=(n[f+4>>2]&-8)-M|0,F=B>>>0>>0,c=F?B:c,s=F?f:s,f=n[f+16+(((n[f+16>>2]|0)==0&1)<<2)>>2]|0;while(f|0);F=s,m=c}if(B=F+M|0,F>>>0>>0){d=n[F+24>>2]|0,l=n[F+12>>2]|0;do if((l|0)==(F|0)){if(s=F+20|0,l=n[s>>2]|0,!l&&(s=F+16|0,l=n[s>>2]|0,!l)){c=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0,c=l}else c=n[F+8>>2]|0,n[c+12>>2]=l,n[l+8>>2]=c,c=l;while(!1);do if(d|0){if(l=n[F+28>>2]|0,s=11436+(l<<2)|0,(F|0)==(n[s>>2]|0)){if(n[s>>2]=c,!c){n[2784]=k&~(1<>2]|0)!=(F|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=d,l=n[F+16>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),l=n[F+20>>2]|0,l|0&&(n[c+20>>2]=l,n[l+24>>2]=c)}while(!1);return m>>>0<16?(Ge=m+M|0,n[F+4>>2]=Ge|3,Ge=F+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1):(n[F+4>>2]=M|3,n[B+4>>2]=m|1,n[B+m>>2]=m,O|0&&(f=n[2788]|0,l=O>>>3,c=11172+(l<<1<<2)|0,l=1<>2]|0):(n[2783]=j|l,l=c,s=c+8|0),n[s>>2]=f,n[l+12>>2]=f,n[f+8>>2]=l,n[f+12>>2]=c),n[2785]=m,n[2788]=B),Ge=F+8|0,C=Nt,Ge|0}else j=M}else j=M}else j=M}else if(s>>>0<=4294967231)if(s=s+11|0,M=s&-8,F=n[2784]|0,F){f=0-M|0,s=s>>>8,s?M>>>0>16777215?k=31:(j=(s+1048320|0)>>>16&8,_e=s<>>16&4,_e=_e<>>16&2,k=14-(O|j|k)+(_e<>>15)|0,k=M>>>(k+7|0)&1|k<<1):k=0,c=n[11436+(k<<2)>>2]|0;e:do if(!c)c=0,s=0,_e=57;else for(s=0,B=M<<((k|0)==31?0:25-(k>>>1)|0),m=0;;){if(d=(n[c+4>>2]&-8)-M|0,d>>>0>>0)if(d)s=c,f=d;else{s=c,f=0,d=c,_e=61;break e}if(d=n[c+20>>2]|0,c=n[c+16+(B>>>31<<2)>>2]|0,m=(d|0)==0|(d|0)==(c|0)?m:d,d=(c|0)==0,d){c=m,_e=57;break}else B=B<<((d^1)&1)}while(!1);if((_e|0)==57){if((c|0)==0&(s|0)==0){if(s=2<>>12&16,j=j>>>B,m=j>>>5&8,j=j>>>m,k=j>>>2&4,j=j>>>k,O=j>>>1&2,j=j>>>O,c=j>>>1&1,s=0,c=n[11436+((m|B|k|O|c)+(j>>>c)<<2)>>2]|0}c?(d=c,_e=61):(k=s,B=f)}if((_e|0)==61)for(;;)if(_e=0,c=(n[d+4>>2]&-8)-M|0,j=c>>>0>>0,c=j?c:f,s=j?d:s,d=n[d+16+(((n[d+16>>2]|0)==0&1)<<2)>>2]|0,d)f=c,_e=61;else{k=s,B=c;break}if(k|0&&B>>>0<((n[2785]|0)-M|0)>>>0){if(m=k+M|0,k>>>0>=m>>>0)return Ge=0,C=Nt,Ge|0;d=n[k+24>>2]|0,l=n[k+12>>2]|0;do if((l|0)==(k|0)){if(s=k+20|0,l=n[s>>2]|0,!l&&(s=k+16|0,l=n[s>>2]|0,!l)){l=0;break}for(;;){if(c=l+20|0,f=n[c>>2]|0,f|0){l=f,s=c;continue}if(c=l+16|0,f=n[c>>2]|0,f)l=f,s=c;else break}n[s>>2]=0}else Ge=n[k+8>>2]|0,n[Ge+12>>2]=l,n[l+8>>2]=Ge;while(!1);do if(d){if(s=n[k+28>>2]|0,c=11436+(s<<2)|0,(k|0)==(n[c>>2]|0)){if(n[c>>2]=l,!l){f=F&~(1<>2]|0)!=(k|0)&1)<<2)>>2]=l,!l){f=F;break}n[l+24>>2]=d,s=n[k+16>>2]|0,s|0&&(n[l+16>>2]=s,n[s+24>>2]=l),s=n[k+20>>2]|0,s&&(n[l+20>>2]=s,n[s+24>>2]=l),f=F}else f=F;while(!1);do if(B>>>0>=16){if(n[k+4>>2]=M|3,n[m+4>>2]=B|1,n[m+B>>2]=B,l=B>>>3,B>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=m,n[l+12>>2]=m,n[m+8>>2]=l,n[m+12>>2]=c;break}if(l=B>>>8,l?B>>>0>16777215?l=31:(_e=(l+1048320|0)>>>16&8,Ge=l<<_e,ct=(Ge+520192|0)>>>16&4,Ge=Ge<>>16&2,l=14-(ct|_e|l)+(Ge<>>15)|0,l=B>>>(l+7|0)&1|l<<1):l=0,c=11436+(l<<2)|0,n[m+28>>2]=l,s=m+16|0,n[s+4>>2]=0,n[s>>2]=0,s=1<>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}for(s=B<<((l|0)==31?0:25-(l>>>1)|0),c=n[c>>2]|0;;){if((n[c+4>>2]&-8|0)==(B|0)){_e=97;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=96;break}}if((_e|0)==96){n[f>>2]=m,n[m+24>>2]=c,n[m+12>>2]=m,n[m+8>>2]=m;break}else if((_e|0)==97){_e=c+8|0,Ge=n[_e>>2]|0,n[Ge+12>>2]=m,n[_e>>2]=m,n[m+8>>2]=Ge,n[m+12>>2]=c,n[m+24>>2]=0;break}}else Ge=B+M|0,n[k+4>>2]=Ge|3,Ge=k+Ge+4|0,n[Ge>>2]=n[Ge>>2]|1;while(!1);return Ge=k+8|0,C=Nt,Ge|0}else j=M}else j=M;else j=-1;while(!1);if(c=n[2785]|0,c>>>0>=j>>>0)return l=c-j|0,s=n[2788]|0,l>>>0>15?(Ge=s+j|0,n[2788]=Ge,n[2785]=l,n[Ge+4>>2]=l|1,n[Ge+l>>2]=l,n[s+4>>2]=j|3):(n[2785]=0,n[2788]=0,n[s+4>>2]=c|3,Ge=s+c+4|0,n[Ge>>2]=n[Ge>>2]|1),Ge=s+8|0,C=Nt,Ge|0;if(B=n[2786]|0,B>>>0>j>>>0)return ct=B-j|0,n[2786]=ct,Ge=n[2789]|0,_e=Ge+j|0,n[2789]=_e,n[_e+4>>2]=ct|1,n[Ge+4>>2]=j|3,Ge=Ge+8|0,C=Nt,Ge|0;if(n[2901]|0?s=n[2903]|0:(n[2903]=4096,n[2902]=4096,n[2904]=-1,n[2905]=-1,n[2906]=0,n[2894]=0,s=oe&-16^1431655768,n[oe>>2]=s,n[2901]=s,s=4096),k=j+48|0,F=j+47|0,m=s+F|0,d=0-s|0,M=m&d,M>>>0<=j>>>0||(s=n[2893]|0,s|0&&(O=n[2891]|0,oe=O+M|0,oe>>>0<=O>>>0|oe>>>0>s>>>0)))return Ge=0,C=Nt,Ge|0;e:do if(n[2894]&4)l=0,_e=133;else{c=n[2789]|0;t:do if(c){for(f=11580;s=n[f>>2]|0,!(s>>>0<=c>>>0&&(Qe=f+4|0,(s+(n[Qe>>2]|0)|0)>>>0>c>>>0));)if(s=n[f+8>>2]|0,s)f=s;else{_e=118;break t}if(l=m-B&d,l>>>0<2147483647)if(s=Tp(l|0)|0,(s|0)==((n[f>>2]|0)+(n[Qe>>2]|0)|0)){if((s|0)!=-1){B=l,m=s,_e=135;break e}}else f=s,_e=126;else l=0}else _e=118;while(!1);do if((_e|0)==118)if(c=Tp(0)|0,(c|0)!=-1&&(l=c,We=n[2902]|0,Oe=We+-1|0,l=(Oe&l|0?(Oe+l&0-We)-l|0:0)+M|0,We=n[2891]|0,Oe=l+We|0,l>>>0>j>>>0&l>>>0<2147483647)){if(Qe=n[2893]|0,Qe|0&&Oe>>>0<=We>>>0|Oe>>>0>Qe>>>0){l=0;break}if(s=Tp(l|0)|0,(s|0)==(c|0)){B=l,m=c,_e=135;break e}else f=s,_e=126}else l=0;while(!1);do if((_e|0)==126){if(c=0-l|0,!(k>>>0>l>>>0&(l>>>0<2147483647&(f|0)!=-1)))if((f|0)==-1){l=0;break}else{B=l,m=f,_e=135;break e}if(s=n[2903]|0,s=F-l+s&0-s,s>>>0>=2147483647){B=l,m=f,_e=135;break e}if((Tp(s|0)|0)==-1){Tp(c|0)|0,l=0;break}else{B=s+l|0,m=f,_e=135;break e}}while(!1);n[2894]=n[2894]|4,_e=133}while(!1);if((_e|0)==133&&M>>>0<2147483647&&(ct=Tp(M|0)|0,Qe=Tp(0)|0,rt=Qe-ct|0,Xe=rt>>>0>(j+40|0)>>>0,!((ct|0)==-1|Xe^1|ct>>>0>>0&((ct|0)!=-1&(Qe|0)!=-1)^1))&&(B=Xe?rt:l,m=ct,_e=135),(_e|0)==135){l=(n[2891]|0)+B|0,n[2891]=l,l>>>0>(n[2892]|0)>>>0&&(n[2892]=l),F=n[2789]|0;do if(F){for(l=11580;;){if(s=n[l>>2]|0,c=l+4|0,f=n[c>>2]|0,(m|0)==(s+f|0)){_e=145;break}if(d=n[l+8>>2]|0,d)l=d;else break}if((_e|0)==145&&!(n[l+12>>2]&8|0)&&F>>>0>>0&F>>>0>=s>>>0){n[c>>2]=f+B,Ge=F+8|0,Ge=Ge&7|0?0-Ge&7:0,_e=F+Ge|0,Ge=(n[2786]|0)+(B-Ge)|0,n[2789]=_e,n[2786]=Ge,n[_e+4>>2]=Ge|1,n[_e+Ge+4>>2]=40,n[2790]=n[2905];break}for(m>>>0<(n[2787]|0)>>>0&&(n[2787]=m),c=m+B|0,l=11580;;){if((n[l>>2]|0)==(c|0)){_e=153;break}if(s=n[l+8>>2]|0,s)l=s;else break}if((_e|0)==153&&!(n[l+12>>2]&8|0)){n[l>>2]=m,O=l+4|0,n[O>>2]=(n[O>>2]|0)+B,O=m+8|0,O=m+(O&7|0?0-O&7:0)|0,l=c+8|0,l=c+(l&7|0?0-l&7:0)|0,M=O+j|0,k=l-O-j|0,n[O+4>>2]=j|3;do if((l|0)!=(F|0)){if((l|0)==(n[2788]|0)){Ge=(n[2785]|0)+k|0,n[2785]=Ge,n[2788]=M,n[M+4>>2]=Ge|1,n[M+Ge>>2]=Ge;break}if(s=n[l+4>>2]|0,(s&3|0)==1){B=s&-8,f=s>>>3;e:do if(s>>>0<256)if(s=n[l+8>>2]|0,c=n[l+12>>2]|0,(c|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=c,n[c+8>>2]=s;break}else{m=n[l+24>>2]|0,s=n[l+12>>2]|0;do if((s|0)==(l|0)){if(f=l+16|0,c=f+4|0,s=n[c>>2]|0,!s)if(s=n[f>>2]|0,s)c=f;else{s=0;break}for(;;){if(f=s+20|0,d=n[f>>2]|0,d|0){s=d,c=f;continue}if(f=s+16|0,d=n[f>>2]|0,d)s=d,c=f;else break}n[c>>2]=0}else Ge=n[l+8>>2]|0,n[Ge+12>>2]=s,n[s+8>>2]=Ge;while(!1);if(!m)break;c=n[l+28>>2]|0,f=11436+(c<<2)|0;do if((l|0)!=(n[f>>2]|0)){if(n[m+16+(((n[m+16>>2]|0)!=(l|0)&1)<<2)>>2]=s,!s)break e}else{if(n[f>>2]=s,s|0)break;n[2784]=n[2784]&~(1<>2]=m,c=l+16|0,f=n[c>>2]|0,f|0&&(n[s+16>>2]=f,n[f+24>>2]=s),c=n[c+4>>2]|0,!c)break;n[s+20>>2]=c,n[c+24>>2]=s}while(!1);l=l+B|0,d=B+k|0}else d=k;if(l=l+4|0,n[l>>2]=n[l>>2]&-2,n[M+4>>2]=d|1,n[M+d>>2]=d,l=d>>>3,d>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=M,n[l+12>>2]=M,n[M+8>>2]=l,n[M+12>>2]=c;break}l=d>>>8;do if(!l)l=0;else{if(d>>>0>16777215){l=31;break}_e=(l+1048320|0)>>>16&8,Ge=l<<_e,ct=(Ge+520192|0)>>>16&4,Ge=Ge<>>16&2,l=14-(ct|_e|l)+(Ge<>>15)|0,l=d>>>(l+7|0)&1|l<<1}while(!1);if(f=11436+(l<<2)|0,n[M+28>>2]=l,s=M+16|0,n[s+4>>2]=0,n[s>>2]=0,s=n[2784]|0,c=1<>2]=M,n[M+24>>2]=f,n[M+12>>2]=M,n[M+8>>2]=M;break}for(s=d<<((l|0)==31?0:25-(l>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){_e=194;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=193;break}}if((_e|0)==193){n[f>>2]=M,n[M+24>>2]=c,n[M+12>>2]=M,n[M+8>>2]=M;break}else if((_e|0)==194){_e=c+8|0,Ge=n[_e>>2]|0,n[Ge+12>>2]=M,n[_e>>2]=M,n[M+8>>2]=Ge,n[M+12>>2]=c,n[M+24>>2]=0;break}}else Ge=(n[2786]|0)+k|0,n[2786]=Ge,n[2789]=M,n[M+4>>2]=Ge|1;while(!1);return Ge=O+8|0,C=Nt,Ge|0}for(l=11580;s=n[l>>2]|0,!(s>>>0<=F>>>0&&(Ge=s+(n[l+4>>2]|0)|0,Ge>>>0>F>>>0));)l=n[l+8>>2]|0;d=Ge+-47|0,s=d+8|0,s=d+(s&7|0?0-s&7:0)|0,d=F+16|0,s=s>>>0>>0?F:s,l=s+8|0,c=m+8|0,c=c&7|0?0-c&7:0,_e=m+c|0,c=B+-40-c|0,n[2789]=_e,n[2786]=c,n[_e+4>>2]=c|1,n[_e+c+4>>2]=40,n[2790]=n[2905],c=s+4|0,n[c>>2]=27,n[l>>2]=n[2895],n[l+4>>2]=n[2896],n[l+8>>2]=n[2897],n[l+12>>2]=n[2898],n[2895]=m,n[2896]=B,n[2898]=0,n[2897]=l,l=s+24|0;do _e=l,l=l+4|0,n[l>>2]=7;while((_e+8|0)>>>0>>0);if((s|0)!=(F|0)){if(m=s-F|0,n[c>>2]=n[c>>2]&-2,n[F+4>>2]=m|1,n[s>>2]=m,l=m>>>3,m>>>0<256){c=11172+(l<<1<<2)|0,s=n[2783]|0,l=1<>2]|0):(n[2783]=s|l,l=c,s=c+8|0),n[s>>2]=F,n[l+12>>2]=F,n[F+8>>2]=l,n[F+12>>2]=c;break}if(l=m>>>8,l?m>>>0>16777215?c=31:(_e=(l+1048320|0)>>>16&8,Ge=l<<_e,ct=(Ge+520192|0)>>>16&4,Ge=Ge<>>16&2,c=14-(ct|_e|c)+(Ge<>>15)|0,c=m>>>(c+7|0)&1|c<<1):c=0,f=11436+(c<<2)|0,n[F+28>>2]=c,n[F+20>>2]=0,n[d>>2]=0,l=n[2784]|0,s=1<>2]=F,n[F+24>>2]=f,n[F+12>>2]=F,n[F+8>>2]=F;break}for(s=m<<((c|0)==31?0:25-(c>>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(m|0)){_e=216;break}if(f=c+16+(s>>>31<<2)|0,l=n[f>>2]|0,l)s=s<<1,c=l;else{_e=215;break}}if((_e|0)==215){n[f>>2]=F,n[F+24>>2]=c,n[F+12>>2]=F,n[F+8>>2]=F;break}else if((_e|0)==216){_e=c+8|0,Ge=n[_e>>2]|0,n[Ge+12>>2]=F,n[_e>>2]=F,n[F+8>>2]=Ge,n[F+12>>2]=c,n[F+24>>2]=0;break}}}else{Ge=n[2787]|0,(Ge|0)==0|m>>>0>>0&&(n[2787]=m),n[2895]=m,n[2896]=B,n[2898]=0,n[2792]=n[2901],n[2791]=-1,l=0;do Ge=11172+(l<<1<<2)|0,n[Ge+12>>2]=Ge,n[Ge+8>>2]=Ge,l=l+1|0;while((l|0)!=32);Ge=m+8|0,Ge=Ge&7|0?0-Ge&7:0,_e=m+Ge|0,Ge=B+-40-Ge|0,n[2789]=_e,n[2786]=Ge,n[_e+4>>2]=Ge|1,n[_e+Ge+4>>2]=40,n[2790]=n[2905]}while(!1);if(l=n[2786]|0,l>>>0>j>>>0)return ct=l-j|0,n[2786]=ct,Ge=n[2789]|0,_e=Ge+j|0,n[2789]=_e,n[_e+4>>2]=ct|1,n[Ge+4>>2]=j|3,Ge=Ge+8|0,C=Nt,Ge|0}return n[(rm()|0)>>2]=12,Ge=0,C=Nt,Ge|0}function HD(s){s=s|0;var l=0,c=0,f=0,d=0,m=0,B=0,k=0,F=0;if(s){c=s+-8|0,d=n[2787]|0,s=n[s+-4>>2]|0,l=s&-8,F=c+l|0;do if(s&1)k=c,B=c;else{if(f=n[c>>2]|0,!(s&3)||(B=c+(0-f)|0,m=f+l|0,B>>>0>>0))return;if((B|0)==(n[2788]|0)){if(s=F+4|0,l=n[s>>2]|0,(l&3|0)!=3){k=B,l=m;break}n[2785]=m,n[s>>2]=l&-2,n[B+4>>2]=m|1,n[B+m>>2]=m;return}if(c=f>>>3,f>>>0<256)if(s=n[B+8>>2]|0,l=n[B+12>>2]|0,(l|0)==(s|0)){n[2783]=n[2783]&~(1<>2]=l,n[l+8>>2]=s,k=B,l=m;break}d=n[B+24>>2]|0,s=n[B+12>>2]|0;do if((s|0)==(B|0)){if(c=B+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{s=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0}else k=n[B+8>>2]|0,n[k+12>>2]=s,n[s+8>>2]=k;while(!1);if(d){if(l=n[B+28>>2]|0,c=11436+(l<<2)|0,(B|0)==(n[c>>2]|0)){if(n[c>>2]=s,!s){n[2784]=n[2784]&~(1<>2]|0)!=(B|0)&1)<<2)>>2]=s,!s){k=B,l=m;break}n[s+24>>2]=d,l=B+16|0,c=n[l>>2]|0,c|0&&(n[s+16>>2]=c,n[c+24>>2]=s),l=n[l+4>>2]|0,l?(n[s+20>>2]=l,n[l+24>>2]=s,k=B,l=m):(k=B,l=m)}else k=B,l=m}while(!1);if(!(B>>>0>=F>>>0)&&(s=F+4|0,f=n[s>>2]|0,!!(f&1))){if(f&2)n[s>>2]=f&-2,n[k+4>>2]=l|1,n[B+l>>2]=l,d=l;else{if(s=n[2788]|0,(F|0)==(n[2789]|0)){if(F=(n[2786]|0)+l|0,n[2786]=F,n[2789]=k,n[k+4>>2]=F|1,(k|0)!=(s|0))return;n[2788]=0,n[2785]=0;return}if((F|0)==(s|0)){F=(n[2785]|0)+l|0,n[2785]=F,n[2788]=B,n[k+4>>2]=F|1,n[B+F>>2]=F;return}d=(f&-8)+l|0,c=f>>>3;do if(f>>>0<256)if(l=n[F+8>>2]|0,s=n[F+12>>2]|0,(s|0)==(l|0)){n[2783]=n[2783]&~(1<>2]=s,n[s+8>>2]=l;break}else{m=n[F+24>>2]|0,s=n[F+12>>2]|0;do if((s|0)==(F|0)){if(c=F+16|0,l=c+4|0,s=n[l>>2]|0,!s)if(s=n[c>>2]|0,s)l=c;else{c=0;break}for(;;){if(c=s+20|0,f=n[c>>2]|0,f|0){s=f,l=c;continue}if(c=s+16|0,f=n[c>>2]|0,f)s=f,l=c;else break}n[l>>2]=0,c=s}else c=n[F+8>>2]|0,n[c+12>>2]=s,n[s+8>>2]=c,c=s;while(!1);if(m|0){if(s=n[F+28>>2]|0,l=11436+(s<<2)|0,(F|0)==(n[l>>2]|0)){if(n[l>>2]=c,!c){n[2784]=n[2784]&~(1<>2]|0)!=(F|0)&1)<<2)>>2]=c,!c)break;n[c+24>>2]=m,s=F+16|0,l=n[s>>2]|0,l|0&&(n[c+16>>2]=l,n[l+24>>2]=c),s=n[s+4>>2]|0,s|0&&(n[c+20>>2]=s,n[s+24>>2]=c)}}while(!1);if(n[k+4>>2]=d|1,n[B+d>>2]=d,(k|0)==(n[2788]|0)){n[2785]=d;return}}if(s=d>>>3,d>>>0<256){c=11172+(s<<1<<2)|0,l=n[2783]|0,s=1<>2]|0):(n[2783]=l|s,s=c,l=c+8|0),n[l>>2]=k,n[s+12>>2]=k,n[k+8>>2]=s,n[k+12>>2]=c;return}s=d>>>8,s?d>>>0>16777215?s=31:(B=(s+1048320|0)>>>16&8,F=s<>>16&4,F=F<>>16&2,s=14-(m|B|s)+(F<>>15)|0,s=d>>>(s+7|0)&1|s<<1):s=0,f=11436+(s<<2)|0,n[k+28>>2]=s,n[k+20>>2]=0,n[k+16>>2]=0,l=n[2784]|0,c=1<>>1)|0),c=n[f>>2]|0;;){if((n[c+4>>2]&-8|0)==(d|0)){s=73;break}if(f=c+16+(l>>>31<<2)|0,s=n[f>>2]|0,s)l=l<<1,c=s;else{s=72;break}}if((s|0)==72){n[f>>2]=k,n[k+24>>2]=c,n[k+12>>2]=k,n[k+8>>2]=k;break}else if((s|0)==73){B=c+8|0,F=n[B>>2]|0,n[F+12>>2]=k,n[B>>2]=k,n[k+8>>2]=F,n[k+12>>2]=c,n[k+24>>2]=0;break}}else n[2784]=l|c,n[f>>2]=k,n[k+24>>2]=f,n[k+12>>2]=k,n[k+8>>2]=k;while(!1);if(F=(n[2791]|0)+-1|0,n[2791]=F,!F)s=11588;else return;for(;s=n[s>>2]|0,s;)s=s+8|0;n[2791]=-1}}}function dUe(){return 11628}function mUe(s){s=s|0;var l=0,c=0;return l=C,C=C+16|0,c=l,n[c>>2]=CUe(n[s+60>>2]|0)|0,s=qD(Ec(6,c|0)|0)|0,C=l,s|0}function N7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0;j=C,C=C+48|0,M=j+16|0,m=j,d=j+32|0,k=s+28|0,f=n[k>>2]|0,n[d>>2]=f,F=s+20|0,f=(n[F>>2]|0)-f|0,n[d+4>>2]=f,n[d+8>>2]=l,n[d+12>>2]=c,f=f+c|0,B=s+60|0,n[m>>2]=n[B>>2],n[m+4>>2]=d,n[m+8>>2]=2,m=qD(aa(146,m|0)|0)|0;e:do if((f|0)!=(m|0)){for(l=2;!((m|0)<0);)if(f=f-m|0,We=n[d+4>>2]|0,oe=m>>>0>We>>>0,d=oe?d+8|0:d,l=(oe<<31>>31)+l|0,We=m-(oe?We:0)|0,n[d>>2]=(n[d>>2]|0)+We,oe=d+4|0,n[oe>>2]=(n[oe>>2]|0)-We,n[M>>2]=n[B>>2],n[M+4>>2]=d,n[M+8>>2]=l,m=qD(aa(146,M|0)|0)|0,(f|0)==(m|0)){O=3;break e}n[s+16>>2]=0,n[k>>2]=0,n[F>>2]=0,n[s>>2]=n[s>>2]|32,(l|0)==2?c=0:c=c-(n[d+4>>2]|0)|0}else O=3;while(!1);return(O|0)==3&&(We=n[s+44>>2]|0,n[s+16>>2]=We+(n[s+48>>2]|0),n[k>>2]=We,n[F>>2]=We),C=j,c|0}function yUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;return d=C,C=C+32|0,m=d,f=d+20|0,n[m>>2]=n[s+60>>2],n[m+4>>2]=0,n[m+8>>2]=l,n[m+12>>2]=f,n[m+16>>2]=c,(qD(oa(140,m|0)|0)|0)<0?(n[f>>2]=-1,s=-1):s=n[f>>2]|0,C=d,s|0}function qD(s){return s=s|0,s>>>0>4294963200&&(n[(rm()|0)>>2]=0-s,s=-1),s|0}function rm(){return(EUe()|0)+64|0}function EUe(){return oT()|0}function oT(){return 2084}function CUe(s){return s=s|0,s|0}function IUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;return d=C,C=C+32|0,f=d,n[s+36>>2]=1,!(n[s>>2]&64|0)&&(n[f>>2]=n[s+60>>2],n[f+4>>2]=21523,n[f+8>>2]=d+16,Ls(54,f|0)|0)&&(o[s+75>>0]=-1),f=N7(s,l,c)|0,C=d,f|0}function O7(s,l){s=s|0,l=l|0;var c=0,f=0;if(c=o[s>>0]|0,f=o[l>>0]|0,!(c<<24>>24)||c<<24>>24!=f<<24>>24)s=f;else{do s=s+1|0,l=l+1|0,c=o[s>>0]|0,f=o[l>>0]|0;while(!(!(c<<24>>24)||c<<24>>24!=f<<24>>24));s=f}return(c&255)-(s&255)|0}function wUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0;e:do if(!c)s=0;else{for(;f=o[s>>0]|0,d=o[l>>0]|0,f<<24>>24==d<<24>>24;)if(c=c+-1|0,c)s=s+1|0,l=l+1|0;else{s=0;break e}s=(f&255)-(d&255)|0}while(!1);return s|0}function M7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0;Qe=C,C=C+224|0,O=Qe+120|0,j=Qe+80|0,We=Qe,Oe=Qe+136|0,f=j,d=f+40|0;do n[f>>2]=0,f=f+4|0;while((f|0)<(d|0));return n[O>>2]=n[c>>2],(aT(0,l,O,We,j)|0)<0?c=-1:((n[s+76>>2]|0)>-1?oe=BUe(s)|0:oe=0,c=n[s>>2]|0,M=c&32,(o[s+74>>0]|0)<1&&(n[s>>2]=c&-33),f=s+48|0,n[f>>2]|0?c=aT(s,l,O,We,j)|0:(d=s+44|0,m=n[d>>2]|0,n[d>>2]=Oe,B=s+28|0,n[B>>2]=Oe,k=s+20|0,n[k>>2]=Oe,n[f>>2]=80,F=s+16|0,n[F>>2]=Oe+80,c=aT(s,l,O,We,j)|0,m&&(YD[n[s+36>>2]&7](s,0,0)|0,c=n[k>>2]|0?c:-1,n[d>>2]=m,n[f>>2]=0,n[F>>2]=0,n[B>>2]=0,n[k>>2]=0)),f=n[s>>2]|0,n[s>>2]=f|M,oe|0&&vUe(s),c=f&32|0?-1:c),C=Qe,c|0}function aT(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0;lr=C,C=C+64|0,ur=lr+16|0,Zt=lr,Nt=lr+24|0,kr=lr+8|0,Or=lr+20|0,n[ur>>2]=l,ct=(s|0)!=0,_e=Nt+40|0,Ge=_e,Nt=Nt+39|0,_r=kr+4|0,B=0,m=0,O=0;e:for(;;){do if((m|0)>-1)if((B|0)>(2147483647-m|0)){n[(rm()|0)>>2]=75,m=-1;break}else{m=B+m|0;break}while(!1);if(B=o[l>>0]|0,B<<24>>24)k=l;else{Xe=87;break}t:for(;;){switch(B<<24>>24){case 37:{B=k,Xe=9;break t}case 0:{B=k;break t}default:}rt=k+1|0,n[ur>>2]=rt,B=o[rt>>0]|0,k=rt}t:do if((Xe|0)==9)for(;;){if(Xe=0,(o[k+1>>0]|0)!=37)break t;if(B=B+1|0,k=k+2|0,n[ur>>2]=k,(o[k>>0]|0)==37)Xe=9;else break}while(!1);if(B=B-l|0,ct&&os(s,l,B),B|0){l=k;continue}F=k+1|0,B=(o[F>>0]|0)+-48|0,B>>>0<10?(rt=(o[k+2>>0]|0)==36,Qe=rt?B:-1,O=rt?1:O,F=rt?k+3|0:F):Qe=-1,n[ur>>2]=F,B=o[F>>0]|0,k=(B<<24>>24)+-32|0;t:do if(k>>>0<32)for(M=0,j=B;;){if(B=1<>2]=F,B=o[F>>0]|0,k=(B<<24>>24)+-32|0,k>>>0>=32)break;j=B}else M=0;while(!1);if(B<<24>>24==42){if(k=F+1|0,B=(o[k>>0]|0)+-48|0,B>>>0<10&&(o[F+2>>0]|0)==36)n[d+(B<<2)>>2]=10,B=n[f+((o[k>>0]|0)+-48<<3)>>2]|0,O=1,F=F+3|0;else{if(O|0){m=-1;break}ct?(O=(n[c>>2]|0)+3&-4,B=n[O>>2]|0,n[c>>2]=O+4,O=0,F=k):(B=0,O=0,F=k)}n[ur>>2]=F,rt=(B|0)<0,B=rt?0-B|0:B,M=rt?M|8192:M}else{if(B=U7(ur)|0,(B|0)<0){m=-1;break}F=n[ur>>2]|0}do if((o[F>>0]|0)==46){if((o[F+1>>0]|0)!=42){n[ur>>2]=F+1,k=U7(ur)|0,F=n[ur>>2]|0;break}if(j=F+2|0,k=(o[j>>0]|0)+-48|0,k>>>0<10&&(o[F+3>>0]|0)==36){n[d+(k<<2)>>2]=10,k=n[f+((o[j>>0]|0)+-48<<3)>>2]|0,F=F+4|0,n[ur>>2]=F;break}if(O|0){m=-1;break e}ct?(rt=(n[c>>2]|0)+3&-4,k=n[rt>>2]|0,n[c>>2]=rt+4):k=0,n[ur>>2]=j,F=j}else k=-1;while(!1);for(Oe=0;;){if(((o[F>>0]|0)+-65|0)>>>0>57){m=-1;break e}if(rt=F+1|0,n[ur>>2]=rt,j=o[(o[F>>0]|0)+-65+(5178+(Oe*58|0))>>0]|0,oe=j&255,(oe+-1|0)>>>0<8)Oe=oe,F=rt;else break}if(!(j<<24>>24)){m=-1;break}We=(Qe|0)>-1;do if(j<<24>>24==19)if(We){m=-1;break e}else Xe=49;else{if(We){n[d+(Qe<<2)>>2]=oe,We=f+(Qe<<3)|0,Qe=n[We+4>>2]|0,Xe=Zt,n[Xe>>2]=n[We>>2],n[Xe+4>>2]=Qe,Xe=49;break}if(!ct){m=0;break e}_7(Zt,oe,c)}while(!1);if((Xe|0)==49&&(Xe=0,!ct)){B=0,l=rt;continue}F=o[F>>0]|0,F=(Oe|0)!=0&(F&15|0)==3?F&-33:F,We=M&-65537,Qe=M&8192|0?We:M;t:do switch(F|0){case 110:switch((Oe&255)<<24>>24){case 0:{n[n[Zt>>2]>>2]=m,B=0,l=rt;continue e}case 1:{n[n[Zt>>2]>>2]=m,B=0,l=rt;continue e}case 2:{B=n[Zt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=rt;continue e}case 3:{a[n[Zt>>2]>>1]=m,B=0,l=rt;continue e}case 4:{o[n[Zt>>2]>>0]=m,B=0,l=rt;continue e}case 6:{n[n[Zt>>2]>>2]=m,B=0,l=rt;continue e}case 7:{B=n[Zt>>2]|0,n[B>>2]=m,n[B+4>>2]=((m|0)<0)<<31>>31,B=0,l=rt;continue e}default:{B=0,l=rt;continue e}}case 112:{F=120,k=k>>>0>8?k:8,l=Qe|8,Xe=61;break}case 88:case 120:{l=Qe,Xe=61;break}case 111:{F=Zt,l=n[F>>2]|0,F=n[F+4>>2]|0,oe=SUe(l,F,_e)|0,We=Ge-oe|0,M=0,j=5642,k=(Qe&8|0)==0|(k|0)>(We|0)?k:We+1|0,We=Qe,Xe=67;break}case 105:case 100:if(F=Zt,l=n[F>>2]|0,F=n[F+4>>2]|0,(F|0)<0){l=jD(0,0,l|0,F|0)|0,F=Ce,M=Zt,n[M>>2]=l,n[M+4>>2]=F,M=1,j=5642,Xe=66;break t}else{M=(Qe&2049|0)!=0&1,j=Qe&2048|0?5643:Qe&1|0?5644:5642,Xe=66;break t}case 117:{F=Zt,M=0,j=5642,l=n[F>>2]|0,F=n[F+4>>2]|0,Xe=66;break}case 99:{o[Nt>>0]=n[Zt>>2],l=Nt,M=0,j=5642,oe=_e,F=1,k=We;break}case 109:{F=PUe(n[(rm()|0)>>2]|0)|0,Xe=71;break}case 115:{F=n[Zt>>2]|0,F=F|0?F:5652,Xe=71;break}case 67:{n[kr>>2]=n[Zt>>2],n[_r>>2]=0,n[Zt>>2]=kr,oe=-1,F=kr,Xe=75;break}case 83:{l=n[Zt>>2]|0,k?(oe=k,F=l,Xe=75):(Es(s,32,B,0,Qe),l=0,Xe=84);break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{B=bUe(s,+E[Zt>>3],B,k,Qe,F)|0,l=rt;continue e}default:M=0,j=5642,oe=_e,F=k,k=Qe}while(!1);t:do if((Xe|0)==61)Qe=Zt,Oe=n[Qe>>2]|0,Qe=n[Qe+4>>2]|0,oe=DUe(Oe,Qe,_e,F&32)|0,j=(l&8|0)==0|(Oe|0)==0&(Qe|0)==0,M=j?0:2,j=j?5642:5642+(F>>4)|0,We=l,l=Oe,F=Qe,Xe=67;else if((Xe|0)==66)oe=nm(l,F,_e)|0,We=Qe,Xe=67;else if((Xe|0)==71)Xe=0,Qe=xUe(F,0,k)|0,Oe=(Qe|0)==0,l=F,M=0,j=5642,oe=Oe?F+k|0:Qe,F=Oe?k:Qe-F|0,k=We;else if((Xe|0)==75){for(Xe=0,j=F,l=0,k=0;M=n[j>>2]|0,!(!M||(k=H7(Or,M)|0,(k|0)<0|k>>>0>(oe-l|0)>>>0));)if(l=k+l|0,oe>>>0>l>>>0)j=j+4|0;else break;if((k|0)<0){m=-1;break e}if(Es(s,32,B,l,Qe),!l)l=0,Xe=84;else for(M=0;;){if(k=n[F>>2]|0,!k){Xe=84;break t}if(k=H7(Or,k)|0,M=k+M|0,(M|0)>(l|0)){Xe=84;break t}if(os(s,Or,k),M>>>0>=l>>>0){Xe=84;break}else F=F+4|0}}while(!1);if((Xe|0)==67)Xe=0,F=(l|0)!=0|(F|0)!=0,Qe=(k|0)!=0|F,F=((F^1)&1)+(Ge-oe)|0,l=Qe?oe:_e,oe=_e,F=Qe?(k|0)>(F|0)?k:F:k,k=(k|0)>-1?We&-65537:We;else if((Xe|0)==84){Xe=0,Es(s,32,B,l,Qe^8192),B=(B|0)>(l|0)?B:l,l=rt;continue}Oe=oe-l|0,We=(F|0)<(Oe|0)?Oe:F,Qe=We+M|0,B=(B|0)<(Qe|0)?Qe:B,Es(s,32,B,Qe,k),os(s,j,M),Es(s,48,B,Qe,k^65536),Es(s,48,We,Oe,0),os(s,l,Oe),Es(s,32,B,Qe,k^8192),l=rt}e:do if((Xe|0)==87&&!s)if(!O)m=0;else{for(m=1;l=n[d+(m<<2)>>2]|0,!!l;)if(_7(f+(m<<3)|0,l,c),m=m+1|0,(m|0)>=10){m=1;break e}for(;;){if(n[d+(m<<2)>>2]|0){m=-1;break e}if(m=m+1|0,(m|0)>=10){m=1;break}}}while(!1);return C=lr,m|0}function BUe(s){return s=s|0,0}function vUe(s){s=s|0}function os(s,l,c){s=s|0,l=l|0,c=c|0,n[s>>2]&32||MUe(l,c,s)|0}function U7(s){s=s|0;var l=0,c=0,f=0;if(c=n[s>>2]|0,f=(o[c>>0]|0)+-48|0,f>>>0<10){l=0;do l=f+(l*10|0)|0,c=c+1|0,n[s>>2]=c,f=(o[c>>0]|0)+-48|0;while(f>>>0<10)}else l=0;return l|0}function _7(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;e:do if(l>>>0<=20)do switch(l|0){case 9:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,n[s>>2]=l;break e}case 10:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=((l|0)<0)<<31>>31;break e}case 11:{f=(n[c>>2]|0)+3&-4,l=n[f>>2]|0,n[c>>2]=f+4,f=s,n[f>>2]=l,n[f+4>>2]=0;break e}case 12:{f=(n[c>>2]|0)+7&-8,l=f,d=n[l>>2]|0,l=n[l+4>>2]|0,n[c>>2]=f+8,f=s,n[f>>2]=d,n[f+4>>2]=l;break e}case 13:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,f=(f&65535)<<16>>16,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 14:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&65535,n[d+4>>2]=0;break e}case 15:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,f=(f&255)<<24>>24,d=s,n[d>>2]=f,n[d+4>>2]=((f|0)<0)<<31>>31;break e}case 16:{d=(n[c>>2]|0)+3&-4,f=n[d>>2]|0,n[c>>2]=d+4,d=s,n[d>>2]=f&255,n[d+4>>2]=0;break e}case 17:{d=(n[c>>2]|0)+7&-8,m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}case 18:{d=(n[c>>2]|0)+7&-8,m=+E[d>>3],n[c>>2]=d+8,E[s>>3]=m;break e}default:break e}while(!1);while(!1)}function DUe(s,l,c,f){if(s=s|0,l=l|0,c=c|0,f=f|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=u[5694+(s&15)>>0]|0|f,s=GD(s|0,l|0,4)|0,l=Ce;while(!((s|0)==0&(l|0)==0));return c|0}function SUe(s,l,c){if(s=s|0,l=l|0,c=c|0,!((s|0)==0&(l|0)==0))do c=c+-1|0,o[c>>0]=s&7|48,s=GD(s|0,l|0,3)|0,l=Ce;while(!((s|0)==0&(l|0)==0));return c|0}function nm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if(l>>>0>0|(l|0)==0&s>>>0>4294967295){for(;f=AT(s|0,l|0,10,0)|0,c=c+-1|0,o[c>>0]=f&255|48,f=s,s=uT(s|0,l|0,10,0)|0,l>>>0>9|(l|0)==9&f>>>0>4294967295;)l=Ce;l=s}else l=s;if(l)for(;c=c+-1|0,o[c>>0]=(l>>>0)%10|0|48,!(l>>>0<10);)l=(l>>>0)/10|0;return c|0}function PUe(s){return s=s|0,TUe(s,n[(RUe()|0)+188>>2]|0)|0}function xUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;m=l&255,f=(c|0)!=0;e:do if(f&(s&3|0)!=0)for(d=l&255;;){if((o[s>>0]|0)==d<<24>>24){B=6;break e}if(s=s+1|0,c=c+-1|0,f=(c|0)!=0,!(f&(s&3|0)!=0)){B=5;break}}else B=5;while(!1);(B|0)==5&&(f?B=6:c=0);e:do if((B|0)==6&&(d=l&255,(o[s>>0]|0)!=d<<24>>24)){f=He(m,16843009)|0;t:do if(c>>>0>3){for(;m=n[s>>2]^f,!((m&-2139062144^-2139062144)&m+-16843009|0);)if(s=s+4|0,c=c+-4|0,c>>>0<=3){B=11;break t}}else B=11;while(!1);if((B|0)==11&&!c){c=0;break}for(;;){if((o[s>>0]|0)==d<<24>>24)break e;if(s=s+1|0,c=c+-1|0,!c){c=0;break}}}while(!1);return(c|0?s:0)|0}function Es(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0;if(B=C,C=C+256|0,m=B,(c|0)>(f|0)&(d&73728|0)==0){if(d=c-f|0,sm(m|0,l|0,(d>>>0<256?d:256)|0)|0,d>>>0>255){l=c-f|0;do os(s,m,256),d=d+-256|0;while(d>>>0>255);d=l&255}os(s,m,d)}C=B}function H7(s,l){return s=s|0,l=l|0,s?s=QUe(s,l,0)|0:s=0,s|0}function bUe(s,l,c,f,d,m){s=s|0,l=+l,c=c|0,f=f|0,d=d|0,m=m|0;var B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0,Qe=0,rt=0,Xe=0,ct=0,_e=0,Ge=0,Nt=0,_r=0,ur=0,Zt=0,kr=0,Or=0,lr=0,Ln=0;Ln=C,C=C+560|0,F=Ln+8|0,rt=Ln,lr=Ln+524|0,Or=lr,M=Ln+512|0,n[rt>>2]=0,kr=M+12|0,q7(l)|0,(Ce|0)<0?(l=-l,ur=1,_r=5659):(ur=(d&2049|0)!=0&1,_r=d&2048|0?5662:d&1|0?5665:5660),q7(l)|0,Zt=Ce&2146435072;do if(Zt>>>0<2146435072|(Zt|0)==2146435072&!1){if(We=+kUe(l,rt)*2,B=We!=0,B&&(n[rt>>2]=(n[rt>>2]|0)+-1),ct=m|32,(ct|0)==97){Oe=m&32,oe=Oe|0?_r+9|0:_r,j=ur|2,B=12-f|0;do if(f>>>0>11|(B|0)==0)l=We;else{l=8;do B=B+-1|0,l=l*16;while(B|0);if((o[oe>>0]|0)==45){l=-(l+(-We-l));break}else{l=We+l-l;break}}while(!1);k=n[rt>>2]|0,B=(k|0)<0?0-k|0:k,B=nm(B,((B|0)<0)<<31>>31,kr)|0,(B|0)==(kr|0)&&(B=M+11|0,o[B>>0]=48),o[B+-1>>0]=(k>>31&2)+43,O=B+-2|0,o[O>>0]=m+15,M=(f|0)<1,F=(d&8|0)==0,B=lr;do Zt=~~l,k=B+1|0,o[B>>0]=u[5694+Zt>>0]|Oe,l=(l-+(Zt|0))*16,(k-Or|0)==1&&!(F&(M&l==0))?(o[k>>0]=46,B=B+2|0):B=k;while(l!=0);Zt=B-Or|0,Or=kr-O|0,kr=(f|0)!=0&(Zt+-2|0)<(f|0)?f+2|0:Zt,B=Or+j+kr|0,Es(s,32,c,B,d),os(s,oe,j),Es(s,48,c,B,d^65536),os(s,lr,Zt),Es(s,48,kr-Zt|0,0,0),os(s,O,Or),Es(s,32,c,B,d^8192);break}k=(f|0)<0?6:f,B?(B=(n[rt>>2]|0)+-28|0,n[rt>>2]=B,l=We*268435456):(l=We,B=n[rt>>2]|0),Zt=(B|0)<0?F:F+288|0,F=Zt;do Ge=~~l>>>0,n[F>>2]=Ge,F=F+4|0,l=(l-+(Ge>>>0))*1e9;while(l!=0);if((B|0)>0)for(M=Zt,j=F;;){if(O=(B|0)<29?B:29,B=j+-4|0,B>>>0>=M>>>0){F=0;do _e=K7(n[B>>2]|0,0,O|0)|0,_e=cT(_e|0,Ce|0,F|0,0)|0,Ge=Ce,Xe=AT(_e|0,Ge|0,1e9,0)|0,n[B>>2]=Xe,F=uT(_e|0,Ge|0,1e9,0)|0,B=B+-4|0;while(B>>>0>=M>>>0);F&&(M=M+-4|0,n[M>>2]=F)}for(F=j;!(F>>>0<=M>>>0);)if(B=F+-4|0,!(n[B>>2]|0))F=B;else break;if(B=(n[rt>>2]|0)-O|0,n[rt>>2]=B,(B|0)>0)j=F;else break}else M=Zt;if((B|0)<0){f=((k+25|0)/9|0)+1|0,Qe=(ct|0)==102;do{if(Oe=0-B|0,Oe=(Oe|0)<9?Oe:9,M>>>0>>0){O=(1<>>Oe,oe=0,B=M;do Ge=n[B>>2]|0,n[B>>2]=(Ge>>>Oe)+oe,oe=He(Ge&O,j)|0,B=B+4|0;while(B>>>0>>0);B=n[M>>2]|0?M:M+4|0,oe?(n[F>>2]=oe,M=B,B=F+4|0):(M=B,B=F)}else M=n[M>>2]|0?M:M+4|0,B=F;F=Qe?Zt:M,F=(B-F>>2|0)>(f|0)?F+(f<<2)|0:B,B=(n[rt>>2]|0)+Oe|0,n[rt>>2]=B}while((B|0)<0);B=M,f=F}else B=M,f=F;if(Ge=Zt,B>>>0>>0){if(F=(Ge-B>>2)*9|0,O=n[B>>2]|0,O>>>0>=10){M=10;do M=M*10|0,F=F+1|0;while(O>>>0>=M>>>0)}}else F=0;if(Qe=(ct|0)==103,Xe=(k|0)!=0,M=k-((ct|0)!=102?F:0)+((Xe&Qe)<<31>>31)|0,(M|0)<(((f-Ge>>2)*9|0)+-9|0)){if(M=M+9216|0,Oe=Zt+4+(((M|0)/9|0)+-1024<<2)|0,M=((M|0)%9|0)+1|0,(M|0)<9){O=10;do O=O*10|0,M=M+1|0;while((M|0)!=9)}else O=10;if(j=n[Oe>>2]|0,oe=(j>>>0)%(O>>>0)|0,M=(Oe+4|0)==(f|0),M&(oe|0)==0)M=Oe;else if(We=((j>>>0)/(O>>>0)|0)&1|0?9007199254740994:9007199254740992,_e=(O|0)/2|0,l=oe>>>0<_e>>>0?.5:M&(oe|0)==(_e|0)?1:1.5,ur&&(_e=(o[_r>>0]|0)==45,l=_e?-l:l,We=_e?-We:We),M=j-oe|0,n[Oe>>2]=M,We+l!=We){if(_e=M+O|0,n[Oe>>2]=_e,_e>>>0>999999999)for(F=Oe;M=F+-4|0,n[F>>2]=0,M>>>0>>0&&(B=B+-4|0,n[B>>2]=0),_e=(n[M>>2]|0)+1|0,n[M>>2]=_e,_e>>>0>999999999;)F=M;else M=Oe;if(F=(Ge-B>>2)*9|0,j=n[B>>2]|0,j>>>0>=10){O=10;do O=O*10|0,F=F+1|0;while(j>>>0>=O>>>0)}}else M=Oe;M=M+4|0,M=f>>>0>M>>>0?M:f,_e=B}else M=f,_e=B;for(ct=M;;){if(ct>>>0<=_e>>>0){rt=0;break}if(B=ct+-4|0,!(n[B>>2]|0))ct=B;else{rt=1;break}}f=0-F|0;do if(Qe)if(B=((Xe^1)&1)+k|0,(B|0)>(F|0)&(F|0)>-5?(O=m+-1|0,k=B+-1-F|0):(O=m+-2|0,k=B+-1|0),B=d&8,B)Oe=B;else{if(rt&&(Nt=n[ct+-4>>2]|0,(Nt|0)!=0))if((Nt>>>0)%10|0)M=0;else{M=0,B=10;do B=B*10|0,M=M+1|0;while(!((Nt>>>0)%(B>>>0)|0|0))}else M=9;if(B=((ct-Ge>>2)*9|0)+-9|0,(O|32|0)==102){Oe=B-M|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}else{Oe=B+F-M|0,Oe=(Oe|0)>0?Oe:0,k=(k|0)<(Oe|0)?k:Oe,Oe=0;break}}else O=m,Oe=d&8;while(!1);if(Qe=k|Oe,j=(Qe|0)!=0&1,oe=(O|32|0)==102,oe)Xe=0,B=(F|0)>0?F:0;else{if(B=(F|0)<0?f:F,B=nm(B,((B|0)<0)<<31>>31,kr)|0,M=kr,(M-B|0)<2)do B=B+-1|0,o[B>>0]=48;while((M-B|0)<2);o[B+-1>>0]=(F>>31&2)+43,B=B+-2|0,o[B>>0]=O,Xe=B,B=M-B|0}if(B=ur+1+k+j+B|0,Es(s,32,c,B,d),os(s,_r,ur),Es(s,48,c,B,d^65536),oe){O=_e>>>0>Zt>>>0?Zt:_e,Oe=lr+9|0,j=Oe,oe=lr+8|0,M=O;do{if(F=nm(n[M>>2]|0,0,Oe)|0,(M|0)==(O|0))(F|0)==(Oe|0)&&(o[oe>>0]=48,F=oe);else if(F>>>0>lr>>>0){sm(lr|0,48,F-Or|0)|0;do F=F+-1|0;while(F>>>0>lr>>>0)}os(s,F,j-F|0),M=M+4|0}while(M>>>0<=Zt>>>0);if(Qe|0&&os(s,5710,1),M>>>0>>0&(k|0)>0)for(;;){if(F=nm(n[M>>2]|0,0,Oe)|0,F>>>0>lr>>>0){sm(lr|0,48,F-Or|0)|0;do F=F+-1|0;while(F>>>0>lr>>>0)}if(os(s,F,(k|0)<9?k:9),M=M+4|0,F=k+-9|0,M>>>0>>0&(k|0)>9)k=F;else{k=F;break}}Es(s,48,k+9|0,9,0)}else{if(Qe=rt?ct:_e+4|0,(k|0)>-1){rt=lr+9|0,Oe=(Oe|0)==0,f=rt,j=0-Or|0,oe=lr+8|0,O=_e;do{F=nm(n[O>>2]|0,0,rt)|0,(F|0)==(rt|0)&&(o[oe>>0]=48,F=oe);do if((O|0)==(_e|0)){if(M=F+1|0,os(s,F,1),Oe&(k|0)<1){F=M;break}os(s,5710,1),F=M}else{if(F>>>0<=lr>>>0)break;sm(lr|0,48,F+j|0)|0;do F=F+-1|0;while(F>>>0>lr>>>0)}while(!1);Or=f-F|0,os(s,F,(k|0)>(Or|0)?Or:k),k=k-Or|0,O=O+4|0}while(O>>>0>>0&(k|0)>-1)}Es(s,48,k+18|0,18,0),os(s,Xe,kr-Xe|0)}Es(s,32,c,B,d^8192)}else lr=(m&32|0)!=0,B=ur+3|0,Es(s,32,c,B,d&-65537),os(s,_r,ur),os(s,l!=l|!1?lr?5686:5690:lr?5678:5682,3),Es(s,32,c,B,d^8192);while(!1);return C=Ln,((B|0)<(c|0)?c:B)|0}function q7(s){s=+s;var l=0;return E[D>>3]=s,l=n[D>>2]|0,Ce=n[D+4>>2]|0,l|0}function kUe(s,l){return s=+s,l=l|0,+ +j7(s,l)}function j7(s,l){s=+s,l=l|0;var c=0,f=0,d=0;switch(E[D>>3]=s,c=n[D>>2]|0,f=n[D+4>>2]|0,d=GD(c|0,f|0,52)|0,d&2047){case 0:{s!=0?(s=+j7(s*18446744073709552e3,l),c=(n[l>>2]|0)+-64|0):c=0,n[l>>2]=c;break}case 2047:break;default:n[l>>2]=(d&2047)+-1022,n[D>>2]=c,n[D+4>>2]=f&-2146435073|1071644672,s=+E[D>>3]}return+s}function QUe(s,l,c){s=s|0,l=l|0,c=c|0;do if(s){if(l>>>0<128){o[s>>0]=l,s=1;break}if(!(n[n[(FUe()|0)+188>>2]>>2]|0))if((l&-128|0)==57216){o[s>>0]=l,s=1;break}else{n[(rm()|0)>>2]=84,s=-1;break}if(l>>>0<2048){o[s>>0]=l>>>6|192,o[s+1>>0]=l&63|128,s=2;break}if(l>>>0<55296|(l&-8192|0)==57344){o[s>>0]=l>>>12|224,o[s+1>>0]=l>>>6&63|128,o[s+2>>0]=l&63|128,s=3;break}if((l+-65536|0)>>>0<1048576){o[s>>0]=l>>>18|240,o[s+1>>0]=l>>>12&63|128,o[s+2>>0]=l>>>6&63|128,o[s+3>>0]=l&63|128,s=4;break}else{n[(rm()|0)>>2]=84,s=-1;break}}else s=1;while(!1);return s|0}function FUe(){return oT()|0}function RUe(){return oT()|0}function TUe(s,l){s=s|0,l=l|0;var c=0,f=0;for(f=0;;){if((u[5712+f>>0]|0)==(s|0)){s=2;break}if(c=f+1|0,(c|0)==87){c=5800,f=87,s=5;break}else f=c}if((s|0)==2&&(f?(c=5800,s=5):c=5800),(s|0)==5)for(;;){do s=c,c=c+1|0;while(o[s>>0]|0);if(f=f+-1|0,f)s=5;else break}return LUe(c,n[l+20>>2]|0)|0}function LUe(s,l){return s=s|0,l=l|0,NUe(s,l)|0}function NUe(s,l){return s=s|0,l=l|0,l?l=OUe(n[l>>2]|0,n[l+4>>2]|0,s)|0:l=0,(l|0?l:s)|0}function OUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0;oe=(n[s>>2]|0)+1794895138|0,m=O0(n[s+8>>2]|0,oe)|0,f=O0(n[s+12>>2]|0,oe)|0,d=O0(n[s+16>>2]|0,oe)|0;e:do if(m>>>0>>2>>>0&&(j=l-(m<<2)|0,f>>>0>>0&d>>>0>>0)&&!((d|f)&3|0)){for(j=f>>>2,O=d>>>2,M=0;;){if(k=m>>>1,F=M+k|0,B=F<<1,d=B+j|0,f=O0(n[s+(d<<2)>>2]|0,oe)|0,d=O0(n[s+(d+1<<2)>>2]|0,oe)|0,!(d>>>0>>0&f>>>0<(l-d|0)>>>0)){f=0;break e}if(o[s+(d+f)>>0]|0){f=0;break e}if(f=O7(c,s+d|0)|0,!f)break;if(f=(f|0)<0,(m|0)==1){f=0;break e}else M=f?M:F,m=f?k:m-k|0}f=B+O|0,d=O0(n[s+(f<<2)>>2]|0,oe)|0,f=O0(n[s+(f+1<<2)>>2]|0,oe)|0,f>>>0>>0&d>>>0<(l-f|0)>>>0?f=o[s+(f+d)>>0]|0?0:s+f|0:f=0}else f=0;while(!1);return f|0}function O0(s,l){s=s|0,l=l|0;var c=0;return c=X7(s|0)|0,(l|0?c:s)|0}function MUe(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0,k=0;f=c+16|0,d=n[f>>2]|0,d?m=5:UUe(c)|0?f=0:(d=n[f>>2]|0,m=5);e:do if((m|0)==5){if(k=c+20|0,B=n[k>>2]|0,f=B,(d-B|0)>>>0>>0){f=YD[n[c+36>>2]&7](c,s,l)|0;break}t:do if((o[c+75>>0]|0)>-1){for(B=l;;){if(!B){m=0,d=s;break t}if(d=B+-1|0,(o[s+d>>0]|0)==10)break;B=d}if(f=YD[n[c+36>>2]&7](c,s,B)|0,f>>>0>>0)break e;m=B,d=s+B|0,l=l-B|0,f=n[k>>2]|0}else m=0,d=s;while(!1);br(f|0,d|0,l|0)|0,n[k>>2]=(n[k>>2]|0)+l,f=m+l|0}while(!1);return f|0}function UUe(s){s=s|0;var l=0,c=0;return l=s+74|0,c=o[l>>0]|0,o[l>>0]=c+255|c,l=n[s>>2]|0,l&8?(n[s>>2]=l|32,s=-1):(n[s+8>>2]=0,n[s+4>>2]=0,c=n[s+44>>2]|0,n[s+28>>2]=c,n[s+20>>2]=c,n[s+16>>2]=c+(n[s+48>>2]|0),s=0),s|0}function Yn(s,l){s=y(s),l=y(l);var c=0,f=0;c=G7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=G7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?l:s;break}else{s=s>2]=s,n[D>>2]|0|0}function M0(s,l){s=y(s),l=y(l);var c=0,f=0;c=W7(s)|0;do if((c&2147483647)>>>0<=2139095040){if(f=W7(l)|0,(f&2147483647)>>>0<=2139095040)if((f^c|0)<0){s=(c|0)<0?s:l;break}else{s=s>2]=s,n[D>>2]|0|0}function lT(s,l){s=y(s),l=y(l);var c=0,f=0,d=0,m=0,B=0,k=0,F=0,M=0;m=(h[D>>2]=s,n[D>>2]|0),k=(h[D>>2]=l,n[D>>2]|0),c=m>>>23&255,B=k>>>23&255,F=m&-2147483648,d=k<<1;e:do if(d|0&&!((c|0)==255|((_Ue(l)|0)&2147483647)>>>0>2139095040)){if(f=m<<1,f>>>0<=d>>>0)return l=y(s*y(0)),y((f|0)==(d|0)?l:s);if(c)f=m&8388607|8388608;else{if(c=m<<9,(c|0)>-1){f=c,c=0;do c=c+-1|0,f=f<<1;while((f|0)>-1)}else c=0;f=m<<1-c}if(B)k=k&8388607|8388608;else{if(m=k<<9,(m|0)>-1){d=0;do d=d+-1|0,m=m<<1;while((m|0)>-1)}else d=0;B=d,k=k<<1-d}d=f-k|0,m=(d|0)>-1;t:do if((c|0)>(B|0)){for(;;){if(m)if(d)f=d;else break;if(f=f<<1,c=c+-1|0,d=f-k|0,m=(d|0)>-1,(c|0)<=(B|0))break t}l=y(s*y(0));break e}while(!1);if(m)if(d)f=d;else{l=y(s*y(0));break}if(f>>>0<8388608)do f=f<<1,c=c+-1|0;while(f>>>0<8388608);(c|0)>0?c=f+-8388608|c<<23:c=f>>>(1-c|0),l=(n[D>>2]=c|F,y(h[D>>2]))}else M=3;while(!1);return(M|0)==3&&(l=y(s*l),l=y(l/l)),y(l)}function _Ue(s){return s=y(s),h[D>>2]=s,n[D>>2]|0|0}function HUe(s,l){return s=s|0,l=l|0,M7(n[582]|0,s,l)|0}function Zr(s){s=s|0,Tt()}function im(s){s=s|0}function qUe(s,l){return s=s|0,l=l|0,0}function jUe(s){return s=s|0,(Y7(s+4|0)|0)==-1?(ef[n[(n[s>>2]|0)+8>>2]&127](s),s=1):s=0,s|0}function Y7(s){s=s|0;var l=0;return l=n[s>>2]|0,n[s>>2]=l+-1,l+-1|0}function Rp(s){s=s|0,jUe(s)|0&&GUe(s)}function GUe(s){s=s|0;var l=0;l=s+8|0,n[l>>2]|0&&(Y7(l)|0)!=-1||ef[n[(n[s>>2]|0)+16>>2]&127](s)}function Yt(s){s=s|0;var l=0;for(l=s|0?s:1;s=_D(l)|0,!(s|0);){if(s=YUe()|0,!s){s=0;break}aW[s&0]()}return s|0}function V7(s){return s=s|0,Yt(s)|0}function yt(s){s=s|0,HD(s)}function WUe(s){s=s|0,(o[s+11>>0]|0)<0&&yt(n[s>>2]|0)}function YUe(){var s=0;return s=n[2923]|0,n[2923]=s+0,s|0}function VUe(){}function jD(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,f=l-f-(c>>>0>s>>>0|0)>>>0,Ce=f,s-c>>>0|0|0}function cT(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,c=s+c>>>0,Ce=l+f+(c>>>0>>0|0)>>>0,c|0|0}function sm(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0,B=0;if(m=s+c|0,l=l&255,(c|0)>=67){for(;s&3;)o[s>>0]=l,s=s+1|0;for(f=m&-4|0,d=f-64|0,B=l|l<<8|l<<16|l<<24;(s|0)<=(d|0);)n[s>>2]=B,n[s+4>>2]=B,n[s+8>>2]=B,n[s+12>>2]=B,n[s+16>>2]=B,n[s+20>>2]=B,n[s+24>>2]=B,n[s+28>>2]=B,n[s+32>>2]=B,n[s+36>>2]=B,n[s+40>>2]=B,n[s+44>>2]=B,n[s+48>>2]=B,n[s+52>>2]=B,n[s+56>>2]=B,n[s+60>>2]=B,s=s+64|0;for(;(s|0)<(f|0);)n[s>>2]=B,s=s+4|0}for(;(s|0)<(m|0);)o[s>>0]=l,s=s+1|0;return m-c|0}function K7(s,l,c){return s=s|0,l=l|0,c=c|0,(c|0)<32?(Ce=l<>>32-c,s<>>c,s>>>c|(l&(1<>>c-32|0)}function br(s,l,c){s=s|0,l=l|0,c=c|0;var f=0,d=0,m=0;if((c|0)>=8192)return FA(s|0,l|0,c|0)|0;if(m=s|0,d=s+c|0,(s&3)==(l&3)){for(;s&3;){if(!c)return m|0;o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0,c=c-1|0}for(c=d&-4|0,f=c-64|0;(s|0)<=(f|0);)n[s>>2]=n[l>>2],n[s+4>>2]=n[l+4>>2],n[s+8>>2]=n[l+8>>2],n[s+12>>2]=n[l+12>>2],n[s+16>>2]=n[l+16>>2],n[s+20>>2]=n[l+20>>2],n[s+24>>2]=n[l+24>>2],n[s+28>>2]=n[l+28>>2],n[s+32>>2]=n[l+32>>2],n[s+36>>2]=n[l+36>>2],n[s+40>>2]=n[l+40>>2],n[s+44>>2]=n[l+44>>2],n[s+48>>2]=n[l+48>>2],n[s+52>>2]=n[l+52>>2],n[s+56>>2]=n[l+56>>2],n[s+60>>2]=n[l+60>>2],s=s+64|0,l=l+64|0;for(;(s|0)<(c|0);)n[s>>2]=n[l>>2],s=s+4|0,l=l+4|0}else for(c=d-4|0;(s|0)<(c|0);)o[s>>0]=o[l>>0]|0,o[s+1>>0]=o[l+1>>0]|0,o[s+2>>0]=o[l+2>>0]|0,o[s+3>>0]=o[l+3>>0]|0,s=s+4|0,l=l+4|0;for(;(s|0)<(d|0);)o[s>>0]=o[l>>0]|0,s=s+1|0,l=l+1|0;return m|0}function J7(s){s=s|0;var l=0;return l=o[N+(s&255)>>0]|0,(l|0)<8?l|0:(l=o[N+(s>>8&255)>>0]|0,(l|0)<8?l+8|0:(l=o[N+(s>>16&255)>>0]|0,(l|0)<8?l+16|0:(o[N+(s>>>24)>>0]|0)+24|0))}function z7(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0;var m=0,B=0,k=0,F=0,M=0,O=0,j=0,oe=0,We=0,Oe=0;if(O=s,F=l,M=F,B=c,oe=f,k=oe,!M)return m=(d|0)!=0,k?m?(n[d>>2]=s|0,n[d+4>>2]=l&0,oe=0,d=0,Ce=oe,d|0):(oe=0,d=0,Ce=oe,d|0):(m&&(n[d>>2]=(O>>>0)%(B>>>0),n[d+4>>2]=0),oe=0,d=(O>>>0)/(B>>>0)>>>0,Ce=oe,d|0);m=(k|0)==0;do if(B){if(!m){if(m=(P(k|0)|0)-(P(M|0)|0)|0,m>>>0<=31){j=m+1|0,k=31-m|0,l=m-31>>31,B=j,s=O>>>(j>>>0)&l|M<>>(j>>>0)&l,m=0,k=O<>2]=s|0,n[d+4>>2]=F|l&0,oe=0,d=0,Ce=oe,d|0):(oe=0,d=0,Ce=oe,d|0)}if(m=B-1|0,m&B|0){k=(P(B|0)|0)+33-(P(M|0)|0)|0,Oe=64-k|0,j=32-k|0,F=j>>31,We=k-32|0,l=We>>31,B=k,s=j-1>>31&M>>>(We>>>0)|(M<>>(k>>>0))&l,l=l&M>>>(k>>>0),m=O<>>(We>>>0))&F|O<>31;break}return d|0&&(n[d>>2]=m&O,n[d+4>>2]=0),(B|0)==1?(We=F|l&0,Oe=s|0|0,Ce=We,Oe|0):(Oe=J7(B|0)|0,We=M>>>(Oe>>>0)|0,Oe=M<<32-Oe|O>>>(Oe>>>0)|0,Ce=We,Oe|0)}else{if(m)return d|0&&(n[d>>2]=(M>>>0)%(B>>>0),n[d+4>>2]=0),We=0,Oe=(M>>>0)/(B>>>0)>>>0,Ce=We,Oe|0;if(!O)return d|0&&(n[d>>2]=0,n[d+4>>2]=(M>>>0)%(k>>>0)),We=0,Oe=(M>>>0)/(k>>>0)>>>0,Ce=We,Oe|0;if(m=k-1|0,!(m&k))return d|0&&(n[d>>2]=s|0,n[d+4>>2]=m&M|l&0),We=0,Oe=M>>>((J7(k|0)|0)>>>0),Ce=We,Oe|0;if(m=(P(k|0)|0)-(P(M|0)|0)|0,m>>>0<=30){l=m+1|0,k=31-m|0,B=l,s=M<>>(l>>>0),l=M>>>(l>>>0),m=0,k=O<>2]=s|0,n[d+4>>2]=F|l&0,We=0,Oe=0,Ce=We,Oe|0):(We=0,Oe=0,Ce=We,Oe|0)}while(!1);if(!B)M=k,F=0,k=0;else{j=c|0|0,O=oe|f&0,M=cT(j|0,O|0,-1,-1)|0,c=Ce,F=k,k=0;do f=F,F=m>>>31|F<<1,m=k|m<<1,f=s<<1|f>>>31|0,oe=s>>>31|l<<1|0,jD(M|0,c|0,f|0,oe|0)|0,Oe=Ce,We=Oe>>31|((Oe|0)<0?-1:0)<<1,k=We&1,s=jD(f|0,oe|0,We&j|0,(((Oe|0)<0?-1:0)>>31|((Oe|0)<0?-1:0)<<1)&O|0)|0,l=Ce,B=B-1|0;while(B|0);M=F,F=0}return B=0,d|0&&(n[d>>2]=s,n[d+4>>2]=l),We=(m|0)>>>31|(M|B)<<1|(B<<1|m>>>31)&0|F,Oe=(m<<1|0)&-2|k,Ce=We,Oe|0}function uT(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,z7(s,l,c,f,0)|0}function Tp(s){s=s|0;var l=0,c=0;return c=s+15&-16|0,l=n[w>>2]|0,s=l+c|0,(c|0)>0&(s|0)<(l|0)|(s|0)<0?(se()|0,yc(12),-1):(n[w>>2]=s,(s|0)>($()|0)&&!(X()|0)?(n[w>>2]=l,yc(12),-1):l|0)}function rw(s,l,c){s=s|0,l=l|0,c=c|0;var f=0;if((l|0)<(s|0)&(s|0)<(l+c|0)){for(f=s,l=l+c|0,s=s+c|0;(c|0)>0;)s=s-1|0,l=l-1|0,c=c-1|0,o[s>>0]=o[l>>0]|0;s=f}else br(s,l,c)|0;return s|0}function AT(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0;var d=0,m=0;return m=C,C=C+16|0,d=m|0,z7(s,l,c,f,d)|0,C=m,Ce=n[d+4>>2]|0,n[d>>2]|0|0}function X7(s){return s=s|0,(s&255)<<24|(s>>8&255)<<16|(s>>16&255)<<8|s>>>24|0}function KUe(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,Z7[s&1](l|0,c|0,f|0,d|0,m|0)}function JUe(s,l,c){s=s|0,l=l|0,c=y(c),$7[s&1](l|0,y(c))}function zUe(s,l,c){s=s|0,l=l|0,c=+c,eW[s&31](l|0,+c)}function XUe(s,l,c,f){return s=s|0,l=l|0,c=y(c),f=y(f),y(tW[s&0](l|0,y(c),y(f)))}function ZUe(s,l){s=s|0,l=l|0,ef[s&127](l|0)}function $Ue(s,l,c){s=s|0,l=l|0,c=c|0,tf[s&31](l|0,c|0)}function e3e(s,l){return s=s|0,l=l|0,_0[s&31](l|0)|0}function t3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,rW[s&1](l|0,+c,+f,d|0)}function r3e(s,l,c,f){s=s|0,l=l|0,c=+c,f=+f,N3e[s&1](l|0,+c,+f)}function n3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,YD[s&7](l|0,c|0,f|0)|0}function i3e(s,l,c,f){return s=s|0,l=l|0,c=c|0,f=f|0,+O3e[s&1](l|0,c|0,f|0)}function s3e(s,l){return s=s|0,l=l|0,+nW[s&15](l|0)}function o3e(s,l,c){return s=s|0,l=l|0,c=+c,M3e[s&1](l|0,+c)|0}function a3e(s,l,c){return s=s|0,l=l|0,c=c|0,pT[s&15](l|0,c|0)|0}function l3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=+f,d=+d,m=m|0,U3e[s&1](l|0,c|0,+f,+d,m|0)}function c3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,B=B|0,_3e[s&1](l|0,c|0,f|0,d|0,m|0,B|0)}function u3e(s,l,c){return s=s|0,l=l|0,c=c|0,+iW[s&7](l|0,c|0)}function A3e(s){return s=s|0,VD[s&7]()|0}function f3e(s,l,c,f,d,m){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,sW[s&1](l|0,c|0,f|0,d|0,m|0)|0}function p3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=+d,H3e[s&1](l|0,c|0,f|0,+d)}function h3e(s,l,c,f,d,m,B){s=s|0,l=l|0,c=c|0,f=y(f),d=d|0,m=y(m),B=B|0,oW[s&1](l|0,c|0,y(f),d|0,y(m),B|0)}function g3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,sw[s&15](l|0,c|0,f|0)}function d3e(s){s=s|0,aW[s&0]()}function m3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,lW[s&15](l|0,c|0,+f)}function y3e(s,l,c){return s=s|0,l=+l,c=+c,q3e[s&1](+l,+c)|0}function E3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,hT[s&15](l|0,c|0,f|0,d|0)}function C3e(s,l,c,f,d){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,R(0)}function I3e(s,l){s=s|0,l=y(l),R(1)}function Ca(s,l){s=s|0,l=+l,R(2)}function w3e(s,l,c){return s=s|0,l=y(l),c=y(c),R(3),Ze}function Cr(s){s=s|0,R(4)}function nw(s,l){s=s|0,l=l|0,R(5)}function tl(s){return s=s|0,R(6),0}function B3e(s,l,c,f){s=s|0,l=+l,c=+c,f=f|0,R(7)}function v3e(s,l,c){s=s|0,l=+l,c=+c,R(8)}function D3e(s,l,c){return s=s|0,l=l|0,c=c|0,R(9),0}function S3e(s,l,c){return s=s|0,l=l|0,c=c|0,R(10),0}function U0(s){return s=s|0,R(11),0}function P3e(s,l){return s=s|0,l=+l,R(12),0}function iw(s,l){return s=s|0,l=l|0,R(13),0}function x3e(s,l,c,f,d){s=s|0,l=l|0,c=+c,f=+f,d=d|0,R(14)}function b3e(s,l,c,f,d,m){s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,m=m|0,R(15)}function fT(s,l){return s=s|0,l=l|0,R(16),0}function k3e(){return R(17),0}function Q3e(s,l,c,f,d){return s=s|0,l=l|0,c=c|0,f=f|0,d=d|0,R(18),0}function F3e(s,l,c,f){s=s|0,l=l|0,c=c|0,f=+f,R(19)}function R3e(s,l,c,f,d,m){s=s|0,l=l|0,c=y(c),f=f|0,d=y(d),m=m|0,R(20)}function WD(s,l,c){s=s|0,l=l|0,c=c|0,R(21)}function T3e(){R(22)}function om(s,l,c){s=s|0,l=l|0,c=+c,R(23)}function L3e(s,l){return s=+s,l=+l,R(24),0}function am(s,l,c,f){s=s|0,l=l|0,c=c|0,f=f|0,R(25)}var Z7=[C3e,QNe],$7=[I3e,Od],eW=[Ca,B0,vp,UI,_I,HI,qI,ku,Wd,jI,Qu,v0,D0,GI,WI,bc,S0,YI,Yd,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca,Ca],tW=[w3e],ef=[Cr,im,ADe,fDe,pDe,qxe,jxe,Gxe,oLe,aLe,lLe,yNe,ENe,CNe,_4e,H4e,q4e,qa,w0,LI,ir,bl,bD,kD,tDe,IDe,RDe,XDe,pSe,kSe,VSe,lPe,BPe,UPe,txe,mxe,Rxe,abe,Bbe,Ube,tke,mke,Rke,Zke,pQe,PQe,jQe,dD,CFe,NFe,tRe,ERe,TRe,tTe,ATe,hTe,QTe,TTe,XTe,uLe,pLe,kLe,KLe,M5,bOe,oMe,IMe,NMe,i4e,E4e,k4e,R4e,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr,Cr],tf=[nw,qd,YF,NI,OI,Pr,Os,Oi,ms,is,Gd,Bp,KI,ID,b0,JF,zF,wD,BD,$F,Fu,ne,rQe,dQe,BRe,FOe,rNe,w7,nw,nw,nw,nw],_0=[tl,mUe,_d,x0,Kd,qo,mD,Dp,VI,KF,ED,Jd,vD,eR,Zd,YQe,MRe,RLe,NOe,Za,tl,tl,tl,tl,tl,tl,tl,tl,tl,tl,tl,tl],rW=[B3e,sR],N3e=[v3e,eLe],YD=[D3e,N7,yUe,IUe,TSe,Abe,vFe,_Me],O3e=[S3e,sxe],nW=[U0,Sp,CD,JA,oR,v,S,Q,H,Y,U0,U0,U0,U0,U0,U0],M3e=[P3e,lTe],pT=[iw,qUe,DD,sDe,tSe,zSe,APe,Oxe,Pbe,QQe,Md,DMe,iw,iw,iw,iw],U3e=[x3e,ODe],_3e=[b3e,l4e],iW=[fT,XF,Be,Ue,ft,Ixe,fT,fT],VD=[k3e,jt,Ud,gD,yTe,MTe,mLe,O4e],sW=[Q3e,kd],H3e=[F3e,ske],oW=[R3e,tR],sw=[WD,oo,yD,ZF,Qc,mSe,SPe,Ike,Oke,WF,eOe,uMe,B4e,WD,WD,WD],aW=[T3e],lW=[om,VF,jd,KA,MI,kc,Vd,P0,jbe,_Fe,iTe,om,om,om,om,om],q3e=[L3e,iLe],hT=[am,jPe,eFe,sRe,VRe,vTe,GTe,vLe,$Le,qOe,K4e,am,am,am,am,am];return{_llvm_bswap_i32:X7,dynCall_idd:y3e,dynCall_i:A3e,_i64Subtract:jD,___udivdi3:uT,dynCall_vif:JUe,setThrew:No,dynCall_viii:g3e,_bitshift64Lshr:GD,_bitshift64Shl:K7,dynCall_vi:ZUe,dynCall_viiddi:l3e,dynCall_diii:i3e,dynCall_iii:a3e,_memset:sm,_sbrk:Tp,_memcpy:br,__GLOBAL__sub_I_Yoga_cpp:FI,dynCall_vii:$Ue,___uremdi3:AT,dynCall_vid:zUe,stackAlloc:ca,_nbind_init:sUe,getTempRet0:TA,dynCall_di:s3e,dynCall_iid:o3e,setTempRet0:RA,_i64Add:cT,dynCall_fiff:XUe,dynCall_iiii:n3e,_emscripten_get_global_libc:dUe,dynCall_viid:m3e,dynCall_viiid:p3e,dynCall_viififi:h3e,dynCall_ii:e3e,__GLOBAL__sub_I_Binding_cc:IOe,dynCall_viiii:E3e,dynCall_iiiiii:f3e,stackSave:mu,dynCall_viiiii:KUe,__GLOBAL__sub_I_nbind_cc:wr,dynCall_vidd:r3e,_free:HD,runPostSets:VUe,dynCall_viiiiii:c3e,establishStackSpace:dn,_memmove:rw,stackRestore:Bl,_malloc:_D,__GLOBAL__sub_I_common_cc:HLe,dynCall_viddi:t3e,dynCall_dii:u3e,dynCall_v:d3e}}(Module.asmGlobalArg,Module.asmLibraryArg,buffer),_llvm_bswap_i32=Module._llvm_bswap_i32=asm._llvm_bswap_i32,getTempRet0=Module.getTempRet0=asm.getTempRet0,___udivdi3=Module.___udivdi3=asm.___udivdi3,setThrew=Module.setThrew=asm.setThrew,_bitshift64Lshr=Module._bitshift64Lshr=asm._bitshift64Lshr,_bitshift64Shl=Module._bitshift64Shl=asm._bitshift64Shl,_memset=Module._memset=asm._memset,_sbrk=Module._sbrk=asm._sbrk,_memcpy=Module._memcpy=asm._memcpy,stackAlloc=Module.stackAlloc=asm.stackAlloc,___uremdi3=Module.___uremdi3=asm.___uremdi3,_nbind_init=Module._nbind_init=asm._nbind_init,_i64Subtract=Module._i64Subtract=asm._i64Subtract,setTempRet0=Module.setTempRet0=asm.setTempRet0,_i64Add=Module._i64Add=asm._i64Add,_emscripten_get_global_libc=Module._emscripten_get_global_libc=asm._emscripten_get_global_libc,__GLOBAL__sub_I_Yoga_cpp=Module.__GLOBAL__sub_I_Yoga_cpp=asm.__GLOBAL__sub_I_Yoga_cpp,__GLOBAL__sub_I_Binding_cc=Module.__GLOBAL__sub_I_Binding_cc=asm.__GLOBAL__sub_I_Binding_cc,stackSave=Module.stackSave=asm.stackSave,__GLOBAL__sub_I_nbind_cc=Module.__GLOBAL__sub_I_nbind_cc=asm.__GLOBAL__sub_I_nbind_cc,_free=Module._free=asm._free,runPostSets=Module.runPostSets=asm.runPostSets,establishStackSpace=Module.establishStackSpace=asm.establishStackSpace,_memmove=Module._memmove=asm._memmove,stackRestore=Module.stackRestore=asm.stackRestore,_malloc=Module._malloc=asm._malloc,__GLOBAL__sub_I_common_cc=Module.__GLOBAL__sub_I_common_cc=asm.__GLOBAL__sub_I_common_cc,dynCall_viiiii=Module.dynCall_viiiii=asm.dynCall_viiiii,dynCall_vif=Module.dynCall_vif=asm.dynCall_vif,dynCall_vid=Module.dynCall_vid=asm.dynCall_vid,dynCall_fiff=Module.dynCall_fiff=asm.dynCall_fiff,dynCall_vi=Module.dynCall_vi=asm.dynCall_vi,dynCall_vii=Module.dynCall_vii=asm.dynCall_vii,dynCall_ii=Module.dynCall_ii=asm.dynCall_ii,dynCall_viddi=Module.dynCall_viddi=asm.dynCall_viddi,dynCall_vidd=Module.dynCall_vidd=asm.dynCall_vidd,dynCall_iiii=Module.dynCall_iiii=asm.dynCall_iiii,dynCall_diii=Module.dynCall_diii=asm.dynCall_diii,dynCall_di=Module.dynCall_di=asm.dynCall_di,dynCall_iid=Module.dynCall_iid=asm.dynCall_iid,dynCall_iii=Module.dynCall_iii=asm.dynCall_iii,dynCall_viiddi=Module.dynCall_viiddi=asm.dynCall_viiddi,dynCall_viiiiii=Module.dynCall_viiiiii=asm.dynCall_viiiiii,dynCall_dii=Module.dynCall_dii=asm.dynCall_dii,dynCall_i=Module.dynCall_i=asm.dynCall_i,dynCall_iiiiii=Module.dynCall_iiiiii=asm.dynCall_iiiiii,dynCall_viiid=Module.dynCall_viiid=asm.dynCall_viiid,dynCall_viififi=Module.dynCall_viififi=asm.dynCall_viififi,dynCall_viii=Module.dynCall_viii=asm.dynCall_viii,dynCall_v=Module.dynCall_v=asm.dynCall_v,dynCall_viid=Module.dynCall_viid=asm.dynCall_viid,dynCall_idd=Module.dynCall_idd=asm.dynCall_idd,dynCall_viiii=Module.dynCall_viiii=asm.dynCall_viiii;Runtime.stackAlloc=Module.stackAlloc,Runtime.stackSave=Module.stackSave,Runtime.stackRestore=Module.stackRestore,Runtime.establishStackSpace=Module.establishStackSpace,Runtime.setTempRet0=Module.setTempRet0,Runtime.getTempRet0=Module.getTempRet0,Module.asm=asm;function ExitStatus(t){this.name="ExitStatus",this.message="Program terminated with exit("+t+")",this.status=t}ExitStatus.prototype=new Error,ExitStatus.prototype.constructor=ExitStatus;var initialStackTop,preloadStartTime=null,calledMain=!1;dependenciesFulfilled=function t(){Module.calledRun||run(),Module.calledRun||(dependenciesFulfilled=t)},Module.callMain=Module.callMain=function t(e){e=e||[],ensureInitRuntime();var r=e.length+1;function o(){for(var p=0;p<3;p++)a.push(0)}var a=[allocate(intArrayFromString(Module.thisProgram),"i8",ALLOC_NORMAL)];o();for(var n=0;n0||(preRun(),runDependencies>0)||Module.calledRun)return;function e(){Module.calledRun||(Module.calledRun=!0,!ABORT&&(ensureInitRuntime(),preMain(),Module.onRuntimeInitialized&&Module.onRuntimeInitialized(),Module._main&&shouldRunNow&&Module.callMain(t),postRun()))}Module.setStatus?(Module.setStatus("Running..."),setTimeout(function(){setTimeout(function(){Module.setStatus("")},1),e()},1)):e()}Module.run=Module.run=run;function exit(t,e){e&&Module.noExitRuntime||(Module.noExitRuntime||(ABORT=!0,EXITSTATUS=t,STACKTOP=initialStackTop,exitRuntime(),Module.onExit&&Module.onExit(t)),ENVIRONMENT_IS_NODE&&process.exit(t),Module.quit(t,new ExitStatus(t)))}Module.exit=Module.exit=exit;var abortDecorators=[];function abort(t){Module.onAbort&&Module.onAbort(t),t!==void 0?(Module.print(t),Module.printErr(t),t=JSON.stringify(t)):t="",ABORT=!0,EXITSTATUS=1;var e=` -If this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.`,r="abort("+t+") at "+stackTrace()+e;throw abortDecorators&&abortDecorators.forEach(function(o){r=o(r,t)}),r}if(Module.abort=Module.abort=abort,Module.preInit)for(typeof Module.preInit=="function"&&(Module.preInit=[Module.preInit]);Module.preInit.length>0;)Module.preInit.pop()();var shouldRunNow=!0;Module.noInitialRun&&(shouldRunNow=!1),run()})});var id=_((nVt,PCe)=>{"use strict";var byt=DCe(),kyt=SCe(),pq=!1,hq=null;kyt({},function(t,e){if(!pq){if(pq=!0,t)throw t;hq=e}});if(!pq)throw new Error("Failed to load the yoga module - it needed to be loaded synchronously, but didn't");PCe.exports=byt(hq.bind,hq.lib)});var dq=_((iVt,gq)=>{"use strict";var xCe=t=>Number.isNaN(t)?!1:t>=4352&&(t<=4447||t===9001||t===9002||11904<=t&&t<=12871&&t!==12351||12880<=t&&t<=19903||19968<=t&&t<=42182||43360<=t&&t<=43388||44032<=t&&t<=55203||63744<=t&&t<=64255||65040<=t&&t<=65049||65072<=t&&t<=65131||65281<=t&&t<=65376||65504<=t&&t<=65510||110592<=t&&t<=110593||127488<=t&&t<=127569||131072<=t&&t<=262141);gq.exports=xCe;gq.exports.default=xCe});var kCe=_((sVt,bCe)=>{"use strict";bCe.exports=function(){return/\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g}});var SB=_((oVt,mq)=>{"use strict";var Qyt=hP(),Fyt=dq(),Ryt=kCe(),QCe=t=>{if(typeof t!="string"||t.length===0||(t=Qyt(t),t.length===0))return 0;t=t.replace(Ryt()," ");let e=0;for(let r=0;r=127&&o<=159||o>=768&&o<=879||(o>65535&&r++,e+=Fyt(o)?2:1)}return e};mq.exports=QCe;mq.exports.default=QCe});var Eq=_((aVt,yq)=>{"use strict";var Tyt=SB(),FCe=t=>{let e=0;for(let r of t.split(` -`))e=Math.max(e,Tyt(r));return e};yq.exports=FCe;yq.exports.default=FCe});var RCe=_(PB=>{"use strict";var Lyt=PB&&PB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(PB,"__esModule",{value:!0});var Nyt=Lyt(Eq()),Cq={};PB.default=t=>{if(t.length===0)return{width:0,height:0};if(Cq[t])return Cq[t];let e=Nyt.default(t),r=t.split(` -`).length;return Cq[t]={width:e,height:r},{width:e,height:r}}});var TCe=_(xB=>{"use strict";var Oyt=xB&&xB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(xB,"__esModule",{value:!0});var In=Oyt(id()),Myt=(t,e)=>{"position"in e&&t.setPositionType(e.position==="absolute"?In.default.POSITION_TYPE_ABSOLUTE:In.default.POSITION_TYPE_RELATIVE)},Uyt=(t,e)=>{"marginLeft"in e&&t.setMargin(In.default.EDGE_START,e.marginLeft||0),"marginRight"in e&&t.setMargin(In.default.EDGE_END,e.marginRight||0),"marginTop"in e&&t.setMargin(In.default.EDGE_TOP,e.marginTop||0),"marginBottom"in e&&t.setMargin(In.default.EDGE_BOTTOM,e.marginBottom||0)},_yt=(t,e)=>{"paddingLeft"in e&&t.setPadding(In.default.EDGE_LEFT,e.paddingLeft||0),"paddingRight"in e&&t.setPadding(In.default.EDGE_RIGHT,e.paddingRight||0),"paddingTop"in e&&t.setPadding(In.default.EDGE_TOP,e.paddingTop||0),"paddingBottom"in e&&t.setPadding(In.default.EDGE_BOTTOM,e.paddingBottom||0)},Hyt=(t,e)=>{var r;"flexGrow"in e&&t.setFlexGrow((r=e.flexGrow)!==null&&r!==void 0?r:0),"flexShrink"in e&&t.setFlexShrink(typeof e.flexShrink=="number"?e.flexShrink:1),"flexDirection"in e&&(e.flexDirection==="row"&&t.setFlexDirection(In.default.FLEX_DIRECTION_ROW),e.flexDirection==="row-reverse"&&t.setFlexDirection(In.default.FLEX_DIRECTION_ROW_REVERSE),e.flexDirection==="column"&&t.setFlexDirection(In.default.FLEX_DIRECTION_COLUMN),e.flexDirection==="column-reverse"&&t.setFlexDirection(In.default.FLEX_DIRECTION_COLUMN_REVERSE)),"flexBasis"in e&&(typeof e.flexBasis=="number"?t.setFlexBasis(e.flexBasis):typeof e.flexBasis=="string"?t.setFlexBasisPercent(Number.parseInt(e.flexBasis,10)):t.setFlexBasis(NaN)),"alignItems"in e&&((e.alignItems==="stretch"||!e.alignItems)&&t.setAlignItems(In.default.ALIGN_STRETCH),e.alignItems==="flex-start"&&t.setAlignItems(In.default.ALIGN_FLEX_START),e.alignItems==="center"&&t.setAlignItems(In.default.ALIGN_CENTER),e.alignItems==="flex-end"&&t.setAlignItems(In.default.ALIGN_FLEX_END)),"alignSelf"in e&&((e.alignSelf==="auto"||!e.alignSelf)&&t.setAlignSelf(In.default.ALIGN_AUTO),e.alignSelf==="flex-start"&&t.setAlignSelf(In.default.ALIGN_FLEX_START),e.alignSelf==="center"&&t.setAlignSelf(In.default.ALIGN_CENTER),e.alignSelf==="flex-end"&&t.setAlignSelf(In.default.ALIGN_FLEX_END)),"justifyContent"in e&&((e.justifyContent==="flex-start"||!e.justifyContent)&&t.setJustifyContent(In.default.JUSTIFY_FLEX_START),e.justifyContent==="center"&&t.setJustifyContent(In.default.JUSTIFY_CENTER),e.justifyContent==="flex-end"&&t.setJustifyContent(In.default.JUSTIFY_FLEX_END),e.justifyContent==="space-between"&&t.setJustifyContent(In.default.JUSTIFY_SPACE_BETWEEN),e.justifyContent==="space-around"&&t.setJustifyContent(In.default.JUSTIFY_SPACE_AROUND))},qyt=(t,e)=>{var r,o;"width"in e&&(typeof e.width=="number"?t.setWidth(e.width):typeof e.width=="string"?t.setWidthPercent(Number.parseInt(e.width,10)):t.setWidthAuto()),"height"in e&&(typeof e.height=="number"?t.setHeight(e.height):typeof e.height=="string"?t.setHeightPercent(Number.parseInt(e.height,10)):t.setHeightAuto()),"minWidth"in e&&(typeof e.minWidth=="string"?t.setMinWidthPercent(Number.parseInt(e.minWidth,10)):t.setMinWidth((r=e.minWidth)!==null&&r!==void 0?r:0)),"minHeight"in e&&(typeof e.minHeight=="string"?t.setMinHeightPercent(Number.parseInt(e.minHeight,10)):t.setMinHeight((o=e.minHeight)!==null&&o!==void 0?o:0))},jyt=(t,e)=>{"display"in e&&t.setDisplay(e.display==="flex"?In.default.DISPLAY_FLEX:In.default.DISPLAY_NONE)},Gyt=(t,e)=>{if("borderStyle"in e){let r=typeof e.borderStyle=="string"?1:0;t.setBorder(In.default.EDGE_TOP,r),t.setBorder(In.default.EDGE_BOTTOM,r),t.setBorder(In.default.EDGE_LEFT,r),t.setBorder(In.default.EDGE_RIGHT,r)}};xB.default=(t,e={})=>{Myt(t,e),Uyt(t,e),_yt(t,e),Hyt(t,e),qyt(t,e),jyt(t,e),Gyt(t,e)}});var OCe=_((uVt,NCe)=>{"use strict";var bB=SB(),Wyt=hP(),Yyt=qw(),wq=new Set(["\x1B","\x9B"]),Vyt=39,LCe=t=>`${wq.values().next().value}[${t}m`,Kyt=t=>t.split(" ").map(e=>bB(e)),Iq=(t,e,r)=>{let o=[...e],a=!1,n=bB(Wyt(t[t.length-1]));for(let[u,A]of o.entries()){let p=bB(A);if(n+p<=r?t[t.length-1]+=A:(t.push(A),n=0),wq.has(A))a=!0;else if(a&&A==="m"){a=!1;continue}a||(n+=p,n===r&&u0&&t.length>1&&(t[t.length-2]+=t.pop())},Jyt=t=>{let e=t.split(" "),r=e.length;for(;r>0&&!(bB(e[r-1])>0);)r--;return r===e.length?t:e.slice(0,r).join(" ")+e.slice(r).join("")},zyt=(t,e,r={})=>{if(r.trim!==!1&&t.trim()==="")return"";let o="",a="",n,u=Kyt(t),A=[""];for(let[p,h]of t.split(" ").entries()){r.trim!==!1&&(A[A.length-1]=A[A.length-1].trimLeft());let E=bB(A[A.length-1]);if(p!==0&&(E>=e&&(r.wordWrap===!1||r.trim===!1)&&(A.push(""),E=0),(E>0||r.trim===!1)&&(A[A.length-1]+=" ",E++)),r.hard&&u[p]>e){let w=e-E,D=1+Math.floor((u[p]-w-1)/e);Math.floor((u[p]-1)/e)e&&E>0&&u[p]>0){if(r.wordWrap===!1&&Ee&&r.wordWrap===!1){Iq(A,h,e);continue}A[A.length-1]+=h}r.trim!==!1&&(A=A.map(Jyt)),o=A.join(` -`);for(let[p,h]of[...o].entries()){if(a+=h,wq.has(h)){let w=parseFloat(/\d[^m]*/.exec(o.slice(p,p+4)));n=w===Vyt?null:w}let E=Yyt.codes.get(Number(n));n&&E&&(o[p+1]===` -`?a+=LCe(E):h===` -`&&(a+=LCe(n)))}return a};NCe.exports=(t,e,r)=>String(t).normalize().replace(/\r\n/g,` -`).split(` -`).map(o=>zyt(o,e,r)).join(` -`)});var _Ce=_((AVt,UCe)=>{"use strict";var MCe="[\uD800-\uDBFF][\uDC00-\uDFFF]",Xyt=t=>t&&t.exact?new RegExp(`^${MCe}$`):new RegExp(MCe,"g");UCe.exports=Xyt});var Bq=_((fVt,GCe)=>{"use strict";var Zyt=dq(),$yt=_Ce(),HCe=qw(),jCe=["\x1B","\x9B"],vQ=t=>`${jCe[0]}[${t}m`,qCe=(t,e,r)=>{let o=[];t=[...t];for(let a of t){let n=a;a.match(";")&&(a=a.split(";")[0][0]+"0");let u=HCe.codes.get(parseInt(a,10));if(u){let A=t.indexOf(u.toString());A>=0?t.splice(A,1):o.push(vQ(e?u:n))}else if(e){o.push(vQ(0));break}else o.push(vQ(n))}if(e&&(o=o.filter((a,n)=>o.indexOf(a)===n),r!==void 0)){let a=vQ(HCe.codes.get(parseInt(r,10)));o=o.reduce((n,u)=>u===a?[u,...n]:[...n,u],[])}return o.join("")};GCe.exports=(t,e,r)=>{let o=[...t.normalize()],a=[];r=typeof r=="number"?r:o.length;let n=!1,u,A=0,p="";for(let[h,E]of o.entries()){let w=!1;if(jCe.includes(E)){let D=/\d[^m]*/.exec(t.slice(h,h+18));u=D&&D.length>0?D[0]:void 0,Ae&&A<=r)p+=E;else if(A===e&&!n&&u!==void 0)p=qCe(a);else if(A>=r){p+=qCe(a,!0,u);break}}return p}});var YCe=_((pVt,WCe)=>{"use strict";var _h=Bq(),eEt=SB();function DQ(t,e,r){if(t.charAt(e)===" ")return e;for(let o=1;o<=3;o++)if(r){if(t.charAt(e+o)===" ")return e+o}else if(t.charAt(e-o)===" ")return e-o;return e}WCe.exports=(t,e,r)=>{r={position:"end",preferTruncationOnSpace:!1,...r};let{position:o,space:a,preferTruncationOnSpace:n}=r,u="\u2026",A=1;if(typeof t!="string")throw new TypeError(`Expected \`input\` to be a string, got ${typeof t}`);if(typeof e!="number")throw new TypeError(`Expected \`columns\` to be a number, got ${typeof e}`);if(e<1)return"";if(e===1)return u;let p=eEt(t);if(p<=e)return t;if(o==="start"){if(n){let h=DQ(t,p-e+1,!0);return u+_h(t,h,p).trim()}return a===!0&&(u+=" ",A=2),u+_h(t,p-e+A,p)}if(o==="middle"){a===!0&&(u=" "+u+" ",A=3);let h=Math.floor(e/2);if(n){let E=DQ(t,h),w=DQ(t,p-(e-h)+1,!0);return _h(t,0,E)+u+_h(t,w,p).trim()}return _h(t,0,h)+u+_h(t,p-(e-h)+A,p)}if(o==="end"){if(n){let h=DQ(t,e-1);return _h(t,0,h)+u}return a===!0&&(u=" "+u,A=2),_h(t,0,e-A)+u}throw new Error(`Expected \`options.position\` to be either \`start\`, \`middle\` or \`end\`, got ${o}`)}});var Dq=_(kB=>{"use strict";var VCe=kB&&kB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(kB,"__esModule",{value:!0});var tEt=VCe(OCe()),rEt=VCe(YCe()),vq={};kB.default=(t,e,r)=>{let o=t+String(e)+String(r);if(vq[o])return vq[o];let a=t;if(r==="wrap"&&(a=tEt.default(t,e,{trim:!1,hard:!0})),r.startsWith("truncate")){let n="end";r==="truncate-middle"&&(n="middle"),r==="truncate-start"&&(n="start"),a=rEt.default(t,e,{position:n})}return vq[o]=a,a}});var Pq=_(Sq=>{"use strict";Object.defineProperty(Sq,"__esModule",{value:!0});var KCe=t=>{let e="";if(t.childNodes.length>0)for(let r of t.childNodes){let o="";r.nodeName==="#text"?o=r.nodeValue:((r.nodeName==="ink-text"||r.nodeName==="ink-virtual-text")&&(o=KCe(r)),o.length>0&&typeof r.internal_transform=="function"&&(o=r.internal_transform(o))),e+=o}return e};Sq.default=KCe});var xq=_(Ei=>{"use strict";var QB=Ei&&Ei.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Ei,"__esModule",{value:!0});Ei.setTextNodeValue=Ei.createTextNode=Ei.setStyle=Ei.setAttribute=Ei.removeChildNode=Ei.insertBeforeNode=Ei.appendChildNode=Ei.createNode=Ei.TEXT_NAME=void 0;var nEt=QB(id()),JCe=QB(RCe()),iEt=QB(TCe()),sEt=QB(Dq()),oEt=QB(Pq());Ei.TEXT_NAME="#text";Ei.createNode=t=>{var e;let r={nodeName:t,style:{},attributes:{},childNodes:[],parentNode:null,yogaNode:t==="ink-virtual-text"?void 0:nEt.default.Node.create()};return t==="ink-text"&&((e=r.yogaNode)===null||e===void 0||e.setMeasureFunc(aEt.bind(null,r))),r};Ei.appendChildNode=(t,e)=>{var r;e.parentNode&&Ei.removeChildNode(e.parentNode,e),e.parentNode=t,t.childNodes.push(e),e.yogaNode&&((r=t.yogaNode)===null||r===void 0||r.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&SQ(t)};Ei.insertBeforeNode=(t,e,r)=>{var o,a;e.parentNode&&Ei.removeChildNode(e.parentNode,e),e.parentNode=t;let n=t.childNodes.indexOf(r);if(n>=0){t.childNodes.splice(n,0,e),e.yogaNode&&((o=t.yogaNode)===null||o===void 0||o.insertChild(e.yogaNode,n));return}t.childNodes.push(e),e.yogaNode&&((a=t.yogaNode)===null||a===void 0||a.insertChild(e.yogaNode,t.yogaNode.getChildCount())),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&SQ(t)};Ei.removeChildNode=(t,e)=>{var r,o;e.yogaNode&&((o=(r=e.parentNode)===null||r===void 0?void 0:r.yogaNode)===null||o===void 0||o.removeChild(e.yogaNode)),e.parentNode=null;let a=t.childNodes.indexOf(e);a>=0&&t.childNodes.splice(a,1),(t.nodeName==="ink-text"||t.nodeName==="ink-virtual-text")&&SQ(t)};Ei.setAttribute=(t,e,r)=>{t.attributes[e]=r};Ei.setStyle=(t,e)=>{t.style=e,t.yogaNode&&iEt.default(t.yogaNode,e)};Ei.createTextNode=t=>{let e={nodeName:"#text",nodeValue:t,yogaNode:void 0,parentNode:null,style:{}};return Ei.setTextNodeValue(e,t),e};var aEt=function(t,e){var r,o;let a=t.nodeName==="#text"?t.nodeValue:oEt.default(t),n=JCe.default(a);if(n.width<=e||n.width>=1&&e>0&&e<1)return n;let u=(o=(r=t.style)===null||r===void 0?void 0:r.textWrap)!==null&&o!==void 0?o:"wrap",A=sEt.default(a,e,u);return JCe.default(A)},zCe=t=>{var e;if(!(!t||!t.parentNode))return(e=t.yogaNode)!==null&&e!==void 0?e:zCe(t.parentNode)},SQ=t=>{let e=zCe(t);e?.markDirty()};Ei.setTextNodeValue=(t,e)=>{typeof e!="string"&&(e=String(e)),t.nodeValue=e,SQ(t)}});var tIe=_(FB=>{"use strict";var eIe=FB&&FB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(FB,"__esModule",{value:!0});var XCe=uq(),lEt=eIe(ECe()),ZCe=eIe(id()),ko=xq(),$Ce=t=>{t?.unsetMeasureFunc(),t?.freeRecursive()};FB.default=lEt.default({schedulePassiveEffects:XCe.unstable_scheduleCallback,cancelPassiveEffects:XCe.unstable_cancelCallback,now:Date.now,getRootHostContext:()=>({isInsideText:!1}),prepareForCommit:()=>null,preparePortalMount:()=>null,clearContainer:()=>!1,shouldDeprioritizeSubtree:()=>!1,resetAfterCommit:t=>{if(t.isStaticDirty){t.isStaticDirty=!1,typeof t.onImmediateRender=="function"&&t.onImmediateRender();return}typeof t.onRender=="function"&&t.onRender()},getChildHostContext:(t,e)=>{let r=t.isInsideText,o=e==="ink-text"||e==="ink-virtual-text";return r===o?t:{isInsideText:o}},shouldSetTextContent:()=>!1,createInstance:(t,e,r,o)=>{if(o.isInsideText&&t==="ink-box")throw new Error(" can\u2019t be nested inside component");let a=t==="ink-text"&&o.isInsideText?"ink-virtual-text":t,n=ko.createNode(a);for(let[u,A]of Object.entries(e))u!=="children"&&(u==="style"?ko.setStyle(n,A):u==="internal_transform"?n.internal_transform=A:u==="internal_static"?n.internal_static=!0:ko.setAttribute(n,u,A));return n},createTextInstance:(t,e,r)=>{if(!r.isInsideText)throw new Error(`Text string "${t}" must be rendered inside component`);return ko.createTextNode(t)},resetTextContent:()=>{},hideTextInstance:t=>{ko.setTextNodeValue(t,"")},unhideTextInstance:(t,e)=>{ko.setTextNodeValue(t,e)},getPublicInstance:t=>t,hideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(ZCe.default.DISPLAY_NONE)},unhideInstance:t=>{var e;(e=t.yogaNode)===null||e===void 0||e.setDisplay(ZCe.default.DISPLAY_FLEX)},appendInitialChild:ko.appendChildNode,appendChild:ko.appendChildNode,insertBefore:ko.insertBeforeNode,finalizeInitialChildren:(t,e,r,o)=>(t.internal_static&&(o.isStaticDirty=!0,o.staticNode=t),!1),supportsMutation:!0,appendChildToContainer:ko.appendChildNode,insertInContainerBefore:ko.insertBeforeNode,removeChildFromContainer:(t,e)=>{ko.removeChildNode(t,e),$Ce(e.yogaNode)},prepareUpdate:(t,e,r,o,a)=>{t.internal_static&&(a.isStaticDirty=!0);let n={},u=Object.keys(o);for(let A of u)if(o[A]!==r[A]){if(A==="style"&&typeof o.style=="object"&&typeof r.style=="object"){let h=o.style,E=r.style,w=Object.keys(h);for(let D of w){if(D==="borderStyle"||D==="borderColor"){if(typeof n.style!="object"){let b={};n.style=b}n.style.borderStyle=h.borderStyle,n.style.borderColor=h.borderColor}if(h[D]!==E[D]){if(typeof n.style!="object"){let b={};n.style=b}n.style[D]=h[D]}}continue}n[A]=o[A]}return n},commitUpdate:(t,e)=>{for(let[r,o]of Object.entries(e))r!=="children"&&(r==="style"?ko.setStyle(t,o):r==="internal_transform"?t.internal_transform=o:r==="internal_static"?t.internal_static=!0:ko.setAttribute(t,r,o))},commitTextUpdate:(t,e,r)=>{ko.setTextNodeValue(t,r)},removeChild:(t,e)=>{ko.removeChildNode(t,e),$Ce(e.yogaNode)}})});var nIe=_((yVt,rIe)=>{"use strict";rIe.exports=(t,e=1,r)=>{if(r={indent:" ",includeEmptyLines:!1,...r},typeof t!="string")throw new TypeError(`Expected \`input\` to be a \`string\`, got \`${typeof t}\``);if(typeof e!="number")throw new TypeError(`Expected \`count\` to be a \`number\`, got \`${typeof e}\``);if(typeof r.indent!="string")throw new TypeError(`Expected \`options.indent\` to be a \`string\`, got \`${typeof r.indent}\``);if(e===0)return t;let o=r.includeEmptyLines?/^/gm:/^(?!\s*$)/gm;return t.replace(o,r.indent.repeat(e))}});var iIe=_(RB=>{"use strict";var cEt=RB&&RB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(RB,"__esModule",{value:!0});var PQ=cEt(id());RB.default=t=>t.getComputedWidth()-t.getComputedPadding(PQ.default.EDGE_LEFT)-t.getComputedPadding(PQ.default.EDGE_RIGHT)-t.getComputedBorder(PQ.default.EDGE_LEFT)-t.getComputedBorder(PQ.default.EDGE_RIGHT)});var sIe=_((CVt,uEt)=>{uEt.exports={single:{topLeft:"\u250C",topRight:"\u2510",bottomRight:"\u2518",bottomLeft:"\u2514",vertical:"\u2502",horizontal:"\u2500"},double:{topLeft:"\u2554",topRight:"\u2557",bottomRight:"\u255D",bottomLeft:"\u255A",vertical:"\u2551",horizontal:"\u2550"},round:{topLeft:"\u256D",topRight:"\u256E",bottomRight:"\u256F",bottomLeft:"\u2570",vertical:"\u2502",horizontal:"\u2500"},bold:{topLeft:"\u250F",topRight:"\u2513",bottomRight:"\u251B",bottomLeft:"\u2517",vertical:"\u2503",horizontal:"\u2501"},singleDouble:{topLeft:"\u2553",topRight:"\u2556",bottomRight:"\u255C",bottomLeft:"\u2559",vertical:"\u2551",horizontal:"\u2500"},doubleSingle:{topLeft:"\u2552",topRight:"\u2555",bottomRight:"\u255B",bottomLeft:"\u2558",vertical:"\u2502",horizontal:"\u2550"},classic:{topLeft:"+",topRight:"+",bottomRight:"+",bottomLeft:"+",vertical:"|",horizontal:"-"}}});var aIe=_((IVt,bq)=>{"use strict";var oIe=sIe();bq.exports=oIe;bq.exports.default=oIe});var cIe=_((wVt,lIe)=>{"use strict";var AEt=(t,e,r)=>{let o=t.indexOf(e);if(o===-1)return t;let a=e.length,n=0,u="";do u+=t.substr(n,o-n)+e+r,n=o+a,o=t.indexOf(e,n);while(o!==-1);return u+=t.substr(n),u},fEt=(t,e,r,o)=>{let a=0,n="";do{let u=t[o-1]==="\r";n+=t.substr(a,(u?o-1:o)-a)+e+(u?`\r -`:` -`)+r,a=o+1,o=t.indexOf(` -`,a)}while(o!==-1);return n+=t.substr(a),n};lIe.exports={stringReplaceAll:AEt,stringEncaseCRLFWithFirstIndex:fEt}});var hIe=_((BVt,pIe)=>{"use strict";var pEt=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,uIe=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,hEt=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,gEt=/\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi,dEt=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e","\x1B"],["a","\x07"]]);function fIe(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):dEt.get(t)||t}function mEt(t,e){let r=[],o=e.trim().split(/\s*,\s*/g),a;for(let n of o){let u=Number(n);if(!Number.isNaN(u))r.push(u);else if(a=n.match(hEt))r.push(a[2].replace(gEt,(A,p,h)=>p?fIe(p):h));else throw new Error(`Invalid Chalk template style argument: ${n} (in style '${t}')`)}return r}function yEt(t){uIe.lastIndex=0;let e=[],r;for(;(r=uIe.exec(t))!==null;){let o=r[1];if(r[2]){let a=mEt(o,r[2]);e.push([o].concat(a))}else e.push([o])}return e}function AIe(t,e){let r={};for(let a of e)for(let n of a.styles)r[n[0]]=a.inverse?null:n.slice(1);let o=t;for(let[a,n]of Object.entries(r))if(Array.isArray(n)){if(!(a in o))throw new Error(`Unknown Chalk style: ${a}`);o=n.length>0?o[a](...n):o[a]}return o}pIe.exports=(t,e)=>{let r=[],o=[],a=[];if(e.replace(pEt,(n,u,A,p,h,E)=>{if(u)a.push(fIe(u));else if(p){let w=a.join("");a=[],o.push(r.length===0?w:AIe(t,r)(w)),r.push({inverse:A,styles:yEt(p)})}else if(h){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");o.push(AIe(t,r)(a.join(""))),a=[],r.pop()}else a.push(E)}),o.push(a.join("")),r.length>0){let n=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(n)}return o.join("")}});var FQ=_((vVt,CIe)=>{"use strict";var TB=qw(),{stdout:Qq,stderr:Fq}=$L(),{stringReplaceAll:EEt,stringEncaseCRLFWithFirstIndex:CEt}=cIe(),{isArray:xQ}=Array,dIe=["ansi","ansi","ansi256","ansi16m"],DC=Object.create(null),IEt=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let r=Qq?Qq.level:0;t.level=e.level===void 0?r:e.level},Rq=class{constructor(e){return mIe(e)}},mIe=t=>{let e={};return IEt(e,t),e.template=(...r)=>EIe(e.template,...r),Object.setPrototypeOf(e,bQ.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=Rq,e.template};function bQ(t){return mIe(t)}for(let[t,e]of Object.entries(TB))DC[t]={get(){let r=kQ(this,Tq(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};DC.visible={get(){let t=kQ(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var yIe=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of yIe)DC[t]={get(){let{level:e}=this;return function(...r){let o=Tq(TB.color[dIe[e]][t](...r),TB.color.close,this._styler);return kQ(this,o,this._isEmpty)}}};for(let t of yIe){let e="bg"+t[0].toUpperCase()+t.slice(1);DC[e]={get(){let{level:r}=this;return function(...o){let a=Tq(TB.bgColor[dIe[r]][t](...o),TB.bgColor.close,this._styler);return kQ(this,a,this._isEmpty)}}}}var wEt=Object.defineProperties(()=>{},{...DC,level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}}),Tq=(t,e,r)=>{let o,a;return r===void 0?(o=t,a=e):(o=r.openAll+t,a=e+r.closeAll),{open:t,close:e,openAll:o,closeAll:a,parent:r}},kQ=(t,e,r)=>{let o=(...a)=>xQ(a[0])&&xQ(a[0].raw)?gIe(o,EIe(o,...a)):gIe(o,a.length===1?""+a[0]:a.join(" "));return Object.setPrototypeOf(o,wEt),o._generator=t,o._styler=e,o._isEmpty=r,o},gIe=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:o,closeAll:a}=r;if(e.indexOf("\x1B")!==-1)for(;r!==void 0;)e=EEt(e,r.close,r.open),r=r.parent;let n=e.indexOf(` -`);return n!==-1&&(e=CEt(e,a,o,n)),o+e+a},kq,EIe=(t,...e)=>{let[r]=e;if(!xQ(r)||!xQ(r.raw))return e.join(" ");let o=e.slice(1),a=[r.raw[0]];for(let n=1;n{"use strict";var BEt=NB&&NB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(NB,"__esModule",{value:!0});var LB=BEt(FQ()),vEt=/^(rgb|hsl|hsv|hwb)\(\s?(\d+),\s?(\d+),\s?(\d+)\s?\)$/,DEt=/^(ansi|ansi256)\(\s?(\d+)\s?\)$/,RQ=(t,e)=>e==="foreground"?t:"bg"+t[0].toUpperCase()+t.slice(1);NB.default=(t,e,r)=>{if(!e)return t;if(e in LB.default){let a=RQ(e,r);return LB.default[a](t)}if(e.startsWith("#")){let a=RQ("hex",r);return LB.default[a](e)(t)}if(e.startsWith("ansi")){let a=DEt.exec(e);if(!a)return t;let n=RQ(a[1],r),u=Number(a[2]);return LB.default[n](u)(t)}if(e.startsWith("rgb")||e.startsWith("hsl")||e.startsWith("hsv")||e.startsWith("hwb")){let a=vEt.exec(e);if(!a)return t;let n=RQ(a[1],r),u=Number(a[2]),A=Number(a[3]),p=Number(a[4]);return LB.default[n](u,A,p)(t)}return t}});var wIe=_(OB=>{"use strict";var IIe=OB&&OB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(OB,"__esModule",{value:!0});var SEt=IIe(aIe()),Nq=IIe(Lq());OB.default=(t,e,r,o)=>{if(typeof r.style.borderStyle=="string"){let a=r.yogaNode.getComputedWidth(),n=r.yogaNode.getComputedHeight(),u=r.style.borderColor,A=SEt.default[r.style.borderStyle],p=Nq.default(A.topLeft+A.horizontal.repeat(a-2)+A.topRight,u,"foreground"),h=(Nq.default(A.vertical,u,"foreground")+` -`).repeat(n-2),E=Nq.default(A.bottomLeft+A.horizontal.repeat(a-2)+A.bottomRight,u,"foreground");o.write(t,e,p,{transformers:[]}),o.write(t,e+1,h,{transformers:[]}),o.write(t+a-1,e+1,h,{transformers:[]}),o.write(t,e+n-1,E,{transformers:[]})}}});var vIe=_(MB=>{"use strict";var sd=MB&&MB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(MB,"__esModule",{value:!0});var PEt=sd(id()),xEt=sd(Eq()),bEt=sd(nIe()),kEt=sd(Dq()),QEt=sd(iIe()),FEt=sd(Pq()),REt=sd(wIe()),TEt=(t,e)=>{var r;let o=(r=t.childNodes[0])===null||r===void 0?void 0:r.yogaNode;if(o){let a=o.getComputedLeft(),n=o.getComputedTop();e=` -`.repeat(n)+bEt.default(e,a)}return e},BIe=(t,e,r)=>{var o;let{offsetX:a=0,offsetY:n=0,transformers:u=[],skipStaticElements:A}=r;if(A&&t.internal_static)return;let{yogaNode:p}=t;if(p){if(p.getDisplay()===PEt.default.DISPLAY_NONE)return;let h=a+p.getComputedLeft(),E=n+p.getComputedTop(),w=u;if(typeof t.internal_transform=="function"&&(w=[t.internal_transform,...u]),t.nodeName==="ink-text"){let D=FEt.default(t);if(D.length>0){let b=xEt.default(D),C=QEt.default(p);if(b>C){let T=(o=t.style.textWrap)!==null&&o!==void 0?o:"wrap";D=kEt.default(D,C,T)}D=TEt(t,D),e.write(h,E,D,{transformers:w})}return}if(t.nodeName==="ink-box"&&REt.default(h,E,t,e),t.nodeName==="ink-root"||t.nodeName==="ink-box")for(let D of t.childNodes)BIe(D,e,{offsetX:h,offsetY:E,transformers:w,skipStaticElements:A})}};MB.default=BIe});var PIe=_(UB=>{"use strict";var SIe=UB&&UB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(UB,"__esModule",{value:!0});var DIe=SIe(Bq()),LEt=SIe(SB()),Oq=class{constructor(e){this.writes=[];let{width:r,height:o}=e;this.width=r,this.height=o}write(e,r,o,a){let{transformers:n}=a;o&&this.writes.push({x:e,y:r,text:o,transformers:n})}get(){let e=[];for(let o=0;oo.trimRight()).join(` -`),height:e.length}}};UB.default=Oq});var kIe=_(_B=>{"use strict";var Mq=_B&&_B.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(_B,"__esModule",{value:!0});var NEt=Mq(id()),xIe=Mq(vIe()),bIe=Mq(PIe());_B.default=(t,e)=>{var r;if(t.yogaNode.setWidth(e),t.yogaNode){t.yogaNode.calculateLayout(void 0,void 0,NEt.default.DIRECTION_LTR);let o=new bIe.default({width:t.yogaNode.getComputedWidth(),height:t.yogaNode.getComputedHeight()});xIe.default(t,o,{skipStaticElements:!0});let a;!((r=t.staticNode)===null||r===void 0)&&r.yogaNode&&(a=new bIe.default({width:t.staticNode.yogaNode.getComputedWidth(),height:t.staticNode.yogaNode.getComputedHeight()}),xIe.default(t.staticNode,a,{skipStaticElements:!1}));let{output:n,height:u}=o.get();return{output:n,outputHeight:u,staticOutput:a?`${a.get().output} -`:""}}return{output:"",outputHeight:0,staticOutput:""}}});var TIe=_((kVt,RIe)=>{"use strict";var QIe=ve("stream"),FIe=["assert","count","countReset","debug","dir","dirxml","error","group","groupCollapsed","groupEnd","info","log","table","time","timeEnd","timeLog","trace","warn"],Uq={},OEt=t=>{let e=new QIe.PassThrough,r=new QIe.PassThrough;e.write=a=>t("stdout",a),r.write=a=>t("stderr",a);let o=new console.Console(e,r);for(let a of FIe)Uq[a]=console[a],console[a]=o[a];return()=>{for(let a of FIe)console[a]=Uq[a];Uq={}}};RIe.exports=OEt});var Hq=_(_q=>{"use strict";Object.defineProperty(_q,"__esModule",{value:!0});_q.default=new WeakMap});var jq=_(qq=>{"use strict";Object.defineProperty(qq,"__esModule",{value:!0});var MEt=ln(),LIe=MEt.createContext({exit:()=>{}});LIe.displayName="InternalAppContext";qq.default=LIe});var Wq=_(Gq=>{"use strict";Object.defineProperty(Gq,"__esModule",{value:!0});var UEt=ln(),NIe=UEt.createContext({stdin:void 0,setRawMode:()=>{},isRawModeSupported:!1,internal_exitOnCtrlC:!0});NIe.displayName="InternalStdinContext";Gq.default=NIe});var Vq=_(Yq=>{"use strict";Object.defineProperty(Yq,"__esModule",{value:!0});var _Et=ln(),OIe=_Et.createContext({stdout:void 0,write:()=>{}});OIe.displayName="InternalStdoutContext";Yq.default=OIe});var Jq=_(Kq=>{"use strict";Object.defineProperty(Kq,"__esModule",{value:!0});var HEt=ln(),MIe=HEt.createContext({stderr:void 0,write:()=>{}});MIe.displayName="InternalStderrContext";Kq.default=MIe});var TQ=_(zq=>{"use strict";Object.defineProperty(zq,"__esModule",{value:!0});var qEt=ln(),UIe=qEt.createContext({activeId:void 0,add:()=>{},remove:()=>{},activate:()=>{},deactivate:()=>{},enableFocus:()=>{},disableFocus:()=>{},focusNext:()=>{},focusPrevious:()=>{},focus:()=>{}});UIe.displayName="InternalFocusContext";zq.default=UIe});var HIe=_((OVt,_Ie)=>{"use strict";var jEt=/[|\\{}()[\]^$+*?.-]/g;_Ie.exports=t=>{if(typeof t!="string")throw new TypeError("Expected a string");return t.replace(jEt,"\\$&")}});var WIe=_((MVt,GIe)=>{"use strict";var GEt=HIe(),WEt=typeof process=="object"&&process&&typeof process.cwd=="function"?process.cwd():".",jIe=[].concat(ve("module").builtinModules,"bootstrap_node","node").map(t=>new RegExp(`(?:\\((?:node:)?${t}(?:\\.js)?:\\d+:\\d+\\)$|^\\s*at (?:node:)?${t}(?:\\.js)?:\\d+:\\d+$)`));jIe.push(/\((?:node:)?internal\/[^:]+:\d+:\d+\)$/,/\s*at (?:node:)?internal\/[^:]+:\d+:\d+$/,/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/);var Xq=class t{constructor(e){e={ignoredPackages:[],...e},"internals"in e||(e.internals=t.nodeInternals()),"cwd"in e||(e.cwd=WEt),this._cwd=e.cwd.replace(/\\/g,"/"),this._internals=[].concat(e.internals,YEt(e.ignoredPackages)),this._wrapCallSite=e.wrapCallSite||!1}static nodeInternals(){return[...jIe]}clean(e,r=0){r=" ".repeat(r),Array.isArray(e)||(e=e.split(` -`)),!/^\s*at /.test(e[0])&&/^\s*at /.test(e[1])&&(e=e.slice(1));let o=!1,a=null,n=[];return e.forEach(u=>{if(u=u.replace(/\\/g,"/"),this._internals.some(p=>p.test(u)))return;let A=/^\s*at /.test(u);o?u=u.trimEnd().replace(/^(\s+)at /,"$1"):(u=u.trim(),A&&(u=u.slice(3))),u=u.replace(`${this._cwd}/`,""),u&&(A?(a&&(n.push(a),a=null),n.push(u)):(o=!0,a=u))}),n.map(u=>`${r}${u} -`).join("")}captureString(e,r=this.captureString){typeof e=="function"&&(r=e,e=1/0);let{stackTraceLimit:o}=Error;e&&(Error.stackTraceLimit=e);let a={};Error.captureStackTrace(a,r);let{stack:n}=a;return Error.stackTraceLimit=o,this.clean(n)}capture(e,r=this.capture){typeof e=="function"&&(r=e,e=1/0);let{prepareStackTrace:o,stackTraceLimit:a}=Error;Error.prepareStackTrace=(A,p)=>this._wrapCallSite?p.map(this._wrapCallSite):p,e&&(Error.stackTraceLimit=e);let n={};Error.captureStackTrace(n,r);let{stack:u}=n;return Object.assign(Error,{prepareStackTrace:o,stackTraceLimit:a}),u}at(e=this.at){let[r]=this.capture(1,e);if(!r)return{};let o={line:r.getLineNumber(),column:r.getColumnNumber()};qIe(o,r.getFileName(),this._cwd),r.isConstructor()&&(o.constructor=!0),r.isEval()&&(o.evalOrigin=r.getEvalOrigin()),r.isNative()&&(o.native=!0);let a;try{a=r.getTypeName()}catch{}a&&a!=="Object"&&a!=="[object Object]"&&(o.type=a);let n=r.getFunctionName();n&&(o.function=n);let u=r.getMethodName();return u&&n!==u&&(o.method=u),o}parseLine(e){let r=e&&e.match(VEt);if(!r)return null;let o=r[1]==="new",a=r[2],n=r[3],u=r[4],A=Number(r[5]),p=Number(r[6]),h=r[7],E=r[8],w=r[9],D=r[10]==="native",b=r[11]===")",C,T={};if(E&&(T.line=Number(E)),w&&(T.column=Number(w)),b&&h){let N=0;for(let U=h.length-1;U>0;U--)if(h.charAt(U)===")")N++;else if(h.charAt(U)==="("&&h.charAt(U-1)===" "&&(N--,N===-1&&h.charAt(U-1)===" ")){let J=h.slice(0,U-1);h=h.slice(U+1),a+=` (${J}`;break}}if(a){let N=a.match(KEt);N&&(a=N[1],C=N[2])}return qIe(T,h,this._cwd),o&&(T.constructor=!0),n&&(T.evalOrigin=n,T.evalLine=A,T.evalColumn=p,T.evalFile=u&&u.replace(/\\/g,"/")),D&&(T.native=!0),a&&(T.function=a),C&&a!==C&&(T.method=C),T}};function qIe(t,e,r){e&&(e=e.replace(/\\/g,"/"),e.startsWith(`${r}/`)&&(e=e.slice(r.length+1)),t.file=e)}function YEt(t){if(t.length===0)return[];let e=t.map(r=>GEt(r));return new RegExp(`[/\\\\]node_modules[/\\\\](?:${e.join("|")})[/\\\\][^:]+:\\d+:\\d+`)}var VEt=new RegExp("^(?:\\s*at )?(?:(new) )?(?:(.*?) \\()?(?:eval at ([^ ]+) \\((.+?):(\\d+):(\\d+)\\), )?(?:(.+?):(\\d+):(\\d+)|(native))(\\)?)$"),KEt=/^(.*?) \[as (.*?)\]$/;GIe.exports=Xq});var VIe=_((UVt,YIe)=>{"use strict";YIe.exports=(t,e)=>t.replace(/^\t+/gm,r=>" ".repeat(r.length*(e||2)))});var JIe=_((_Vt,KIe)=>{"use strict";var JEt=VIe(),zEt=(t,e)=>{let r=[],o=t-e,a=t+e;for(let n=o;n<=a;n++)r.push(n);return r};KIe.exports=(t,e,r)=>{if(typeof t!="string")throw new TypeError("Source code is missing.");if(!e||e<1)throw new TypeError("Line number must start from `1`.");if(t=JEt(t).split(/\r?\n/),!(e>t.length))return r={around:3,...r},zEt(e,r.around).filter(o=>t[o-1]!==void 0).map(o=>({line:o,value:t[o-1]}))}});var LQ=_(lu=>{"use strict";var XEt=lu&&lu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),ZEt=lu&&lu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),$Et=lu&&lu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&XEt(e,t,r);return ZEt(e,t),e},eCt=lu&&lu.__rest||function(t,e){var r={};for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&e.indexOf(o)<0&&(r[o]=t[o]);if(t!=null&&typeof Object.getOwnPropertySymbols=="function")for(var a=0,o=Object.getOwnPropertySymbols(t);a{var{children:r}=t,o=eCt(t,["children"]);let a=Object.assign(Object.assign({},o),{marginLeft:o.marginLeft||o.marginX||o.margin||0,marginRight:o.marginRight||o.marginX||o.margin||0,marginTop:o.marginTop||o.marginY||o.margin||0,marginBottom:o.marginBottom||o.marginY||o.margin||0,paddingLeft:o.paddingLeft||o.paddingX||o.padding||0,paddingRight:o.paddingRight||o.paddingX||o.padding||0,paddingTop:o.paddingTop||o.paddingY||o.padding||0,paddingBottom:o.paddingBottom||o.paddingY||o.padding||0});return zIe.default.createElement("ink-box",{ref:e,style:a},r)});Zq.displayName="Box";Zq.defaultProps={flexDirection:"row",flexGrow:0,flexShrink:1};lu.default=Zq});var tj=_(HB=>{"use strict";var $q=HB&&HB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(HB,"__esModule",{value:!0});var tCt=$q(ln()),SC=$q(FQ()),XIe=$q(Lq()),ej=({color:t,backgroundColor:e,dimColor:r,bold:o,italic:a,underline:n,strikethrough:u,inverse:A,wrap:p,children:h})=>{if(h==null)return null;let E=w=>(r&&(w=SC.default.dim(w)),t&&(w=XIe.default(w,t,"foreground")),e&&(w=XIe.default(w,e,"background")),o&&(w=SC.default.bold(w)),a&&(w=SC.default.italic(w)),n&&(w=SC.default.underline(w)),u&&(w=SC.default.strikethrough(w)),A&&(w=SC.default.inverse(w)),w);return tCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row",textWrap:p},internal_transform:E},h)};ej.displayName="Text";ej.defaultProps={dimColor:!1,bold:!1,italic:!1,underline:!1,strikethrough:!1,wrap:"wrap"};HB.default=ej});var twe=_(cu=>{"use strict";var rCt=cu&&cu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),nCt=cu&&cu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),iCt=cu&&cu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&rCt(e,t,r);return nCt(e,t),e},qB=cu&&cu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(cu,"__esModule",{value:!0});var ZIe=iCt(ve("fs")),ps=qB(ln()),$Ie=qB(WIe()),sCt=qB(JIe()),Jf=qB(LQ()),mA=qB(tj()),ewe=new $Ie.default({cwd:process.cwd(),internals:$Ie.default.nodeInternals()}),oCt=({error:t})=>{let e=t.stack?t.stack.split(` -`).slice(1):void 0,r=e?ewe.parseLine(e[0]):void 0,o,a=0;if(r?.file&&r?.line&&ZIe.existsSync(r.file)){let n=ZIe.readFileSync(r.file,"utf8");if(o=sCt.default(n,r.line),o)for(let{line:u}of o)a=Math.max(a,String(u).length)}return ps.default.createElement(Jf.default,{flexDirection:"column",padding:1},ps.default.createElement(Jf.default,null,ps.default.createElement(mA.default,{backgroundColor:"red",color:"white"}," ","ERROR"," "),ps.default.createElement(mA.default,null," ",t.message)),r&&ps.default.createElement(Jf.default,{marginTop:1},ps.default.createElement(mA.default,{dimColor:!0},r.file,":",r.line,":",r.column)),r&&o&&ps.default.createElement(Jf.default,{marginTop:1,flexDirection:"column"},o.map(({line:n,value:u})=>ps.default.createElement(Jf.default,{key:n},ps.default.createElement(Jf.default,{width:a+1},ps.default.createElement(mA.default,{dimColor:n!==r.line,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0},String(n).padStart(a," "),":")),ps.default.createElement(mA.default,{key:n,backgroundColor:n===r.line?"red":void 0,color:n===r.line?"white":void 0}," "+u)))),t.stack&&ps.default.createElement(Jf.default,{marginTop:1,flexDirection:"column"},t.stack.split(` -`).slice(1).map(n=>{let u=ewe.parseLine(n);return u?ps.default.createElement(Jf.default,{key:n},ps.default.createElement(mA.default,{dimColor:!0},"- "),ps.default.createElement(mA.default,{dimColor:!0,bold:!0},u.function),ps.default.createElement(mA.default,{dimColor:!0,color:"gray"}," ","(",u.file,":",u.line,":",u.column,")")):ps.default.createElement(Jf.default,{key:n},ps.default.createElement(mA.default,{dimColor:!0},"- "),ps.default.createElement(mA.default,{dimColor:!0,bold:!0},n))})))};cu.default=oCt});var nwe=_(uu=>{"use strict";var aCt=uu&&uu.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),lCt=uu&&uu.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),cCt=uu&&uu.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&aCt(e,t,r);return lCt(e,t),e},ad=uu&&uu.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(uu,"__esModule",{value:!0});var od=cCt(ln()),rwe=ad(Z6()),uCt=ad(jq()),ACt=ad(Wq()),fCt=ad(Vq()),pCt=ad(Jq()),hCt=ad(TQ()),gCt=ad(twe()),dCt=" ",mCt="\x1B[Z",yCt="\x1B",NQ=class extends od.PureComponent{constructor(){super(...arguments),this.state={isFocusEnabled:!0,activeFocusId:void 0,focusables:[],error:void 0},this.rawModeEnabledCount=0,this.handleSetRawMode=e=>{let{stdin:r}=this.props;if(!this.isRawModeSupported())throw r===process.stdin?new Error(`Raw mode is not supported on the current process.stdin, which Ink uses as input stream by default. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`):new Error(`Raw mode is not supported on the stdin provided to Ink. -Read about how to prevent this error on https://github.com/vadimdemedes/ink/#israwmodesupported`);if(r.setEncoding("utf8"),e){this.rawModeEnabledCount===0&&(r.addListener("data",this.handleInput),r.resume(),r.setRawMode(!0)),this.rawModeEnabledCount++;return}--this.rawModeEnabledCount===0&&(r.setRawMode(!1),r.removeListener("data",this.handleInput),r.pause())},this.handleInput=e=>{e===""&&this.props.exitOnCtrlC&&this.handleExit(),e===yCt&&this.state.activeFocusId&&this.setState({activeFocusId:void 0}),this.state.isFocusEnabled&&this.state.focusables.length>0&&(e===dCt&&this.focusNext(),e===mCt&&this.focusPrevious())},this.handleExit=e=>{this.isRawModeSupported()&&this.handleSetRawMode(!1),this.props.onExit(e)},this.enableFocus=()=>{this.setState({isFocusEnabled:!0})},this.disableFocus=()=>{this.setState({isFocusEnabled:!1})},this.focus=e=>{this.setState(r=>r.focusables.some(a=>a?.id===e)?{activeFocusId:e}:r)},this.focusNext=()=>{this.setState(e=>{var r;let o=(r=e.focusables[0])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findNextFocusable(e)||o}})},this.focusPrevious=()=>{this.setState(e=>{var r;let o=(r=e.focusables[e.focusables.length-1])===null||r===void 0?void 0:r.id;return{activeFocusId:this.findPreviousFocusable(e)||o}})},this.addFocusable=(e,{autoFocus:r})=>{this.setState(o=>{let a=o.activeFocusId;return!a&&r&&(a=e),{activeFocusId:a,focusables:[...o.focusables,{id:e,isActive:!0}]}})},this.removeFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.filter(o=>o.id!==e)}))},this.activateFocusable=e=>{this.setState(r=>({focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!0})}))},this.deactivateFocusable=e=>{this.setState(r=>({activeFocusId:r.activeFocusId===e?void 0:r.activeFocusId,focusables:r.focusables.map(o=>o.id!==e?o:{id:e,isActive:!1})}))},this.findNextFocusable=e=>{var r;let o=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=o+1;a{var r;let o=e.focusables.findIndex(a=>a.id===e.activeFocusId);for(let a=o-1;a>=0;a--)if(!((r=e.focusables[a])===null||r===void 0)&&r.isActive)return e.focusables[a].id}}static getDerivedStateFromError(e){return{error:e}}isRawModeSupported(){return this.props.stdin.isTTY}render(){return od.default.createElement(uCt.default.Provider,{value:{exit:this.handleExit}},od.default.createElement(ACt.default.Provider,{value:{stdin:this.props.stdin,setRawMode:this.handleSetRawMode,isRawModeSupported:this.isRawModeSupported(),internal_exitOnCtrlC:this.props.exitOnCtrlC}},od.default.createElement(fCt.default.Provider,{value:{stdout:this.props.stdout,write:this.props.writeToStdout}},od.default.createElement(pCt.default.Provider,{value:{stderr:this.props.stderr,write:this.props.writeToStderr}},od.default.createElement(hCt.default.Provider,{value:{activeId:this.state.activeFocusId,add:this.addFocusable,remove:this.removeFocusable,activate:this.activateFocusable,deactivate:this.deactivateFocusable,enableFocus:this.enableFocus,disableFocus:this.disableFocus,focusNext:this.focusNext,focusPrevious:this.focusPrevious,focus:this.focus}},this.state.error?od.default.createElement(gCt.default,{error:this.state.error}):this.props.children)))))}componentDidMount(){rwe.default.hide(this.props.stdout)}componentWillUnmount(){rwe.default.show(this.props.stdout),this.isRawModeSupported()&&this.handleSetRawMode(!1)}componentDidCatch(e){this.handleExit(e)}};uu.default=NQ;NQ.displayName="InternalApp"});var owe=_(Au=>{"use strict";var ECt=Au&&Au.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),CCt=Au&&Au.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),ICt=Au&&Au.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&ECt(e,t,r);return CCt(e,t),e},fu=Au&&Au.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(Au,"__esModule",{value:!0});var wCt=fu(ln()),iwe=WM(),BCt=fu(tCe()),vCt=fu(V6()),DCt=fu(aCe()),SCt=fu(cCe()),rj=fu(tIe()),PCt=fu(kIe()),xCt=fu(X6()),bCt=fu(TIe()),kCt=ICt(xq()),QCt=fu(Hq()),FCt=fu(nwe()),PC=process.env.CI==="false"?!1:DCt.default,swe=()=>{},nj=class{constructor(e){this.resolveExitPromise=()=>{},this.rejectExitPromise=()=>{},this.unsubscribeExit=()=>{},this.onRender=()=>{if(this.isUnmounted)return;let{output:r,outputHeight:o,staticOutput:a}=PCt.default(this.rootNode,this.options.stdout.columns||80),n=a&&a!==` -`;if(this.options.debug){n&&(this.fullStaticOutput+=a),this.options.stdout.write(this.fullStaticOutput+r);return}if(PC){n&&this.options.stdout.write(a),this.lastOutput=r;return}if(n&&(this.fullStaticOutput+=a),o>=this.options.stdout.rows){this.options.stdout.write(vCt.default.clearTerminal+this.fullStaticOutput+r),this.lastOutput=r;return}n&&(this.log.clear(),this.options.stdout.write(a),this.log(r)),!n&&r!==this.lastOutput&&this.throttledLog(r),this.lastOutput=r},SCt.default(this),this.options=e,this.rootNode=kCt.createNode("ink-root"),this.rootNode.onRender=e.debug?this.onRender:iwe(this.onRender,32,{leading:!0,trailing:!0}),this.rootNode.onImmediateRender=this.onRender,this.log=BCt.default.create(e.stdout),this.throttledLog=e.debug?this.log:iwe(this.log,void 0,{leading:!0,trailing:!0}),this.isUnmounted=!1,this.lastOutput="",this.fullStaticOutput="",this.container=rj.default.createContainer(this.rootNode,0,!1,null),this.unsubscribeExit=xCt.default(this.unmount,{alwaysLast:!1}),e.patchConsole&&this.patchConsole(),PC||(e.stdout.on("resize",this.onRender),this.unsubscribeResize=()=>{e.stdout.off("resize",this.onRender)})}render(e){let r=wCt.default.createElement(FCt.default,{stdin:this.options.stdin,stdout:this.options.stdout,stderr:this.options.stderr,writeToStdout:this.writeToStdout,writeToStderr:this.writeToStderr,exitOnCtrlC:this.options.exitOnCtrlC,onExit:this.unmount},e);rj.default.updateContainer(r,this.container,null,swe)}writeToStdout(e){if(!this.isUnmounted){if(this.options.debug){this.options.stdout.write(e+this.fullStaticOutput+this.lastOutput);return}if(PC){this.options.stdout.write(e);return}this.log.clear(),this.options.stdout.write(e),this.log(this.lastOutput)}}writeToStderr(e){if(!this.isUnmounted){if(this.options.debug){this.options.stderr.write(e),this.options.stdout.write(this.fullStaticOutput+this.lastOutput);return}if(PC){this.options.stderr.write(e);return}this.log.clear(),this.options.stderr.write(e),this.log(this.lastOutput)}}unmount(e){this.isUnmounted||(this.onRender(),this.unsubscribeExit(),typeof this.restoreConsole=="function"&&this.restoreConsole(),typeof this.unsubscribeResize=="function"&&this.unsubscribeResize(),PC?this.options.stdout.write(this.lastOutput+` -`):this.options.debug||this.log.done(),this.isUnmounted=!0,rj.default.updateContainer(null,this.container,null,swe),QCt.default.delete(this.options.stdout),e instanceof Error?this.rejectExitPromise(e):this.resolveExitPromise())}waitUntilExit(){return this.exitPromise||(this.exitPromise=new Promise((e,r)=>{this.resolveExitPromise=e,this.rejectExitPromise=r})),this.exitPromise}clear(){!PC&&!this.options.debug&&this.log.clear()}patchConsole(){this.options.debug||(this.restoreConsole=bCt.default((e,r)=>{e==="stdout"&&this.writeToStdout(r),e==="stderr"&&(r.startsWith("The above error occurred")||this.writeToStderr(r))}))}};Au.default=nj});var lwe=_(jB=>{"use strict";var awe=jB&&jB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(jB,"__esModule",{value:!0});var RCt=awe(owe()),OQ=awe(Hq()),TCt=ve("stream"),LCt=(t,e)=>{let r=Object.assign({stdout:process.stdout,stdin:process.stdin,stderr:process.stderr,debug:!1,exitOnCtrlC:!0,patchConsole:!0},NCt(e)),o=OCt(r.stdout,()=>new RCt.default(r));return o.render(t),{rerender:o.render,unmount:()=>o.unmount(),waitUntilExit:o.waitUntilExit,cleanup:()=>OQ.default.delete(r.stdout),clear:o.clear}};jB.default=LCt;var NCt=(t={})=>t instanceof TCt.Stream?{stdout:t,stdin:process.stdin}:t,OCt=(t,e)=>{let r;return OQ.default.has(t)?r=OQ.default.get(t):(r=e(),OQ.default.set(t,r)),r}});var uwe=_(zf=>{"use strict";var MCt=zf&&zf.__createBinding||(Object.create?function(t,e,r,o){o===void 0&&(o=r),Object.defineProperty(t,o,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,o){o===void 0&&(o=r),t[o]=e[r]}),UCt=zf&&zf.__setModuleDefault||(Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e}),_Ct=zf&&zf.__importStar||function(t){if(t&&t.__esModule)return t;var e={};if(t!=null)for(var r in t)r!=="default"&&Object.hasOwnProperty.call(t,r)&&MCt(e,t,r);return UCt(e,t),e};Object.defineProperty(zf,"__esModule",{value:!0});var GB=_Ct(ln()),cwe=t=>{let{items:e,children:r,style:o}=t,[a,n]=GB.useState(0),u=GB.useMemo(()=>e.slice(a),[e,a]);GB.useLayoutEffect(()=>{n(e.length)},[e.length]);let A=u.map((h,E)=>r(h,a+E)),p=GB.useMemo(()=>Object.assign({position:"absolute",flexDirection:"column"},o),[o]);return GB.default.createElement("ink-box",{internal_static:!0,style:p},A)};cwe.displayName="Static";zf.default=cwe});var fwe=_(WB=>{"use strict";var HCt=WB&&WB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(WB,"__esModule",{value:!0});var qCt=HCt(ln()),Awe=({children:t,transform:e})=>t==null?null:qCt.default.createElement("ink-text",{style:{flexGrow:0,flexShrink:1,flexDirection:"row"},internal_transform:e},t);Awe.displayName="Transform";WB.default=Awe});var hwe=_(YB=>{"use strict";var jCt=YB&&YB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(YB,"__esModule",{value:!0});var GCt=jCt(ln()),pwe=({count:t=1})=>GCt.default.createElement("ink-text",null,` -`.repeat(t));pwe.displayName="Newline";YB.default=pwe});var mwe=_(VB=>{"use strict";var gwe=VB&&VB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(VB,"__esModule",{value:!0});var WCt=gwe(ln()),YCt=gwe(LQ()),dwe=()=>WCt.default.createElement(YCt.default,{flexGrow:1});dwe.displayName="Spacer";VB.default=dwe});var MQ=_(KB=>{"use strict";var VCt=KB&&KB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(KB,"__esModule",{value:!0});var KCt=ln(),JCt=VCt(Wq()),zCt=()=>KCt.useContext(JCt.default);KB.default=zCt});var Ewe=_(JB=>{"use strict";var XCt=JB&&JB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(JB,"__esModule",{value:!0});var ywe=ln(),ZCt=XCt(MQ()),$Ct=(t,e={})=>{let{stdin:r,setRawMode:o,internal_exitOnCtrlC:a}=ZCt.default();ywe.useEffect(()=>{if(e.isActive!==!1)return o(!0),()=>{o(!1)}},[e.isActive,o]),ywe.useEffect(()=>{if(e.isActive===!1)return;let n=u=>{let A=String(u),p={upArrow:A==="\x1B[A",downArrow:A==="\x1B[B",leftArrow:A==="\x1B[D",rightArrow:A==="\x1B[C",pageDown:A==="\x1B[6~",pageUp:A==="\x1B[5~",return:A==="\r",escape:A==="\x1B",ctrl:!1,shift:!1,tab:A===" "||A==="\x1B[Z",backspace:A==="\b",delete:A==="\x7F"||A==="\x1B[3~",meta:!1};A<=""&&!p.return&&(A=String.fromCharCode(A.charCodeAt(0)+97-1),p.ctrl=!0),A.startsWith("\x1B")&&(A=A.slice(1),p.meta=!0);let h=A>="A"&&A<="Z",E=A>="\u0410"&&A<="\u042F";A.length===1&&(h||E)&&(p.shift=!0),p.tab&&A==="[Z"&&(p.shift=!0),(p.tab||p.backspace||p.delete)&&(A=""),(!(A==="c"&&p.ctrl)||!a)&&t(A,p)};return r?.on("data",n),()=>{r?.off("data",n)}},[e.isActive,r,a,t])};JB.default=$Ct});var Cwe=_(zB=>{"use strict";var eIt=zB&&zB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(zB,"__esModule",{value:!0});var tIt=ln(),rIt=eIt(jq()),nIt=()=>tIt.useContext(rIt.default);zB.default=nIt});var Iwe=_(XB=>{"use strict";var iIt=XB&&XB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(XB,"__esModule",{value:!0});var sIt=ln(),oIt=iIt(Vq()),aIt=()=>sIt.useContext(oIt.default);XB.default=aIt});var wwe=_(ZB=>{"use strict";var lIt=ZB&&ZB.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ZB,"__esModule",{value:!0});var cIt=ln(),uIt=lIt(Jq()),AIt=()=>cIt.useContext(uIt.default);ZB.default=AIt});var vwe=_(ev=>{"use strict";var Bwe=ev&&ev.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(ev,"__esModule",{value:!0});var $B=ln(),fIt=Bwe(TQ()),pIt=Bwe(MQ()),hIt=({isActive:t=!0,autoFocus:e=!1,id:r}={})=>{let{isRawModeSupported:o,setRawMode:a}=pIt.default(),{activeId:n,add:u,remove:A,activate:p,deactivate:h,focus:E}=$B.useContext(fIt.default),w=$B.useMemo(()=>r??Math.random().toString().slice(2,7),[r]);return $B.useEffect(()=>(u(w,{autoFocus:e}),()=>{A(w)}),[w,e]),$B.useEffect(()=>{t?p(w):h(w)},[t,w]),$B.useEffect(()=>{if(!(!o||!t))return a(!0),()=>{a(!1)}},[t]),{isFocused:!!w&&n===w,focus:E}};ev.default=hIt});var Dwe=_(tv=>{"use strict";var gIt=tv&&tv.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(tv,"__esModule",{value:!0});var dIt=ln(),mIt=gIt(TQ()),yIt=()=>{let t=dIt.useContext(mIt.default);return{enableFocus:t.enableFocus,disableFocus:t.disableFocus,focusNext:t.focusNext,focusPrevious:t.focusPrevious,focus:t.focus}};tv.default=yIt});var Swe=_(ij=>{"use strict";Object.defineProperty(ij,"__esModule",{value:!0});ij.default=t=>{var e,r,o,a;return{width:(r=(e=t.yogaNode)===null||e===void 0?void 0:e.getComputedWidth())!==null&&r!==void 0?r:0,height:(a=(o=t.yogaNode)===null||o===void 0?void 0:o.getComputedHeight())!==null&&a!==void 0?a:0}}});var ac=_(Js=>{"use strict";Object.defineProperty(Js,"__esModule",{value:!0});var EIt=lwe();Object.defineProperty(Js,"render",{enumerable:!0,get:function(){return EIt.default}});var CIt=LQ();Object.defineProperty(Js,"Box",{enumerable:!0,get:function(){return CIt.default}});var IIt=tj();Object.defineProperty(Js,"Text",{enumerable:!0,get:function(){return IIt.default}});var wIt=uwe();Object.defineProperty(Js,"Static",{enumerable:!0,get:function(){return wIt.default}});var BIt=fwe();Object.defineProperty(Js,"Transform",{enumerable:!0,get:function(){return BIt.default}});var vIt=hwe();Object.defineProperty(Js,"Newline",{enumerable:!0,get:function(){return vIt.default}});var DIt=mwe();Object.defineProperty(Js,"Spacer",{enumerable:!0,get:function(){return DIt.default}});var SIt=Ewe();Object.defineProperty(Js,"useInput",{enumerable:!0,get:function(){return SIt.default}});var PIt=Cwe();Object.defineProperty(Js,"useApp",{enumerable:!0,get:function(){return PIt.default}});var xIt=MQ();Object.defineProperty(Js,"useStdin",{enumerable:!0,get:function(){return xIt.default}});var bIt=Iwe();Object.defineProperty(Js,"useStdout",{enumerable:!0,get:function(){return bIt.default}});var kIt=wwe();Object.defineProperty(Js,"useStderr",{enumerable:!0,get:function(){return kIt.default}});var QIt=vwe();Object.defineProperty(Js,"useFocus",{enumerable:!0,get:function(){return QIt.default}});var FIt=Dwe();Object.defineProperty(Js,"useFocusManager",{enumerable:!0,get:function(){return FIt.default}});var RIt=Swe();Object.defineProperty(Js,"measureElement",{enumerable:!0,get:function(){return RIt.default}})});var oj={};Vt(oj,{Gem:()=>sj});var Pwe,ld,sj,UQ=It(()=>{Pwe=et(ac()),ld=et(ln()),sj=(0,ld.memo)(({active:t})=>{let e=(0,ld.useMemo)(()=>t?"\u25C9":"\u25EF",[t]),r=(0,ld.useMemo)(()=>t?"green":"yellow",[t]);return ld.default.createElement(Pwe.Text,{color:r},e)})});var bwe={};Vt(bwe,{useKeypress:()=>cd});function cd({active:t},e,r){let{stdin:o}=(0,xwe.useStdin)(),a=(0,_Q.useCallback)((n,u)=>e(n,u),r);(0,_Q.useEffect)(()=>{if(!(!t||!o))return o.on("keypress",a),()=>{o.off("keypress",a)}},[t,a,o])}var xwe,_Q,rv=It(()=>{xwe=et(ac()),_Q=et(ln())});var Qwe={};Vt(Qwe,{FocusRequest:()=>kwe,useFocusRequest:()=>aj});var kwe,aj,lj=It(()=>{rv();kwe=(r=>(r.BEFORE="before",r.AFTER="after",r))(kwe||{}),aj=function({active:t},e,r){cd({active:t},(o,a)=>{a.name==="tab"&&(a.shift?e("before"):e("after"))},r)}});var Fwe={};Vt(Fwe,{useListInput:()=>nv});var nv,HQ=It(()=>{rv();nv=function(t,e,{active:r,minus:o,plus:a,set:n,loop:u=!0}){cd({active:r},(A,p)=>{let h=e.indexOf(t);switch(p.name){case o:{let E=h-1;if(u){n(e[(e.length+E)%e.length]);return}if(E<0)return;n(e[E])}break;case a:{let E=h+1;if(u){n(e[E%e.length]);return}if(E>=e.length)return;n(e[E])}break}},[e,t,a,n,u])}});var qQ={};Vt(qQ,{ScrollableItems:()=>TIt});var Hh,Ua,TIt,jQ=It(()=>{Hh=et(ac()),Ua=et(ln());lj();HQ();TIt=({active:t=!0,children:e=[],radius:r=10,size:o=1,loop:a=!0,onFocusRequest:n,willReachEnd:u})=>{let A=N=>{if(N.key===null)throw new Error("Expected all children to have a key");return N.key},p=Ua.default.Children.map(e,N=>A(N)),h=p[0],[E,w]=(0,Ua.useState)(h),D=p.indexOf(E);(0,Ua.useEffect)(()=>{p.includes(E)||w(h)},[e]),(0,Ua.useEffect)(()=>{u&&D>=p.length-2&&u()},[D]),aj({active:t&&!!n},N=>{n?.(N)},[n]),nv(E,p,{active:t,minus:"up",plus:"down",set:w,loop:a});let b=D-r,C=D+r;C>p.length&&(b-=C-p.length,C=p.length),b<0&&(C+=-b,b=0),C>=p.length&&(C=p.length-1);let T=[];for(let N=b;N<=C;++N){let U=p[N],J=t&&U===E;T.push(Ua.default.createElement(Hh.Box,{key:U,height:o},Ua.default.createElement(Hh.Box,{marginLeft:1,marginRight:1},Ua.default.createElement(Hh.Text,null,J?Ua.default.createElement(Hh.Text,{color:"cyan",bold:!0},">"):" ")),Ua.default.createElement(Hh.Box,null,Ua.default.cloneElement(e[N],{active:J}))))}return Ua.default.createElement(Hh.Box,{flexDirection:"column",width:"100%"},T)}});var Rwe,Xf,Twe,cj,Lwe,uj=It(()=>{Rwe=et(ac()),Xf=et(ln()),Twe=ve("readline"),cj=Xf.default.createContext(null),Lwe=({children:t})=>{let{stdin:e,setRawMode:r}=(0,Rwe.useStdin)();(0,Xf.useEffect)(()=>{r&&r(!0),e&&(0,Twe.emitKeypressEvents)(e)},[e,r]);let[o,a]=(0,Xf.useState)(new Map),n=(0,Xf.useMemo)(()=>({getAll:()=>o,get:u=>o.get(u),set:(u,A)=>a(new Map([...o,[u,A]]))}),[o,a]);return Xf.default.createElement(cj.Provider,{value:n,children:t})}});var Aj={};Vt(Aj,{useMinistore:()=>LIt});function LIt(t,e){let r=(0,GQ.useContext)(cj);if(r===null)throw new Error("Expected this hook to run with a ministore context attached");if(typeof t>"u")return r.getAll();let o=(0,GQ.useCallback)(n=>{r.set(t,n)},[t,r.set]),a=r.get(t);return typeof a>"u"&&(a=e),[a,o]}var GQ,fj=It(()=>{GQ=et(ln());uj()});var YQ={};Vt(YQ,{renderForm:()=>NIt});async function NIt(t,e,{stdin:r,stdout:o,stderr:a}){let n,u=p=>{let{exit:h}=(0,WQ.useApp)();cd({active:!0},(E,w)=>{w.name==="return"&&(n=p,h())},[h,p])},{waitUntilExit:A}=(0,WQ.render)(pj.default.createElement(Lwe,null,pj.default.createElement(t,{...e,useSubmit:u})),{stdin:r,stdout:o,stderr:a});return await A(),n}var WQ,pj,VQ=It(()=>{WQ=et(ac()),pj=et(ln());uj();rv()});var Uwe=_(iv=>{"use strict";Object.defineProperty(iv,"__esModule",{value:!0});iv.UncontrolledTextInput=void 0;var Owe=ln(),hj=ln(),Nwe=ac(),ud=FQ(),Mwe=({value:t,placeholder:e="",focus:r=!0,mask:o,highlightPastedText:a=!1,showCursor:n=!0,onChange:u,onSubmit:A})=>{let[{cursorOffset:p,cursorWidth:h},E]=hj.useState({cursorOffset:(t||"").length,cursorWidth:0});hj.useEffect(()=>{E(T=>{if(!r||!n)return T;let N=t||"";return T.cursorOffset>N.length-1?{cursorOffset:N.length,cursorWidth:0}:T})},[t,r,n]);let w=a?h:0,D=o?o.repeat(t.length):t,b=D,C=e?ud.grey(e):void 0;if(n&&r){C=e.length>0?ud.inverse(e[0])+ud.grey(e.slice(1)):ud.inverse(" "),b=D.length>0?"":ud.inverse(" ");let T=0;for(let N of D)T>=p-w&&T<=p?b+=ud.inverse(N):b+=N,T++;D.length>0&&p===D.length&&(b+=ud.inverse(" "))}return Nwe.useInput((T,N)=>{if(N.upArrow||N.downArrow||N.ctrl&&T==="c"||N.tab||N.shift&&N.tab)return;if(N.return){A&&A(t);return}let U=p,J=t,te=0;N.leftArrow?n&&U--:N.rightArrow?n&&U++:N.backspace||N.delete?p>0&&(J=t.slice(0,p-1)+t.slice(p,t.length),U--):(J=t.slice(0,p)+T+t.slice(p,t.length),U+=T.length,T.length>1&&(te=T.length)),p<0&&(U=0),p>t.length&&(U=t.length),E({cursorOffset:U,cursorWidth:te}),J!==t&&u(J)},{isActive:r}),Owe.createElement(Nwe.Text,null,e?D.length>0?b:C:b)};iv.default=Mwe;iv.UncontrolledTextInput=({initialValue:t="",...e})=>{let[r,o]=hj.useState(t);return Owe.createElement(Mwe,Object.assign({},e,{value:r,onChange:o}))}});var qwe={};Vt(qwe,{Pad:()=>gj});var _we,Hwe,gj,dj=It(()=>{_we=et(ac()),Hwe=et(ln()),gj=({length:t,active:e})=>{if(t===0)return null;let r=t>1?` ${"-".repeat(t-1)}`:" ";return Hwe.default.createElement(_we.Text,{dimColor:!e},r)}});var jwe={};Vt(jwe,{ItemOptions:()=>OIt});var ov,qh,OIt,Gwe=It(()=>{ov=et(ac()),qh=et(ln());HQ();UQ();dj();OIt=function({active:t,skewer:e,options:r,value:o,onChange:a,sizes:n=[]}){let u=r.filter(({label:p})=>!!p).map(({value:p})=>p),A=r.findIndex(p=>p.value===o&&p.label!="");return nv(o,u,{active:t,minus:"left",plus:"right",set:a}),qh.default.createElement(qh.default.Fragment,null,r.map(({label:p},h)=>{let E=h===A,w=n[h]-1||0,D=p.replace(/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g,""),b=Math.max(0,w-D.length-2);return p?qh.default.createElement(ov.Box,{key:p,width:w,marginLeft:1},qh.default.createElement(ov.Text,{wrap:"truncate"},qh.default.createElement(sj,{active:E})," ",p),e?qh.default.createElement(gj,{active:t,length:b}):null):qh.default.createElement(ov.Box,{key:`spacer-${h}`,width:w,marginLeft:1})}))}});var s1e=_((xJt,i1e)=>{var Dj;i1e.exports=()=>(typeof Dj>"u"&&(Dj=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),Dj)});var S1e=_(($Jt,D1e)=>{var Tj=Symbol("arg flag"),lc=class t extends Error{constructor(e,r){super(e),this.name="ArgError",this.code=r,Object.setPrototypeOf(this,t.prototype)}};function wv(t,{argv:e=process.argv.slice(2),permissive:r=!1,stopAtPositional:o=!1}={}){if(!t)throw new lc("argument specification object is required","ARG_CONFIG_NO_SPEC");let a={_:[]},n={},u={};for(let A of Object.keys(t)){if(!A)throw new lc("argument key cannot be an empty string","ARG_CONFIG_EMPTY_KEY");if(A[0]!=="-")throw new lc(`argument key must start with '-' but found: '${A}'`,"ARG_CONFIG_NONOPT_KEY");if(A.length===1)throw new lc(`argument key must have a name; singular '-' keys are not allowed: ${A}`,"ARG_CONFIG_NONAME_KEY");if(typeof t[A]=="string"){n[A]=t[A];continue}let p=t[A],h=!1;if(Array.isArray(p)&&p.length===1&&typeof p[0]=="function"){let[E]=p;p=(w,D,b=[])=>(b.push(E(w,D,b[b.length-1])),b),h=E===Boolean||E[Tj]===!0}else if(typeof p=="function")h=p===Boolean||p[Tj]===!0;else throw new lc(`type missing or not a function or valid array type: ${A}`,"ARG_CONFIG_VAD_TYPE");if(A[1]!=="-"&&A.length>2)throw new lc(`short argument keys (with a single hyphen) must have only one character: ${A}`,"ARG_CONFIG_SHORTOPT_TOOLONG");u[A]=[p,h]}for(let A=0,p=e.length;A0){a._=a._.concat(e.slice(A));break}if(h==="--"){a._=a._.concat(e.slice(A+1));break}if(h.length>1&&h[0]==="-"){let E=h[1]==="-"||h.length===2?[h]:h.slice(1).split("").map(w=>`-${w}`);for(let w=0;w1&&e[A+1][0]==="-"&&!(e[A+1].match(/^-?\d*(\.(?=\d))?\d*$/)&&(N===Number||typeof BigInt<"u"&&N===BigInt))){let J=b===T?"":` (alias for ${T})`;throw new lc(`option requires argument: ${b}${J}`,"ARG_MISSING_REQUIRED_LONGARG")}a[T]=N(e[A+1],T,a[T]),++A}else a[T]=N(C,T,a[T])}}else a._.push(h)}return a}wv.flag=t=>(t[Tj]=!0,t);wv.COUNT=wv.flag((t,e,r)=>(r||0)+1);wv.ArgError=lc;D1e.exports=wv});var T1e=_((bzt,R1e)=>{var Mj;R1e.exports=()=>(typeof Mj>"u"&&(Mj=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),Mj)});var U1e=_((Gj,Wj)=>{(function(t){Gj&&typeof Gj=="object"&&typeof Wj<"u"?Wj.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window<"u"?window.isWindows=t():typeof global<"u"?global.isWindows=t():typeof self<"u"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var j1e=_((PXt,q1e)=>{"use strict";Yj.ifExists=Twt;var FC=ve("util"),cc=ve("path"),_1e=U1e(),Qwt=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,Fwt={createPwshFile:!0,createCmdFile:_1e(),fs:ve("fs")},Rwt=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function H1e(t){let e={...Fwt,...t},r=e.fs;return e.fs_={chmod:r.chmod?FC.promisify(r.chmod):async()=>{},mkdir:FC.promisify(r.mkdir),readFile:FC.promisify(r.readFile),stat:FC.promisify(r.stat),unlink:FC.promisify(r.unlink),writeFile:FC.promisify(r.writeFile)},e}async function Yj(t,e,r){let o=H1e(r);await o.fs_.stat(t),await Nwt(t,e,o)}function Twt(t,e,r){return Yj(t,e,r).catch(()=>{})}function Lwt(t,e){return e.fs_.unlink(t).catch(()=>{})}async function Nwt(t,e,r){let o=await Hwt(t,r);return await Owt(e,r),Mwt(t,e,o,r)}function Owt(t,e){return e.fs_.mkdir(cc.dirname(t),{recursive:!0})}function Mwt(t,e,r,o){let a=H1e(o),n=[{generator:Gwt,extension:""}];return a.createCmdFile&&n.push({generator:jwt,extension:".cmd"}),a.createPwshFile&&n.push({generator:Wwt,extension:".ps1"}),Promise.all(n.map(u=>qwt(t,e+u.extension,r,u.generator,a)))}function Uwt(t,e){return Lwt(t,e)}function _wt(t,e){return Ywt(t,e)}async function Hwt(t,e){let a=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(Qwt);if(!a){let n=cc.extname(t).toLowerCase();return{program:Rwt.get(n)||null,additionalArgs:""}}return{program:a[1],additionalArgs:a[2]}}async function qwt(t,e,r,o,a){let n=a.preserveSymlinks?"--preserve-symlinks":"",u=[r.additionalArgs,n].filter(A=>A).join(" ");return a=Object.assign({},a,{prog:r.program,args:u}),await Uwt(e,a),await a.fs_.writeFile(e,o(t,e,a),"utf8"),_wt(e,a)}function jwt(t,e,r){let a=cc.relative(cc.dirname(e),t).split("/").join("\\"),n=cc.isAbsolute(a)?`"${a}"`:`"%~dp0\\${a}"`,u,A=r.prog,p=r.args||"",h=Vj(r.nodePath).win32;A?(u=`"%~dp0\\${A}.exe"`,a=n):(A=n,p="",a="");let E=r.progArgs?`${r.progArgs.join(" ")} `:"",w=h?`@SET NODE_PATH=${h}\r -`:"";return u?w+=`@IF EXIST ${u} (\r - ${u} ${p} ${a} ${E}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${A} ${p} ${a} ${E}%*\r -)\r -`:w+=`@${A} ${p} ${a} ${E}%*\r -`,w}function Gwt(t,e,r){let o=cc.relative(cc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n;o=o.split("\\").join("/");let u=cc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,A=r.args||"",p=Vj(r.nodePath).posix;a?(n=`"$basedir/${r.prog}"`,o=u):(a=u,A="",o="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",E=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,w=r.nodePath?`export NODE_PATH="${p}" -`:"";return n?E+=`${w}if [ -x ${n} ]; then - exec ${n} ${A} ${o} ${h}"$@" -else - exec ${a} ${A} ${o} ${h}"$@" -fi -`:E+=`${w}${a} ${A} ${o} ${h}"$@" -exit $? -`,E}function Wwt(t,e,r){let o=cc.relative(cc.dirname(e),t),a=r.prog&&r.prog.split("\\").join("/"),n=a&&`"${a}$exe"`,u;o=o.split("\\").join("/");let A=cc.isAbsolute(o)?`"${o}"`:`"$basedir/${o}"`,p=r.args||"",h=Vj(r.nodePath),E=h.win32,w=h.posix;n?(u=`"$basedir/${r.prog}$exe"`,o=A):(n=A,p="",o="");let D=r.progArgs?`${r.progArgs.join(" ")} `:"",b=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${r.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${E}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return r.nodePath&&(b+=` else { - $env:NODE_PATH="${w}" -}`),u?b+=` -$ret=0 -if (Test-Path ${u}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${u} ${p} ${o} ${D}$args - } else { - & ${u} ${p} ${o} ${D}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${n} ${p} ${o} ${D}$args - } else { - & ${n} ${p} ${o} ${D}$args - } - $ret=$LASTEXITCODE -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:b+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${n} ${p} ${o} ${D}$args -} else { - & ${n} ${p} ${o} ${D}$args -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,b}function Ywt(t,e){return e.fs_.chmod(t,493)}function Vj(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(cc.delimiter):Array.from(t),r={};for(let o=0;o`/mnt/${A.toLowerCase()}`):e[o];r.win32=r.win32?`${r.win32};${a}`:a,r.posix=r.posix?`${r.posix}:${n}`:n,r[o]={win32:a,posix:n}}return r}q1e.exports=Yj});var aG=_((KZt,c2e)=>{c2e.exports=ve("stream")});var p2e=_((JZt,f2e)=>{"use strict";function u2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function E1t(t){for(var e=1;e0?this.tail.next=o:this.head=o,this.tail=o,++this.length}},{key:"unshift",value:function(r){var o={data:r,next:this.head};this.length===0&&(this.tail=o),this.head=o,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var o=this.head,a=""+o.data;o=o.next;)a+=r+o.data;return a}},{key:"concat",value:function(r){if(this.length===0)return sF.alloc(0);for(var o=sF.allocUnsafe(r>>>0),a=this.head,n=0;a;)S1t(a.data,o,n),n+=a.data.length,a=a.next;return o}},{key:"consume",value:function(r,o){var a;return ru.length?u.length:r;if(A===u.length?n+=u:n+=u.slice(0,r),r-=A,r===0){A===u.length?(++a,o.next?this.head=o.next:this.head=this.tail=null):(this.head=o,o.data=u.slice(A));break}++a}return this.length-=a,n}},{key:"_getBuffer",value:function(r){var o=sF.allocUnsafe(r),a=this.head,n=1;for(a.data.copy(o),r-=a.data.length;a=a.next;){var u=a.data,A=r>u.length?u.length:r;if(u.copy(o,o.length-r,0,A),r-=A,r===0){A===u.length?(++n,a.next?this.head=a.next:this.head=this.tail=null):(this.head=a,a.data=u.slice(A));break}++n}return this.length-=n,o}},{key:D1t,value:function(r,o){return lG(this,E1t({},o,{depth:0,customInspect:!1}))}}]),t}()});var uG=_((zZt,g2e)=>{"use strict";function P1t(t,e){var r=this,o=this._readableState&&this._readableState.destroyed,a=this._writableState&&this._writableState.destroyed;return o||a?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(cG,this,t)):process.nextTick(cG,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(n){!e&&n?r._writableState?r._writableState.errorEmitted?process.nextTick(oF,r):(r._writableState.errorEmitted=!0,process.nextTick(h2e,r,n)):process.nextTick(h2e,r,n):e?(process.nextTick(oF,r),e(n)):process.nextTick(oF,r)}),this)}function h2e(t,e){cG(t,e),oF(t)}function oF(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function x1t(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function cG(t,e){t.emit("error",e)}function b1t(t,e){var r=t._readableState,o=t._writableState;r&&r.autoDestroy||o&&o.autoDestroy?t.destroy(e):t.emit("error",e)}g2e.exports={destroy:P1t,undestroy:x1t,errorOrDestroy:b1t}});var Jh=_((XZt,y2e)=>{"use strict";var m2e={};function Ac(t,e,r){r||(r=Error);function o(n,u,A){return typeof e=="string"?e:e(n,u,A)}class a extends r{constructor(u,A,p){super(o(u,A,p))}}a.prototype.name=r.name,a.prototype.code=t,m2e[t]=a}function d2e(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(o=>String(o)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function k1t(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function Q1t(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function F1t(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Ac("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Ac("ERR_INVALID_ARG_TYPE",function(t,e,r){let o;typeof e=="string"&&k1t(e,"not ")?(o="must not be",e=e.replace(/^not /,"")):o="must be";let a;if(Q1t(t," argument"))a=`The ${t} ${o} ${d2e(e,"type")}`;else{let n=F1t(t,".")?"property":"argument";a=`The "${t}" ${n} ${o} ${d2e(e,"type")}`}return a+=`. Received type ${typeof r}`,a},TypeError);Ac("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Ac("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Ac("ERR_STREAM_PREMATURE_CLOSE","Premature close");Ac("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Ac("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Ac("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Ac("ERR_STREAM_WRITE_AFTER_END","write after end");Ac("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Ac("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Ac("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");y2e.exports.codes=m2e});var AG=_((ZZt,E2e)=>{"use strict";var R1t=Jh().codes.ERR_INVALID_OPT_VALUE;function T1t(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function L1t(t,e,r,o){var a=T1t(e,o,r);if(a!=null){if(!(isFinite(a)&&Math.floor(a)===a)||a<0){var n=o?r:"highWaterMark";throw new R1t(n,a)}return Math.floor(a)}return t.objectMode?16:16*1024}E2e.exports={getHighWaterMark:L1t}});var C2e=_(($Zt,fG)=>{typeof Object.create=="function"?fG.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:fG.exports=function(e,r){if(r){e.super_=r;var o=function(){};o.prototype=r.prototype,e.prototype=new o,e.prototype.constructor=e}}});var zh=_((e$t,hG)=>{try{if(pG=ve("util"),typeof pG.inherits!="function")throw"";hG.exports=pG.inherits}catch{hG.exports=C2e()}var pG});var w2e=_((t$t,I2e)=>{I2e.exports=ve("util").deprecate});var mG=_((r$t,x2e)=>{"use strict";x2e.exports=Li;function v2e(t){var e=this;this.next=null,this.entry=null,this.finish=function(){l2t(e,t)}}var OC;Li.WritableState=Tv;var N1t={deprecate:w2e()},D2e=aG(),lF=ve("buffer").Buffer,O1t=global.Uint8Array||function(){};function M1t(t){return lF.from(t)}function U1t(t){return lF.isBuffer(t)||t instanceof O1t}var dG=uG(),_1t=AG(),H1t=_1t.getHighWaterMark,Xh=Jh().codes,q1t=Xh.ERR_INVALID_ARG_TYPE,j1t=Xh.ERR_METHOD_NOT_IMPLEMENTED,G1t=Xh.ERR_MULTIPLE_CALLBACK,W1t=Xh.ERR_STREAM_CANNOT_PIPE,Y1t=Xh.ERR_STREAM_DESTROYED,V1t=Xh.ERR_STREAM_NULL_VALUES,K1t=Xh.ERR_STREAM_WRITE_AFTER_END,J1t=Xh.ERR_UNKNOWN_ENCODING,MC=dG.errorOrDestroy;zh()(Li,D2e);function z1t(){}function Tv(t,e,r){OC=OC||dd(),t=t||{},typeof r!="boolean"&&(r=e instanceof OC),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=H1t(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var o=t.decodeStrings===!1;this.decodeStrings=!o,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(a){n2t(e,a)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new v2e(this)}Tv.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(Tv.prototype,"buffer",{get:N1t.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch{}})();var aF;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(aF=Function.prototype[Symbol.hasInstance],Object.defineProperty(Li,Symbol.hasInstance,{value:function(e){return aF.call(this,e)?!0:this!==Li?!1:e&&e._writableState instanceof Tv}})):aF=function(e){return e instanceof this};function Li(t){OC=OC||dd();var e=this instanceof OC;if(!e&&!aF.call(Li,this))return new Li(t);this._writableState=new Tv(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),D2e.call(this)}Li.prototype.pipe=function(){MC(this,new W1t)};function X1t(t,e){var r=new K1t;MC(t,r),process.nextTick(e,r)}function Z1t(t,e,r,o){var a;return r===null?a=new V1t:typeof r!="string"&&!e.objectMode&&(a=new q1t("chunk",["string","Buffer"],r)),a?(MC(t,a),process.nextTick(o,a),!1):!0}Li.prototype.write=function(t,e,r){var o=this._writableState,a=!1,n=!o.objectMode&&U1t(t);return n&&!lF.isBuffer(t)&&(t=M1t(t)),typeof e=="function"&&(r=e,e=null),n?e="buffer":e||(e=o.defaultEncoding),typeof r!="function"&&(r=z1t),o.ending?X1t(this,r):(n||Z1t(this,o,t,r))&&(o.pendingcb++,a=e2t(this,o,n,t,e,r)),a};Li.prototype.cork=function(){this._writableState.corked++};Li.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&S2e(this,t))};Li.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new J1t(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Li.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function $1t(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=lF.from(e,r)),e}Object.defineProperty(Li.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function e2t(t,e,r,o,a,n){if(!r){var u=$1t(e,o,a);o!==u&&(r=!0,a="buffer",o=u)}var A=e.objectMode?1:o.length;e.length+=A;var p=e.length{"use strict";var c2t=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};k2e.exports=IA;var b2e=CG(),EG=mG();zh()(IA,b2e);for(yG=c2t(EG.prototype),cF=0;cF{var AF=ve("buffer"),np=AF.Buffer;function Q2e(t,e){for(var r in t)e[r]=t[r]}np.from&&np.alloc&&np.allocUnsafe&&np.allocUnsafeSlow?F2e.exports=AF:(Q2e(AF,IG),IG.Buffer=UC);function UC(t,e,r){return np(t,e,r)}Q2e(np,UC);UC.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return np(t,e,r)};UC.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var o=np(t);return e!==void 0?typeof r=="string"?o.fill(e,r):o.fill(e):o.fill(0),o};UC.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return np(t)};UC.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return AF.SlowBuffer(t)}});var vG=_(L2e=>{"use strict";var BG=R2e().Buffer,T2e=BG.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function f2t(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function p2t(t){var e=f2t(t);if(typeof e!="string"&&(BG.isEncoding===T2e||!T2e(t)))throw new Error("Unknown encoding: "+t);return e||t}L2e.StringDecoder=Lv;function Lv(t){this.encoding=p2t(t);var e;switch(this.encoding){case"utf16le":this.text=E2t,this.end=C2t,e=4;break;case"utf8":this.fillLast=d2t,e=4;break;case"base64":this.text=I2t,this.end=w2t,e=3;break;default:this.write=B2t,this.end=v2t;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=BG.allocUnsafe(e)}Lv.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5===6?2:t>>4===14?3:t>>3===30?4:t>>6===2?-1:-2}function h2t(t,e,r){var o=e.length-1;if(o=0?(a>0&&(t.lastNeed=a-1),a):--o=0?(a>0&&(t.lastNeed=a-2),a):--o=0?(a>0&&(a===2?a=0:t.lastNeed=a-3),a):0))}function g2t(t,e,r){if((e[0]&192)!==128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!==128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!==128)return t.lastNeed=2,"\uFFFD"}}function d2t(t){var e=this.lastTotal-this.lastNeed,r=g2t(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function m2t(t,e){var r=h2t(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var o=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,o),t.toString("utf8",e,o)}function y2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function E2t(t,e){if((t.length-e)%2===0){var r=t.toString("utf16le",e);if(r){var o=r.charCodeAt(r.length-1);if(o>=55296&&o<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function C2t(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function I2t(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function w2t(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function B2t(t){return t.toString(this.encoding)}function v2t(t){return t&&t.length?this.write(t):""}});var fF=_((s$t,M2e)=>{"use strict";var N2e=Jh().codes.ERR_STREAM_PREMATURE_CLOSE;function D2t(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,o=new Array(r),a=0;a{"use strict";var pF;function Zh(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var x2t=fF(),$h=Symbol("lastResolve"),md=Symbol("lastReject"),Nv=Symbol("error"),hF=Symbol("ended"),yd=Symbol("lastPromise"),DG=Symbol("handlePromise"),Ed=Symbol("stream");function e0(t,e){return{value:t,done:e}}function b2t(t){var e=t[$h];if(e!==null){var r=t[Ed].read();r!==null&&(t[yd]=null,t[$h]=null,t[md]=null,e(e0(r,!1)))}}function k2t(t){process.nextTick(b2t,t)}function Q2t(t,e){return function(r,o){t.then(function(){if(e[hF]){r(e0(void 0,!0));return}e[DG](r,o)},o)}}var F2t=Object.getPrototypeOf(function(){}),R2t=Object.setPrototypeOf((pF={get stream(){return this[Ed]},next:function(){var e=this,r=this[Nv];if(r!==null)return Promise.reject(r);if(this[hF])return Promise.resolve(e0(void 0,!0));if(this[Ed].destroyed)return new Promise(function(u,A){process.nextTick(function(){e[Nv]?A(e[Nv]):u(e0(void 0,!0))})});var o=this[yd],a;if(o)a=new Promise(Q2t(o,this));else{var n=this[Ed].read();if(n!==null)return Promise.resolve(e0(n,!1));a=new Promise(this[DG])}return this[yd]=a,a}},Zh(pF,Symbol.asyncIterator,function(){return this}),Zh(pF,"return",function(){var e=this;return new Promise(function(r,o){e[Ed].destroy(null,function(a){if(a){o(a);return}r(e0(void 0,!0))})})}),pF),F2t),T2t=function(e){var r,o=Object.create(R2t,(r={},Zh(r,Ed,{value:e,writable:!0}),Zh(r,$h,{value:null,writable:!0}),Zh(r,md,{value:null,writable:!0}),Zh(r,Nv,{value:null,writable:!0}),Zh(r,hF,{value:e._readableState.endEmitted,writable:!0}),Zh(r,DG,{value:function(n,u){var A=o[Ed].read();A?(o[yd]=null,o[$h]=null,o[md]=null,n(e0(A,!1))):(o[$h]=n,o[md]=u)},writable:!0}),r));return o[yd]=null,x2t(e,function(a){if(a&&a.code!=="ERR_STREAM_PREMATURE_CLOSE"){var n=o[md];n!==null&&(o[yd]=null,o[$h]=null,o[md]=null,n(a)),o[Nv]=a;return}var u=o[$h];u!==null&&(o[yd]=null,o[$h]=null,o[md]=null,u(e0(void 0,!0))),o[hF]=!0}),e.on("readable",k2t.bind(null,o)),o};U2e.exports=T2t});var G2e=_((a$t,j2e)=>{"use strict";function H2e(t,e,r,o,a,n,u){try{var A=t[n](u),p=A.value}catch(h){r(h);return}A.done?e(p):Promise.resolve(p).then(o,a)}function L2t(t){return function(){var e=this,r=arguments;return new Promise(function(o,a){var n=t.apply(e,r);function u(p){H2e(n,o,a,u,A,"next",p)}function A(p){H2e(n,o,a,u,A,"throw",p)}u(void 0)})}}function q2e(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(t);e&&(o=o.filter(function(a){return Object.getOwnPropertyDescriptor(t,a).enumerable})),r.push.apply(r,o)}return r}function N2t(t){for(var e=1;e{"use strict";eBe.exports=wn;var _C;wn.ReadableState=K2e;var l$t=ve("events").EventEmitter,V2e=function(e,r){return e.listeners(r).length},Mv=aG(),gF=ve("buffer").Buffer,_2t=global.Uint8Array||function(){};function H2t(t){return gF.from(t)}function q2t(t){return gF.isBuffer(t)||t instanceof _2t}var SG=ve("util"),tn;SG&&SG.debuglog?tn=SG.debuglog("stream"):tn=function(){};var j2t=p2e(),RG=uG(),G2t=AG(),W2t=G2t.getHighWaterMark,dF=Jh().codes,Y2t=dF.ERR_INVALID_ARG_TYPE,V2t=dF.ERR_STREAM_PUSH_AFTER_EOF,K2t=dF.ERR_METHOD_NOT_IMPLEMENTED,J2t=dF.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,HC,PG,xG;zh()(wn,Mv);var Ov=RG.errorOrDestroy,bG=["error","close","destroy","pause","resume"];function z2t(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function K2e(t,e,r){_C=_C||dd(),t=t||{},typeof r!="boolean"&&(r=e instanceof _C),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=W2t(this,t,"readableHighWaterMark",r),this.buffer=new j2t,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(HC||(HC=vG().StringDecoder),this.decoder=new HC(t.encoding),this.encoding=t.encoding)}function wn(t){if(_C=_C||dd(),!(this instanceof wn))return new wn(t);var e=this instanceof _C;this._readableState=new K2e(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),Mv.call(this)}Object.defineProperty(wn.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){this._readableState&&(this._readableState.destroyed=e)}});wn.prototype.destroy=RG.destroy;wn.prototype._undestroy=RG.undestroy;wn.prototype._destroy=function(t,e){e(t)};wn.prototype.push=function(t,e){var r=this._readableState,o;return r.objectMode?o=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=gF.from(t,e),e=""),o=!0),J2e(this,t,e,!1,o)};wn.prototype.unshift=function(t){return J2e(this,t,null,!0,!1)};function J2e(t,e,r,o,a){tn("readableAddChunk",e);var n=t._readableState;if(e===null)n.reading=!1,$2t(t,n);else{var u;if(a||(u=X2t(n,e)),u)Ov(t,u);else if(n.objectMode||e&&e.length>0)if(typeof e!="string"&&!n.objectMode&&Object.getPrototypeOf(e)!==gF.prototype&&(e=H2t(e)),o)n.endEmitted?Ov(t,new J2t):kG(t,n,e,!0);else if(n.ended)Ov(t,new V2t);else{if(n.destroyed)return!1;n.reading=!1,n.decoder&&!r?(e=n.decoder.write(e),n.objectMode||e.length!==0?kG(t,n,e,!1):FG(t,n)):kG(t,n,e,!1)}else o||(n.reading=!1,FG(t,n))}return!n.ended&&(n.length=W2e?t=W2e:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function Y2e(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=Z2t(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}wn.prototype.read=function(t){tn("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return tn("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?QG(this):mF(this),null;if(t=Y2e(t,e),t===0&&e.ended)return e.length===0&&QG(this),null;var o=e.needReadable;tn("need readable",o),(e.length===0||e.length-t0?a=Z2e(t,e):a=null,a===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&QG(this)),a!==null&&this.emit("data",a),a};function $2t(t,e){if(tn("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?mF(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,z2e(t)))}}function mF(t){var e=t._readableState;tn("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(tn("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(z2e,t))}function z2e(t){var e=t._readableState;tn("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,TG(t)}function FG(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(eBt,t,e))}function eBt(t,e){for(;!e.reading&&!e.ended&&(e.length1&&$2e(o.pipes,t)!==-1)&&!h&&(tn("false write response, pause",o.awaitDrain),o.awaitDrain++),r.pause())}function D(N){tn("onerror",N),T(),t.removeListener("error",D),V2e(t,"error")===0&&Ov(t,N)}z2t(t,"error",D);function b(){t.removeListener("finish",C),T()}t.once("close",b);function C(){tn("onfinish"),t.removeListener("close",b),T()}t.once("finish",C);function T(){tn("unpipe"),r.unpipe(t)}return t.emit("pipe",r),o.flowing||(tn("pipe resume"),r.resume()),t};function tBt(t){return function(){var r=t._readableState;tn("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&V2e(t,"data")&&(r.flowing=!0,TG(t))}}wn.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var o=e.pipes,a=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var n=0;n0,o.flowing!==!1&&this.resume()):t==="readable"&&!o.endEmitted&&!o.readableListening&&(o.readableListening=o.needReadable=!0,o.flowing=!1,o.emittedReadable=!1,tn("on readable",o.length,o.reading),o.length?mF(this):o.reading||process.nextTick(rBt,this)),r};wn.prototype.addListener=wn.prototype.on;wn.prototype.removeListener=function(t,e){var r=Mv.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(X2e,this),r};wn.prototype.removeAllListeners=function(t){var e=Mv.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(X2e,this),e};function X2e(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function rBt(t){tn("readable nexttick read 0"),t.read(0)}wn.prototype.resume=function(){var t=this._readableState;return t.flowing||(tn("resume"),t.flowing=!t.readableListening,nBt(this,t)),t.paused=!1,this};function nBt(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(iBt,t,e))}function iBt(t,e){tn("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),TG(t),e.flowing&&!e.reading&&t.read(0)}wn.prototype.pause=function(){return tn("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(tn("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function TG(t){var e=t._readableState;for(tn("flow",e.flowing);e.flowing&&t.read()!==null;);}wn.prototype.wrap=function(t){var e=this,r=this._readableState,o=!1;t.on("end",function(){if(tn("wrapped end"),r.decoder&&!r.ended){var u=r.decoder.end();u&&u.length&&e.push(u)}e.push(null)}),t.on("data",function(u){if(tn("wrapped data"),r.decoder&&(u=r.decoder.write(u)),!(r.objectMode&&u==null)&&!(!r.objectMode&&(!u||!u.length))){var A=e.push(u);A||(o=!0,t.pause())}});for(var a in t)this[a]===void 0&&typeof t[a]=="function"&&(this[a]=function(A){return function(){return t[A].apply(t,arguments)}}(a));for(var n=0;n=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function QG(t){var e=t._readableState;tn("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(sBt,e,t))}function sBt(t,e){if(tn("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(wn.from=function(t,e){return xG===void 0&&(xG=G2e()),xG(wn,t,e)});function $2e(t,e){for(var r=0,o=t.length;r{"use strict";rBe.exports=ip;var yF=Jh().codes,oBt=yF.ERR_METHOD_NOT_IMPLEMENTED,aBt=yF.ERR_MULTIPLE_CALLBACK,lBt=yF.ERR_TRANSFORM_ALREADY_TRANSFORMING,cBt=yF.ERR_TRANSFORM_WITH_LENGTH_0,EF=dd();zh()(ip,EF);function uBt(t,e){var r=this._transformState;r.transforming=!1;var o=r.writecb;if(o===null)return this.emit("error",new aBt);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),o(t);var a=this._readableState;a.reading=!1,(a.needReadable||a.length{"use strict";iBe.exports=Uv;var nBe=LG();zh()(Uv,nBe);function Uv(t){if(!(this instanceof Uv))return new Uv(t);nBe.call(this,t)}Uv.prototype._transform=function(t,e,r){r(null,t)}});var uBe=_((f$t,cBe)=>{"use strict";var NG;function fBt(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var lBe=Jh().codes,pBt=lBe.ERR_MISSING_ARGS,hBt=lBe.ERR_STREAM_DESTROYED;function oBe(t){if(t)throw t}function gBt(t){return t.setHeader&&typeof t.abort=="function"}function dBt(t,e,r,o){o=fBt(o);var a=!1;t.on("close",function(){a=!0}),NG===void 0&&(NG=fF()),NG(t,{readable:e,writable:r},function(u){if(u)return o(u);a=!0,o()});var n=!1;return function(u){if(!a&&!n){if(n=!0,gBt(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();o(u||new hBt("pipe"))}}}function aBe(t){t()}function mBt(t,e){return t.pipe(e)}function yBt(t){return!t.length||typeof t[t.length-1]!="function"?oBe:t.pop()}function EBt(){for(var t=arguments.length,e=new Array(t),r=0;r0;return dBt(u,p,h,function(E){a||(a=E),E&&n.forEach(aBe),!p&&(n.forEach(aBe),o(a))})});return e.reduce(mBt)}cBe.exports=EBt});var qC=_((fc,Hv)=>{var _v=ve("stream");process.env.READABLE_STREAM==="disable"&&_v?(Hv.exports=_v.Readable,Object.assign(Hv.exports,_v),Hv.exports.Stream=_v):(fc=Hv.exports=CG(),fc.Stream=_v||fc,fc.Readable=fc,fc.Writable=mG(),fc.Duplex=dd(),fc.Transform=LG(),fc.PassThrough=sBe(),fc.finished=fF(),fc.pipeline=uBe())});var pBe=_((p$t,fBe)=>{"use strict";var{Buffer:hu}=ve("buffer"),ABe=Symbol.for("BufferList");function fi(t){if(!(this instanceof fi))return new fi(t);fi._init.call(this,t)}fi._init=function(e){Object.defineProperty(this,ABe,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};fi.prototype._new=function(e){return new fi(e)};fi.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let o=0;othis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};fi.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};fi.prototype.copy=function(e,r,o,a){if((typeof o!="number"||o<0)&&(o=0),(typeof a!="number"||a>this.length)&&(a=this.length),o>=this.length||a<=0)return e||hu.alloc(0);let n=!!e,u=this._offset(o),A=a-o,p=A,h=n&&r||0,E=u[1];if(o===0&&a===this.length){if(!n)return this._bufs.length===1?this._bufs[0]:hu.concat(this._bufs,this.length);for(let w=0;wD)this._bufs[w].copy(e,h,E),h+=D;else{this._bufs[w].copy(e,h,E,E+p),h+=D;break}p-=D,E&&(E=0)}return e.length>h?e.slice(0,h):e};fi.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let o=this._offset(e),a=this._offset(r),n=this._bufs.slice(o[0],a[0]+1);return a[1]===0?n.pop():n[n.length-1]=n[n.length-1].slice(0,a[1]),o[1]!==0&&(n[0]=n[0].slice(o[1])),this._new(n)};fi.prototype.toString=function(e,r,o){return this.slice(r,o).toString(e)};fi.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};fi.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let o=this._offset(e),a=o[0],n=o[1];for(;a=t.length){let p=u.indexOf(t,n);if(p!==-1)return this._reverseOffset([a,p]);n=u.length-t.length+1}else{let p=this._reverseOffset([a,n]);if(this._match(p,t))return p;n++}n=0}return-1};fi.prototype._match=function(t,e){if(this.length-t{"use strict";var OG=qC().Duplex,CBt=zh(),qv=pBe();function Fo(t){if(!(this instanceof Fo))return new Fo(t);if(typeof t=="function"){this._callback=t;let e=function(o){this._callback&&(this._callback(o),this._callback=null)}.bind(this);this.on("pipe",function(o){o.on("error",e)}),this.on("unpipe",function(o){o.removeListener("error",e)}),t=null}qv._init.call(this,t),OG.call(this)}CBt(Fo,OG);Object.assign(Fo.prototype,qv.prototype);Fo.prototype._new=function(e){return new Fo(e)};Fo.prototype._write=function(e,r,o){this._appendBuffer(e),typeof o=="function"&&o()};Fo.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Fo.prototype.end=function(e){OG.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Fo.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Fo.prototype._isBufferList=function(e){return e instanceof Fo||e instanceof qv||Fo.isBufferList(e)};Fo.isBufferList=qv.isBufferList;CF.exports=Fo;CF.exports.BufferListStream=Fo;CF.exports.BufferList=qv});var _G=_(GC=>{var IBt=Buffer.alloc,wBt="0000000000000000000",BBt="7777777777777777777",gBe=48,dBe=Buffer.from("ustar\0","binary"),vBt=Buffer.from("00","binary"),DBt=Buffer.from("ustar ","binary"),SBt=Buffer.from(" \0","binary"),PBt=parseInt("7777",8),jv=257,UG=263,xBt=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},bBt=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},kBt=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},mBe=function(t,e,r,o){for(;re?BBt.slice(0,e)+" ":wBt.slice(0,e-t.length)+t+" "};function QBt(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],o=t.length-1;o>0;o--){var a=t[o];e?r.push(a):r.push(255-a)}var n=0,u=r.length;for(o=0;o=Math.pow(10,r)&&r++,e+r+t};GC.decodeLongPath=function(t,e){return jC(t,0,t.length,e)};GC.encodePax=function(t){var e="";t.name&&(e+=MG(" path="+t.name+` -`)),t.linkname&&(e+=MG(" linkpath="+t.linkname+` -`));var r=t.pax;if(r)for(var o in r)e+=MG(" "+o+"="+r[o]+` -`);return Buffer.from(e)};GC.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var a=r.indexOf("/");if(a===-1)return null;o+=o?"/"+r.slice(0,a):r.slice(0,a),r=r.slice(a+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(o)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(t0(t.mode&PBt,6),100),e.write(t0(t.uid,6),108),e.write(t0(t.gid,6),116),e.write(t0(t.size,11),124),e.write(t0(t.mtime.getTime()/1e3|0,11),136),e[156]=gBe+kBt(t.type),t.linkname&&e.write(t.linkname,157),dBe.copy(e,jv),vBt.copy(e,UG),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(t0(t.devmajor||0,6),329),e.write(t0(t.devminor||0,6),337),o&&e.write(o,345),e.write(t0(yBe(e),6),148),e)};GC.decode=function(t,e,r){var o=t[156]===0?0:t[156]-gBe,a=jC(t,0,100,e),n=r0(t,100,8),u=r0(t,108,8),A=r0(t,116,8),p=r0(t,124,12),h=r0(t,136,12),E=bBt(o),w=t[157]===0?null:jC(t,157,100,e),D=jC(t,265,32),b=jC(t,297,32),C=r0(t,329,8),T=r0(t,337,8),N=yBe(t);if(N===8*32)return null;if(N!==r0(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(dBe.compare(t,jv,jv+6)===0)t[345]&&(a=jC(t,345,155,e)+"/"+a);else if(!(DBt.compare(t,jv,jv+6)===0&&SBt.compare(t,UG,UG+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return o===0&&a&&a[a.length-1]==="/"&&(o=5),{name:a,mode:n,uid:u,gid:A,size:p,mtime:new Date(1e3*h),type:E,linkname:w,uname:D,gname:b,devmajor:C,devminor:T}}});var DBe=_((d$t,vBe)=>{var CBe=ve("util"),FBt=hBe(),Gv=_G(),IBe=qC().Writable,wBe=qC().PassThrough,BBe=function(){},EBe=function(t){return t&=511,t&&512-t},RBt=function(t,e){var r=new IF(t,e);return r.end(),r},TBt=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},IF=function(t,e){this._parent=t,this.offset=e,wBe.call(this,{autoDestroy:!1})};CBe.inherits(IF,wBe);IF.prototype.destroy=function(t){this._parent.destroy(t)};var sp=function(t){if(!(this instanceof sp))return new sp(t);IBe.call(this,t),t=t||{},this._offset=0,this._buffer=FBt(),this._missing=0,this._partial=!1,this._onparse=BBe,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,o=function(){e._continue()},a=function(D){if(e._locked=!1,D)return e.destroy(D);e._stream||o()},n=function(){e._stream=null;var D=EBe(e._header.size);D?e._parse(D,u):e._parse(512,w),e._locked||o()},u=function(){e._buffer.consume(EBe(e._header.size)),e._parse(512,w),o()},A=function(){var D=e._header.size;e._paxGlobal=Gv.decodePax(r.slice(0,D)),r.consume(D),n()},p=function(){var D=e._header.size;e._pax=Gv.decodePax(r.slice(0,D)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(D),n()},h=function(){var D=e._header.size;this._gnuLongPath=Gv.decodeLongPath(r.slice(0,D),t.filenameEncoding),r.consume(D),n()},E=function(){var D=e._header.size;this._gnuLongLinkPath=Gv.decodeLongPath(r.slice(0,D),t.filenameEncoding),r.consume(D),n()},w=function(){var D=e._offset,b;try{b=e._header=Gv.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(C){e.emit("error",C)}if(r.consume(512),!b){e._parse(512,w),o();return}if(b.type==="gnu-long-path"){e._parse(b.size,h),o();return}if(b.type==="gnu-long-link-path"){e._parse(b.size,E),o();return}if(b.type==="pax-global-header"){e._parse(b.size,A),o();return}if(b.type==="pax-header"){e._parse(b.size,p),o();return}if(e._gnuLongPath&&(b.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(b.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=b=TBt(b,e._pax),e._pax=null),e._locked=!0,!b.size||b.type==="directory"){e._parse(512,w),e.emit("entry",b,RBt(e,D),a);return}e._stream=new IF(e,D),e.emit("entry",b,e._stream,a),e._parse(b.size,n),o()};this._onheader=w,this._parse(512,w)};CBe.inherits(sp,IBe);sp.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};sp.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};sp.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=BBe,this._overflow?this._write(this._overflow,void 0,t):t()}};sp.prototype._write=function(t,e,r){if(!this._destroyed){var o=this._stream,a=this._buffer,n=this._missing;if(t.length&&(this._partial=!0),t.lengthn&&(u=t.slice(n),t=t.slice(0,n)),o?o.end(t):a.append(t),this._overflow=u,this._onparse()}};sp.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};vBe.exports=sp});var PBe=_((m$t,SBe)=>{SBe.exports=ve("fs").constants||ve("constants")});var FBe=_((y$t,QBe)=>{var WC=PBe(),xBe=E4(),BF=zh(),LBt=Buffer.alloc,bBe=qC().Readable,YC=qC().Writable,NBt=ve("string_decoder").StringDecoder,wF=_G(),OBt=parseInt("755",8),MBt=parseInt("644",8),kBe=LBt(1024),qG=function(){},HG=function(t,e){e&=511,e&&t.push(kBe.slice(0,512-e))};function UBt(t){switch(t&WC.S_IFMT){case WC.S_IFBLK:return"block-device";case WC.S_IFCHR:return"character-device";case WC.S_IFDIR:return"directory";case WC.S_IFIFO:return"fifo";case WC.S_IFLNK:return"symlink"}return"file"}var vF=function(t){YC.call(this),this.written=0,this._to=t,this._destroyed=!1};BF(vF,YC);vF.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};vF.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var DF=function(){YC.call(this),this.linkname="",this._decoder=new NBt("utf-8"),this._destroyed=!1};BF(DF,YC);DF.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};DF.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Wv=function(){YC.call(this),this._destroyed=!1};BF(Wv,YC);Wv.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};Wv.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var wA=function(t){if(!(this instanceof wA))return new wA(t);bBe.call(this,t),this._drain=qG,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};BF(wA,bBe);wA.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=qG);var o=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=UBt(t.mode)),t.mode||(t.mode=t.type==="directory"?OBt:MBt),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var a=this.push(e);return HG(o,t.size),a?process.nextTick(r):this._drain=r,new Wv}if(t.type==="symlink"&&!t.linkname){var n=new DF;return xBe(n,function(A){if(A)return o.destroy(),r(A);t.linkname=n.linkname,o._encode(t),r()}),n}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new Wv;var u=new vF(this);return this._stream=u,xBe(u,function(A){if(o._stream=null,A)return o.destroy(),r(A);if(u.written!==t.size)return o.destroy(),r(new Error("size mismatch"));HG(o,t.size),o._finalizing&&o.finalize(),r()}),u}};wA.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(kBe),this.push(null))};wA.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};wA.prototype._encode=function(t){if(!t.pax){var e=wF.encode(t);if(e){this.push(e);return}}this._encodePax(t)};wA.prototype._encodePax=function(t){var e=wF.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(wF.encode(r)),this.push(e),HG(this,e.length),r.size=t.size,r.type=t.type,this.push(wF.encode(r))};wA.prototype._read=function(t){var e=this._drain;this._drain=qG,e()};QBe.exports=wA});var RBe=_(jG=>{jG.extract=DBe();jG.pack=FBe()});var WBe=_((M$t,GBe)=>{"use strict";var Yv=class t{constructor(e,r,o){this.__specs=e||{},Object.keys(this.__specs).forEach(a=>{if(typeof this.__specs[a]=="string"){let n=this.__specs[a],u=this.__specs[n];if(u){let A=u.aliases||[];A.push(a,n),u.aliases=[...new Set(A)],this.__specs[a]=u}else throw new Error(`Alias refers to invalid key: ${n} -> ${a}`)}}),this.__opts=r||{},this.__providers=qBe(o.filter(a=>a!=null&&typeof a=="object")),this.__isFiggyPudding=!0}get(e){return JG(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[o,a]of this.entries())e.call(r,a,o,this)}toJSON(){let e={};return this.forEach((r,o)=>{e[o]=r}),e}*entries(e){for(let o of Object.keys(this.__specs))yield[o,this.get(o)];let r=e||this.__opts.other;if(r){let o=new Set;for(let a of this.__providers){let n=a.entries?a.entries(r):evt(a);for(let[u,A]of n)r(u)&&!o.has(u)&&(o.add(u),yield[u,A])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new t(this.__specs,this.__opts,qBe(this.__providers).concat(e)),jBe)}};try{let t=ve("util");Yv.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch{}function ZBt(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function JG(t,e,r){let o=t.__specs[e];if(r&&!o&&(!t.__opts.other||!t.__opts.other(e)))ZBt(e);else{o||(o={});let a;for(let n of t.__providers){if(a=HBe(e,n),a===void 0&&o.aliases&&o.aliases.length){for(let u of o.aliases)if(u!==e&&(a=HBe(u,n),a!==void 0))break}if(a!==void 0)break}return a===void 0&&o.default!==void 0?typeof o.default=="function"?o.default(t):o.default:a}}function HBe(t,e){let r;return e.__isFiggyPudding?r=JG(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var jBe={has(t,e){return e in t.__specs&&JG(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Yv.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};GBe.exports=$Bt;function $Bt(t,e){function r(...o){return new Proxy(new Yv(t,e,o),jBe)}return r}function qBe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function evt(t){return Object.keys(t).map(e=>[e,t[e]])}});var KBe=_((U$t,DA)=>{"use strict";var Kv=ve("crypto"),tvt=WBe(),rvt=ve("stream").Transform,YBe=["sha256","sha384","sha512"],nvt=/^[a-z0-9+/]+(?:=?=?)$/i,ivt=/^([^-]+)-([^?]+)([?\S*]*)$/,svt=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,ovt=/^[\x21-\x7E]+$/,na=tvt({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>hvt},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),n0=class{get isHash(){return!0}constructor(e,r){r=na(r);let o=!!r.strict;this.source=e.trim();let a=this.source.match(o?svt:ivt);if(!a||o&&!YBe.some(u=>u===a[1]))return;this.algorithm=a[1],this.digest=a[2];let n=a[3];this.options=n?n.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=na(e),e.strict&&!(YBe.some(o=>o===this.algorithm)&&this.digest.match(nvt)&&(this.options||[]).every(o=>o.match(ovt))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Cd=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=na(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(o=>this[o].map(a=>n0.prototype.toString.call(a,e)).filter(a=>a.length).join(r)).filter(o=>o.length).join(r)}concat(e,r){r=na(r);let o=typeof e=="string"?e:Vv(e,r);return vA(`${this.toString(r)} ${o}`,r)}hexDigest(){return vA(this,{single:!0}).hexDigest()}match(e,r){r=na(r);let o=vA(e,r),a=o.pickAlgorithm(r);return this[a]&&o[a]&&this[a].find(n=>o[a].find(u=>n.digest===u.digest))||!1}pickAlgorithm(e){e=na(e);let r=e.pickAlgorithm,o=Object.keys(this);if(!o.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return o.reduce((a,n)=>r(a,n)||a)}};DA.exports.parse=vA;function vA(t,e){if(e=na(e),typeof t=="string")return zG(t,e);if(t.algorithm&&t.digest){let r=new Cd;return r[t.algorithm]=[t],zG(Vv(r,e),e)}else return zG(Vv(t,e),e)}function zG(t,e){return e.single?new n0(t,e):t.trim().split(/\s+/).reduce((r,o)=>{let a=new n0(o,e);if(a.algorithm&&a.digest){let n=a.algorithm;r[n]||(r[n]=[]),r[n].push(a)}return r},new Cd)}DA.exports.stringify=Vv;function Vv(t,e){return e=na(e),t.algorithm&&t.digest?n0.prototype.toString.call(t,e):typeof t=="string"?Vv(vA(t,e),e):Cd.prototype.toString.call(t,e)}DA.exports.fromHex=avt;function avt(t,e,r){r=na(r);let o=r.options&&r.options.length?`?${r.options.join("?")}`:"";return vA(`${e}-${Buffer.from(t,"hex").toString("base64")}${o}`,r)}DA.exports.fromData=lvt;function lvt(t,e){e=na(e);let r=e.algorithms,o=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((a,n)=>{let u=Kv.createHash(n).update(t).digest("base64"),A=new n0(`${n}-${u}${o}`,e);if(A.algorithm&&A.digest){let p=A.algorithm;a[p]||(a[p]=[]),a[p].push(A)}return a},new Cd)}DA.exports.fromStream=cvt;function cvt(t,e){e=na(e);let r=e.Promise||Promise,o=XG(e);return new r((a,n)=>{t.pipe(o),t.on("error",n),o.on("error",n);let u;o.on("integrity",A=>{u=A}),o.on("end",()=>a(u)),o.on("data",()=>{})})}DA.exports.checkData=uvt;function uvt(t,e,r){if(r=na(r),e=vA(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let o=e.pickAlgorithm(r),a=Kv.createHash(o).update(t).digest("base64"),n=vA({algorithm:o,digest:a}),u=n.match(e,r);if(u||!r.error)return u;if(typeof r.size=="number"&&t.length!==r.size){let A=new Error(`data size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${t.length}`);throw A.code="EBADSIZE",A.found=t.length,A.expected=r.size,A.sri=e,A}else{let A=new Error(`Integrity checksum failed when using ${o}: Wanted ${e}, but got ${n}. (${t.length} bytes)`);throw A.code="EINTEGRITY",A.found=n,A.expected=e,A.algorithm=o,A.sri=e,A}}DA.exports.checkStream=Avt;function Avt(t,e,r){r=na(r);let o=r.Promise||Promise,a=XG(r.concat({integrity:e}));return new o((n,u)=>{t.pipe(a),t.on("error",u),a.on("error",u);let A;a.on("verified",p=>{A=p}),a.on("end",()=>n(A)),a.on("data",()=>{})})}DA.exports.integrityStream=XG;function XG(t){t=na(t);let e=t.integrity&&vA(t.integrity,t),r=e&&Object.keys(e).length,o=r&&e.pickAlgorithm(t),a=r&&e[o],n=Array.from(new Set(t.algorithms.concat(o?[o]:[]))),u=n.map(Kv.createHash),A=0,p=new rvt({transform(h,E,w){A+=h.length,u.forEach(D=>D.update(h,E)),w(null,h,E)}}).on("end",()=>{let h=t.options&&t.options.length?`?${t.options.join("?")}`:"",E=vA(u.map((D,b)=>`${n[b]}-${D.digest("base64")}${h}`).join(" "),t),w=r&&E.match(e,t);if(typeof t.size=="number"&&A!==t.size){let D=new Error(`stream size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${A}`);D.code="EBADSIZE",D.found=A,D.expected=t.size,D.sri=e,p.emit("error",D)}else if(t.integrity&&!w){let D=new Error(`${e} integrity checksum failed when using ${o}: wanted ${a} but got ${E}. (${A} bytes)`);D.code="EINTEGRITY",D.found=E,D.expected=a,D.algorithm=o,D.sri=e,p.emit("error",D)}else p.emit("size",A),p.emit("integrity",E),w&&p.emit("verified",w)});return p}DA.exports.create=fvt;function fvt(t){t=na(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",o=e.map(Kv.createHash);return{update:function(a,n){return o.forEach(u=>u.update(a,n)),this},digest:function(a){return e.reduce((u,A)=>{let p=o.shift().digest("base64"),h=new n0(`${A}-${p}${r}`,t);if(h.algorithm&&h.digest){let E=h.algorithm;u[E]||(u[E]=[]),u[E].push(h)}return u},new Cd)}}}var pvt=new Set(Kv.getHashes()),VBe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>pvt.has(t));function hvt(t,e){return VBe.indexOf(t.toLowerCase())>=VBe.indexOf(e.toLowerCase())?t:e}});var Bve=_((qnr,wve)=>{var hDt=WN();function gDt(t){return hDt(t)?void 0:t}wve.exports=gDt});var Dve=_((jnr,vve)=>{var dDt=Cb(),mDt=hH(),yDt=yH(),EDt=Wg(),CDt=Eg(),IDt=Bve(),wDt=l8(),BDt=pH(),vDt=1,DDt=2,SDt=4,PDt=wDt(function(t,e){var r={};if(t==null)return r;var o=!1;e=dDt(e,function(n){return n=EDt(n,t),o||(o=n.length>1),n}),CDt(t,BDt(t),r),o&&(r=mDt(r,vDt|DDt|SDt,IDt));for(var a=e.length;a--;)yDt(r,e[a]);return r});vve.exports=PDt});St();Ve();St();var kve=ve("child_process"),Qve=et(sg());Gt();var oE=new Map([]);var P2={};Vt(P2,{BaseCommand:()=>ut,WorkspaceRequiredError:()=>or,getCli:()=>qhe,getDynamicLibs:()=>Hhe,getPluginConfiguration:()=>lE,openWorkspace:()=>aE,pluginCommands:()=>oE,runExit:()=>Nk});Gt();var ut=class extends ot{constructor(){super(...arguments);this.cwd=de.String("--cwd",{hidden:!0})}validateAndExecute(){if(typeof this.cwd<"u")throw new it("The --cwd option is ambiguous when used anywhere else than the very first parameter provided in the command line, before even the command path");return super.validateAndExecute()}};Ve();St();Gt();var or=class extends it{constructor(e,r){let o=V.relative(e,r),a=V.join(e,_t.fileName);super(`This command can only be run from within a workspace of your project (${o} isn't a workspace of ${a}).`)}};Ve();St();sA();Ol();z1();Gt();var PAt=et(ni());il();var Hhe=()=>new Map([["@yarnpkg/cli",P2],["@yarnpkg/core",S2],["@yarnpkg/fslib",Aw],["@yarnpkg/libzip",K1],["@yarnpkg/parsers",Ew],["@yarnpkg/shell",e2],["clipanion",Qw],["semver",PAt],["typanion",Yo]]);Ve();async function aE(t,e){let{project:r,workspace:o}=await Qt.find(t,e);if(!o)throw new or(r.cwd,e);return o}Ve();St();sA();Ol();z1();Gt();var NDt=et(ni());il();var MH={};Vt(MH,{AddCommand:()=>fE,BinCommand:()=>pE,CacheCleanCommand:()=>hE,ClipanionCommand:()=>CE,ConfigCommand:()=>yE,ConfigGetCommand:()=>gE,ConfigSetCommand:()=>dE,ConfigUnsetCommand:()=>mE,DedupeCommand:()=>EE,EntryCommand:()=>wE,ExecCommand:()=>vE,ExplainCommand:()=>PE,ExplainPeerRequirementsCommand:()=>DE,HelpCommand:()=>IE,InfoCommand:()=>xE,LinkCommand:()=>kE,NodeCommand:()=>QE,PluginCheckCommand:()=>FE,PluginImportCommand:()=>LE,PluginImportSourcesCommand:()=>NE,PluginListCommand:()=>RE,PluginRemoveCommand:()=>OE,PluginRuntimeCommand:()=>ME,RebuildCommand:()=>UE,RemoveCommand:()=>_E,RunCommand:()=>qE,RunIndexCommand:()=>HE,SetResolutionCommand:()=>jE,SetVersionCommand:()=>SE,SetVersionSourcesCommand:()=>TE,UnlinkCommand:()=>GE,UpCommand:()=>WE,VersionCommand:()=>BE,WhyCommand:()=>YE,WorkspaceCommand:()=>XE,WorkspacesListCommand:()=>zE,YarnCommand:()=>bE,dedupeUtils:()=>Yk,default:()=>Igt,suggestUtils:()=>nu});var Eme=et(sg());Ve();Ve();Ve();Gt();var bge=et(Q2());il();var nu={};Vt(nu,{Modifier:()=>lH,Strategy:()=>jk,Target:()=>F2,WorkspaceModifier:()=>vge,applyModifier:()=>Vft,extractDescriptorFromPath:()=>cH,extractRangeModifier:()=>Dge,fetchDescriptorFrom:()=>uH,findProjectDescriptors:()=>xge,getModifier:()=>R2,getSuggestedDescriptors:()=>T2,makeWorkspaceDescriptor:()=>Pge,toWorkspaceModifier:()=>Sge});Ve();Ve();St();var aH=et(ni()),Wft="workspace:",F2=(o=>(o.REGULAR="dependencies",o.DEVELOPMENT="devDependencies",o.PEER="peerDependencies",o))(F2||{}),lH=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="",o))(lH||{}),vge=(o=>(o.CARET="^",o.TILDE="~",o.EXACT="*",o))(vge||{}),jk=(n=>(n.KEEP="keep",n.REUSE="reuse",n.PROJECT="project",n.LATEST="latest",n.CACHE="cache",n))(jk||{});function R2(t,e){return t.exact?"":t.caret?"^":t.tilde?"~":e.configuration.get("defaultSemverRangePrefix")}var Yft=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function Dge(t,{project:e}){let r=t.match(Yft);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Vft(t,e){let{protocol:r,source:o,params:a,selector:n}=G.parseRange(t.range);return aH.default.valid(n)&&(n=`${e}${t.range}`),G.makeDescriptor(t,G.makeRange({protocol:r,source:o,params:a,selector:n}))}function Sge(t){switch(t){case"^":return"^";case"~":return"~";case"":return"*";default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function Pge(t,e){return G.makeDescriptor(t.anchoredDescriptor,`${Wft}${Sge(e)}`)}async function xge(t,{project:e,target:r}){let o=new Map,a=n=>{let u=o.get(n.descriptorHash);return u||o.set(n.descriptorHash,u={descriptor:n,locators:[]}),u};for(let n of e.workspaces)if(r==="peerDependencies"){let u=n.manifest.peerDependencies.get(t.identHash);u!==void 0&&a(u).locators.push(n.anchoredLocator)}else{let u=n.manifest.dependencies.get(t.identHash),A=n.manifest.devDependencies.get(t.identHash);r==="devDependencies"?A!==void 0?a(A).locators.push(n.anchoredLocator):u!==void 0&&a(u).locators.push(n.anchoredLocator):u!==void 0?a(u).locators.push(n.anchoredLocator):A!==void 0&&a(A).locators.push(n.anchoredLocator)}return o}async function cH(t,{cwd:e,workspace:r}){return await Kft(async o=>{V.isAbsolute(t)||(t=V.relative(r.cwd,V.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:a}=r,n=await uH(G.makeIdent(null,"archive"),t,{project:r.project,cache:o,workspace:r});if(!n)throw new Error("Assertion failed: The descriptor should have been found");let u=new Ri,A=a.configuration.makeResolver(),p=a.configuration.makeFetcher(),h={checksums:a.storedChecksums,project:a,cache:o,fetcher:p,report:u,resolver:A},E=A.bindDescriptor(n,r.anchoredLocator,h),w=G.convertDescriptorToLocator(E),D=await p.fetch(w,h),b=await _t.find(D.prefixPath,{baseFs:D.packageFs});if(!b.name)throw new Error("Target path doesn't have a name");return G.makeDescriptor(b.name,t)})}async function T2(t,{project:e,workspace:r,cache:o,target:a,fixed:n,modifier:u,strategies:A,maxResults:p=1/0}){if(!(p>=0))throw new Error(`Invalid maxResults (${p})`);let[h,E]=t.range!=="unknown"?n||Ur.validRange(t.range)||!t.range.match(/^[a-z0-9._-]+$/i)?[t.range,"latest"]:["unknown",t.range]:["unknown","latest"];if(h!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${G.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let w=typeof r<"u"&&r!==null&&r.manifest[a].get(t.identHash)||null,D=[],b=[],C=async T=>{try{await T()}catch(N){b.push(N)}};for(let T of A){if(D.length>=p)break;switch(T){case"keep":await C(async()=>{w&&D.push({descriptor:w,name:`Keep ${G.prettyDescriptor(e.configuration,w)}`,reason:"(no changes)"})});break;case"reuse":await C(async()=>{for(let{descriptor:N,locators:U}of(await xge(t,{project:e,target:a})).values()){if(U.length===1&&U[0].locatorHash===r.anchoredLocator.locatorHash&&A.includes("keep"))continue;let J=`(originally used by ${G.prettyLocator(e.configuration,U[0])}`;J+=U.length>1?` and ${U.length-1} other${U.length>2?"s":""})`:")",D.push({descriptor:N,name:`Reuse ${G.prettyDescriptor(e.configuration,N)}`,reason:J})}});break;case"cache":await C(async()=>{for(let N of e.storedDescriptors.values())N.identHash===t.identHash&&D.push({descriptor:N,name:`Reuse ${G.prettyDescriptor(e.configuration,N)}`,reason:"(already used somewhere in the lockfile)"})});break;case"project":await C(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let N=e.tryWorkspaceByIdent(t);if(N===null)return;let U=Pge(N,u);D.push({descriptor:U,name:`Attach ${G.prettyDescriptor(e.configuration,U)}`,reason:`(local workspace at ${pe.pretty(e.configuration,N.relativeCwd,pe.Type.PATH)})`})});break;case"latest":{let N=e.configuration.get("enableNetwork"),U=e.configuration.get("enableOfflineMode");await C(async()=>{if(a==="peerDependencies")D.push({descriptor:G.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!N&&!U)D.push({descriptor:null,name:"Resolve from latest",reason:pe.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let J=await uH(t,E,{project:e,cache:o,workspace:r,modifier:u});J&&D.push({descriptor:J,name:`Use ${G.prettyDescriptor(e.configuration,J)}`,reason:`(resolved from ${U?"the cache":"latest"})`})}})}break}}return{suggestions:D.slice(0,p),rejections:b.slice(0,p)}}async function uH(t,e,{project:r,cache:o,workspace:a,preserveModifier:n=!0,modifier:u}){let A=r.configuration.normalizeDependency(G.makeDescriptor(t,e)),p=new Ri,h=r.configuration.makeFetcher(),E=r.configuration.makeResolver(),w={project:r,fetcher:h,cache:o,checksums:r.storedChecksums,report:p,cacheOptions:{skipIntegrityCheck:!0}},D={...w,resolver:E,fetchOptions:w},b=E.bindDescriptor(A,a.anchoredLocator,D),C=await E.getCandidates(b,{},D);if(C.length===0)return null;let T=C[0],{protocol:N,source:U,params:J,selector:te}=G.parseRange(G.convertToManifestRange(T.reference));if(N===r.configuration.get("defaultProtocol")&&(N=null),aH.default.valid(te)){let le=te;if(typeof u<"u")te=u+te;else if(n!==!1){let Ie=typeof n=="string"?n:A.range;te=Dge(Ie,{project:r})+te}let ce=G.makeDescriptor(T,G.makeRange({protocol:N,source:U,params:J,selector:te}));(await E.getCandidates(r.configuration.normalizeDependency(ce),{},D)).length!==1&&(te=le)}return G.makeDescriptor(T,G.makeRange({protocol:N,source:U,params:J,selector:te}))}async function Kft(t){return await ae.mktempPromise(async e=>{let r=ze.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Wr(e,{configuration:r,check:!1,immutable:!1}))})}var fE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.fixed=de.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=de.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=de.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=de.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=de.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=de.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=de.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=de.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=de.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=de.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.silent=de.Boolean("--silent",{hidden:!0});this.packages=de.Rest()}static{this.paths=[["add"]]}static{this.usage=ot.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"],["Add a local package (gzipped tarball format) to the current workspace","$0 add local-package-name@file:../path/to/local-package-name-v0.1.2.tgz"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=A||r.get("preferReuse"),h=R2(this,o),E=[p?"reuse":void 0,"project",this.cached?"cache":void 0,"latest"].filter(U=>typeof U<"u"),w=A?1/0:1,D=await Promise.all(this.packages.map(async U=>{let J=U.match(/^\.{0,2}\//)?await cH(U,{cwd:this.context.cwd,workspace:a}):G.tryParseDescriptor(U),te=U.match(/^(https?:|git@github)/);if(te)throw new it(`It seems you are trying to add a package using a ${pe.pretty(r,`${te[0]}...`,pe.Type.RANGE)} url; we now require package names to be explicitly specified. -Try running the command again with the package name prefixed: ${pe.pretty(r,"yarn add",pe.Type.CODE)} ${pe.pretty(r,G.makeDescriptor(G.makeIdent(null,"my-package"),`${te[0]}...`),pe.Type.DESCRIPTOR)}`);if(!J)throw new it(`The ${pe.pretty(r,U,pe.Type.CODE)} string didn't match the required format (package-name@range). Did you perhaps forget to explicitly reference the package name?`);let le=Jft(a,J,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional});return await Promise.all(le.map(async ue=>{let Ie=await T2(J,{project:o,workspace:a,cache:n,fixed:u,target:ue,modifier:h,strategies:E,maxResults:w});return{request:J,suggestedDescriptors:Ie,target:ue}}))})).then(U=>U.flat()),b=await pA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async U=>{for(let{request:J,suggestedDescriptors:{suggestions:te,rejections:le}}of D)if(te.filter(ue=>ue.descriptor!==null).length===0){let[ue]=le;if(typeof ue>"u")throw new Error("Assertion failed: Expected an error to have been set");o.configuration.get("enableNetwork")?U.reportError(27,`${G.prettyDescriptor(r,J)} can't be resolved to a satisfying range`):U.reportError(27,`${G.prettyDescriptor(r,J)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),U.reportSeparator(),U.reportExceptionOnce(ue)}});if(b.hasErrors())return b.exitCode();let C=!1,T=[],N=[];for(let{suggestedDescriptors:{suggestions:U},target:J}of D){let te,le=U.filter(he=>he.descriptor!==null),ce=le[0].descriptor,ue=le.every(he=>G.areDescriptorsEqual(he.descriptor,ce));le.length===1||ue?te=ce:(C=!0,{answer:te}=await(0,bge.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:U.map(({descriptor:he,name:De,reason:Ee})=>he?{name:De,hint:Ee,descriptor:he}:{name:De,hint:Ee,disabled:!0}),onCancel:()=>process.exit(130),result(he){return this.find(he,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Ie=a.manifest[J].get(te.identHash);(typeof Ie>"u"||Ie.descriptorHash!==te.descriptorHash)&&(a.manifest[J].set(te.identHash,te),this.optional&&(J==="dependencies"?a.manifest.ensureDependencyMeta({...te,range:"unknown"}).optional=!0:J==="peerDependencies"&&(a.manifest.ensurePeerDependencyMeta({...te,range:"unknown"}).optional=!0)),typeof Ie>"u"?T.push([a,J,te,E]):N.push([a,J,Ie,te]))}return await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyAddition,T),await r.triggerMultipleHooks(U=>U.afterWorkspaceDependencyReplacement,N),C&&this.context.stdout.write(` -`),await o.installWithNewReport({json:this.json,stdout:this.context.stdout,quiet:this.context.quiet},{cache:n,mode:this.mode})}};function Jft(t,e,{dev:r,peer:o,preferDev:a,optional:n}){let u=t.manifest.dependencies.has(e.identHash),A=t.manifest.devDependencies.has(e.identHash),p=t.manifest.peerDependencies.has(e.identHash);if((r||o)&&u)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!o&&p)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(n&&A)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(n&&!o&&p)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||a)&&n)throw new it(`Package "${G.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);let h=[];return o&&h.push("peerDependencies"),(r||a)&&h.push("devDependencies"),n&&h.push("dependencies"),h.length>0?h:A?["devDependencies"]:p?["peerDependencies"]:["dependencies"]}Ve();Ve();Gt();var pE=class extends ut{constructor(){super(...arguments);this.verbose=de.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=de.String({required:!1})}static{this.paths=[["bin"]]}static{this.usage=ot.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await Qt.find(r,this.context.cwd);if(await o.restoreInstallState(),this.name){let A=(await hn.getPackageAccessibleBinaries(a,{project:o})).get(this.name);if(!A)throw new it(`Couldn't find a binary named "${this.name}" for package "${G.prettyLocator(r,a)}"`);let[,p]=A;return this.context.stdout.write(`${p} -`),0}return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async u=>{let A=await hn.getPackageAccessibleBinaries(a,{project:o}),h=Array.from(A.keys()).reduce((E,w)=>Math.max(E,w.length),0);for(let[E,[w,D]]of A)u.reportJson({name:E,source:G.stringifyIdent(w),path:D});if(this.verbose)for(let[E,[w]]of A)u.reportInfo(null,`${E.padEnd(h," ")} ${G.prettyLocator(r,w)}`);else for(let E of A.keys())u.reportInfo(null,E)})).exitCode()}};Ve();St();Gt();var hE=class extends ut{constructor(){super(...arguments);this.mirror=de.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=de.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}static{this.paths=[["cache","clean"],["cache","clear"]]}static{this.usage=ot.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(!r.get("enableCacheClean"))throw new it("Cache cleaning is currently disabled. To enable it, set `enableCacheClean: true` in your configuration file. Note: Cache cleaning is typically not required and should be avoided when using Zero-Installs.");let o=await Wr.find(r);return(await Lt.start({configuration:r,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&o.mirrorCwd!==null,u=!this.mirror;n&&(await ae.removePromise(o.mirrorCwd),await r.triggerHook(A=>A.cleanGlobalArtifacts,r)),u&&await ae.removePromise(o.cwd)})).exitCode()}};Ve();Gt();var Qge=et(L2()),AH=ve("util"),gE=class extends ut{constructor(){super(...arguments);this.why=de.Boolean("--why",!1,{description:"Print the explanation for why a setting has its value"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=de.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=de.String()}static{this.paths=[["config","get"]]}static{this.usage=ot.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=this.name.replace(/[.[].*$/,""),a=this.name.replace(/^[^.[]*/,"");if(typeof r.settings.get(o)>"u")throw new it(`Couldn't find a configuration settings named "${o}"`);let u=r.getSpecial(o,{hideSecrets:!this.unsafe,getNativePaths:!0}),A=qe.convertMapsToIndexableObjects(u),p=a?(0,Qge.default)(A,a):A,h=await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async E=>{E.reportJson(p)});if(!this.json){if(typeof p=="string")return this.context.stdout.write(`${p} -`),h.exitCode();AH.inspect.styles.name="cyan",this.context.stdout.write(`${(0,AH.inspect)(p,{depth:1/0,colors:r.get("enableColors"),compact:!1})} -`)}return h.exitCode()}};Ve();Gt();var Ide=et(gH()),wde=et(L2()),Bde=et(dH()),mH=ve("util"),dE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=de.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=de.String();this.value=de.String()}static{this.paths=[["config","set"]]}static{this.usage=ot.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);if(a==="enableStrictSettings")throw new it("This setting only affects the file it's in, and thus cannot be set from the CLI");let A=this.json?JSON.parse(this.value):this.value;await(this.home?C=>ze.updateHomeConfiguration(C):C=>ze.updateConfiguration(o(),C))(C=>{if(n){let T=(0,Ide.default)(C);return(0,Bde.default)(T,this.name,A),T}else return{...C,[a]:A}});let E=(await ze.find(this.context.cwd,this.context.plugins)).getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),w=qe.convertMapsToIndexableObjects(E),D=n?(0,wde.default)(w,n):w;return(await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async C=>{mH.inspect.styles.name="cyan",C.reportInfo(0,`Successfully set ${this.name} to ${(0,mH.inspect)(D,{depth:1/0,colors:r.get("enableColors"),compact:!1})}`)})).exitCode()}};Ve();Gt();var Tde=et(gH()),Lde=et(Pde()),Nde=et(EH()),mE=class extends ut{constructor(){super(...arguments);this.home=de.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=de.String()}static{this.paths=[["config","unset"]]}static{this.usage=ot.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=()=>{if(!r.projectCwd)throw new it("This command must be run from within a project folder");return r.projectCwd},a=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof r.settings.get(a)>"u")throw new it(`Couldn't find a configuration settings named "${a}"`);let A=this.home?h=>ze.updateHomeConfiguration(h):h=>ze.updateConfiguration(o(),h);return(await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout},async h=>{let E=!1;await A(w=>{if(!(0,Lde.default)(w,this.name))return h.reportWarning(0,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),E=!0,w;let D=n?(0,Tde.default)(w):{...w};return(0,Nde.default)(D,this.name),D}),E||h.reportInfo(0,`Successfully unset ${this.name}`)})).exitCode()}};Ve();St();Gt();var Wk=ve("util"),yE=class extends ut{constructor(){super(...arguments);this.noDefaults=de.Boolean("--no-defaults",!1,{description:"Omit the default values from the display"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.verbose=de.Boolean("-v,--verbose",{hidden:!0});this.why=de.Boolean("--why",{hidden:!0});this.names=de.Rest()}static{this.paths=[["config"]]}static{this.usage=ot.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins,{strict:!1}),o=await Qy({configuration:r,stdout:this.context.stdout,forceError:this.json},[{option:this.verbose,message:"The --verbose option is deprecated, the settings' descriptions are now always displayed"},{option:this.why,message:"The --why option is deprecated, the settings' sources are now always displayed"}]);if(o!==null)return o;let a=this.names.length>0?[...new Set(this.names)].sort():[...r.settings.keys()].sort(),n,u=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async A=>{if(r.invalid.size>0&&!this.json){for(let[p,h]of r.invalid)A.reportError(34,`Invalid configuration key "${p}" in ${h}`);A.reportSeparator()}if(this.json)for(let p of a){let h=r.settings.get(p);typeof h>"u"&&A.reportError(34,`No configuration key named "${p}"`);let E=r.getSpecial(p,{hideSecrets:!0,getNativePaths:!0}),w=r.sources.get(p)??"",D=w&&w[0]!=="<"?Ae.fromPortablePath(w):w;A.reportJson({key:p,effective:E,source:D,...h})}else{let p={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},h={},E={children:h};for(let w of a){if(this.noDefaults&&!r.sources.has(w))continue;let D=r.settings.get(w),b=r.sources.get(w)??"",C=r.getSpecial(w,{hideSecrets:!0,getNativePaths:!0}),T={Description:{label:"Description",value:pe.tuple(pe.Type.MARKDOWN,{text:D.description,format:this.cli.format(),paragraphs:!1})},Source:{label:"Source",value:pe.tuple(b[0]==="<"?pe.Type.CODE:pe.Type.PATH,b)}};h[w]={value:pe.tuple(pe.Type.CODE,w),children:T};let N=(U,J)=>{for(let[te,le]of J)if(le instanceof Map){let ce={};U[te]={children:ce},N(ce,le)}else U[te]={label:te,value:pe.tuple(pe.Type.NO_HINT,(0,Wk.inspect)(le,p))}};C instanceof Map?N(T,C):T.Value={label:"Value",value:pe.tuple(pe.Type.NO_HINT,(0,Wk.inspect)(C,p))}}a.length!==1&&(n=void 0),As.emitTree(E,{configuration:r,json:this.json,stdout:this.context.stdout,separators:2})}});if(!this.json&&typeof n<"u"){let A=a[0],p=(0,Wk.inspect)(r.getSpecial(A,{hideSecrets:!0,getNativePaths:!0}),{colors:r.get("enableColors")});this.context.stdout.write(` -`),this.context.stdout.write(`${p} -`)}return u.exitCode()}};Ve();Gt();il();var Yk={};Vt(Yk,{Strategy:()=>N2,acceptedStrategies:()=>Q0t,dedupe:()=>CH});Ve();Ve();var Ode=et(Xo()),N2=(e=>(e.HIGHEST="highest",e))(N2||{}),Q0t=new Set(Object.values(N2)),F0t={highest:async(t,e,{resolver:r,fetcher:o,resolveOptions:a,fetchOptions:n})=>{let u=new Map;for(let[p,h]of t.storedResolutions){let E=t.storedDescriptors.get(p);if(typeof E>"u")throw new Error(`Assertion failed: The descriptor (${p}) should have been registered`);qe.getSetWithDefault(u,E.identHash).add(h)}let A=new Map(qe.mapAndFilter(t.storedDescriptors.values(),p=>G.isVirtualDescriptor(p)?qe.mapAndFilter.skip:[p.descriptorHash,qe.makeDeferred()]));for(let p of t.storedDescriptors.values()){let h=A.get(p.descriptorHash);if(typeof h>"u")throw new Error(`Assertion failed: The descriptor (${p.descriptorHash}) should have been registered`);let E=t.storedResolutions.get(p.descriptorHash);if(typeof E>"u")throw new Error(`Assertion failed: The resolution (${p.descriptorHash}) should have been registered`);let w=t.originalPackages.get(E);if(typeof w>"u")throw new Error(`Assertion failed: The package (${E}) should have been registered`);Promise.resolve().then(async()=>{let D=r.getResolutionDependencies(p,a),b=Object.fromEntries(await qe.allSettledSafe(Object.entries(D).map(async([te,le])=>{let ce=A.get(le.descriptorHash);if(typeof ce>"u")throw new Error(`Assertion failed: The descriptor (${le.descriptorHash}) should have been registered`);let ue=await ce.promise;if(!ue)throw new Error("Assertion failed: Expected the dependency to have been through the dedupe process itself");return[te,ue.updatedPackage]})));if(e.length&&!Ode.default.isMatch(G.stringifyIdent(p),e)||!r.shouldPersistResolution(w,a))return w;let C=u.get(p.identHash);if(typeof C>"u")throw new Error(`Assertion failed: The resolutions (${p.identHash}) should have been registered`);if(C.size===1)return w;let T=[...C].map(te=>{let le=t.originalPackages.get(te);if(typeof le>"u")throw new Error(`Assertion failed: The package (${te}) should have been registered`);return le}),N=await r.getSatisfying(p,b,T,a),U=N.locators?.[0];if(typeof U>"u"||!N.sorted)return w;let J=t.originalPackages.get(U.locatorHash);if(typeof J>"u")throw new Error(`Assertion failed: The package (${U.locatorHash}) should have been registered`);return J}).then(async D=>{let b=await t.preparePackage(D,{resolver:r,resolveOptions:a});h.resolve({descriptor:p,currentPackage:w,updatedPackage:D,resolvedPackage:b})}).catch(D=>{h.reject(D)})}return[...A.values()].map(p=>p.promise)}};async function CH(t,{strategy:e,patterns:r,cache:o,report:a}){let{configuration:n}=t,u=new Ri,A=n.makeResolver(),p=n.makeFetcher(),h={cache:o,checksums:t.storedChecksums,fetcher:p,project:t,report:u,cacheOptions:{skipIntegrityCheck:!0}},E={project:t,resolver:A,report:u,fetchOptions:h};return await a.startTimerPromise("Deduplication step",async()=>{let w=F0t[e],D=await w(t,r,{resolver:A,resolveOptions:E,fetcher:p,fetchOptions:h}),b=Ws.progressViaCounter(D.length);await a.reportProgress(b);let C=0;await Promise.all(D.map(U=>U.then(J=>{if(J===null||J.currentPackage.locatorHash===J.updatedPackage.locatorHash)return;C++;let{descriptor:te,currentPackage:le,updatedPackage:ce}=J;a.reportInfo(0,`${G.prettyDescriptor(n,te)} can be deduped from ${G.prettyLocator(n,le)} to ${G.prettyLocator(n,ce)}`),a.reportJson({descriptor:G.stringifyDescriptor(te),currentResolution:G.stringifyLocator(le),updatedResolution:G.stringifyLocator(ce)}),t.storedResolutions.set(te.descriptorHash,ce.locatorHash)}).finally(()=>b.tick())));let T;switch(C){case 0:T="No packages";break;case 1:T="One package";break;default:T=`${C} packages`}let N=pe.pretty(n,e,pe.Type.CODE);return a.reportInfo(0,`${T} can be deduped using the ${N} strategy`),C})}var EE=class extends ut{constructor(){super(...arguments);this.strategy=de.String("-s,--strategy","highest",{description:"The strategy to use when deduping dependencies",validator:js(N2)});this.check=de.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.patterns=de.Rest()}static{this.paths=[["dedupe"]]}static{this.usage=ot.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),a=await Wr.find(r);await o.restoreInstallState({restoreResolutions:!1});let n=0,u=await Lt.start({configuration:r,includeFooter:!1,stdout:this.context.stdout,json:this.json},async A=>{n=await CH(o,{strategy:this.strategy,patterns:this.patterns,cache:a,report:A})});return u.hasErrors()?u.exitCode():this.check?n?1:0:await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:a,mode:this.mode})}};Ve();Gt();var CE=class extends ut{static{this.paths=[["--clipanion=definitions"]]}async execute(){let{plugins:e}=await ze.find(this.context.cwd,this.context.plugins),r=[];for(let u of e){let{commands:A}=u[1];if(A){let h=Ko.from(A).definitions();r.push([u[0],h])}}let o=this.cli.definitions(),a=(u,A)=>u.split(" ").slice(1).join()===A.split(" ").slice(1).join(),n=Mde()["@yarnpkg/builder"].bundles.standard;for(let u of r){let A=u[1];for(let p of A)o.find(h=>a(h.path,p.path)).plugin={name:u[0],isDefault:n.includes(u[0])}}this.context.stdout.write(`${JSON.stringify(o,null,2)} -`)}};var IE=class extends ut{static{this.paths=[["help"],["--help"],["-h"]]}async execute(){this.context.stdout.write(this.cli.usage(null))}};Ve();St();Gt();var wE=class extends ut{constructor(){super(...arguments);this.leadingArgument=de.String();this.args=de.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!G.tryParseIdent(this.leadingArgument)){let r=V.resolve(this.context.cwd,Ae.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:r})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}};Ve();var BE=class extends ut{static{this.paths=[["-v"],["--version"]]}async execute(){this.context.stdout.write(`${nn||""} -`)}};Ve();Ve();Gt();var vE=class extends ut{constructor(){super(...arguments);this.commandName=de.String();this.args=de.Proxy()}static{this.paths=[["exec"]]}static{this.usage=ot.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,locator:a}=await Qt.find(r,this.context.cwd);return await o.restoreInstallState(),await hn.executePackageShellcode(a,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:o})}};Ve();Gt();il();var DE=class extends ut{constructor(){super(...arguments);this.hash=de.String({required:!1,validator:NS(Pm(),[Bw(/^p[0-9a-f]{5}$/)])})}static{this.paths=[["explain","peer-requirements"]]}static{this.usage=ot.Usage({description:"explain a set of peer requirements",details:` - A peer requirement represents all peer requests that a subject must satisfy when providing a requested package to requesters. - - When the hash argument is specified, this command prints a detailed explanation of the peer requirement corresponding to the hash and whether it is satisfied or not. - - When used without arguments, this command lists all peer requirements and the corresponding hash that can be used to get detailed information about a given requirement. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding peer requirement for a hash","$0 explain peer-requirements p1a4ed"],["List all peer requirements","$0 explain peer-requirements"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);return await o.restoreInstallState({restoreResolutions:!1}),await o.applyLightResolution(),typeof this.hash<"u"?await T0t(this.hash,o,{stdout:this.context.stdout}):await L0t(o,{stdout:this.context.stdout})}};async function T0t(t,e,r){let o=e.peerRequirementNodes.get(t);if(typeof o>"u")throw new Error(`No peerDependency requirements found for hash: "${t}"`);let a=new Set,n=p=>a.has(p.requester.locatorHash)?{value:pe.tuple(pe.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:p.children.size>0?[{value:pe.tuple(pe.Type.NO_HINT,"...")}]:[]}:(a.add(p.requester.locatorHash),{value:pe.tuple(pe.Type.DEPENDENT,{locator:p.requester,descriptor:p.descriptor}),children:Object.fromEntries(Array.from(p.children.values(),h=>[G.stringifyLocator(h.requester),n(h)]))}),u=e.peerWarnings.find(p=>p.hash===t);return(await Lt.start({configuration:e.configuration,stdout:r.stdout,includeFooter:!1,includePrefix:!1},async p=>{let h=pe.mark(e.configuration),E=u?h.Cross:h.Check;if(p.reportInfo(0,`Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} is requested to provide ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)} by its descendants`),p.reportSeparator(),p.reportInfo(0,pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)),As.emitTree({children:Object.fromEntries(Array.from(o.requests.values(),w=>[G.stringifyLocator(w.requester),n(w)]))},{configuration:e.configuration,stdout:r.stdout,json:!1}),p.reportSeparator(),o.provided.range==="missing:"){let w=u?"":" , but all peer requests are optional";p.reportInfo(0,`${E} Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} does not provide ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)}${w}.`)}else{let w=e.storedResolutions.get(o.provided.descriptorHash);if(!w)throw new Error("Assertion failed: Expected the descriptor to be registered");let D=e.storedPackages.get(w);if(!D)throw new Error("Assertion failed: Expected the package to be registered");p.reportInfo(0,`${E} Package ${pe.pretty(e.configuration,o.subject,pe.Type.LOCATOR)} provides ${pe.pretty(e.configuration,o.ident,pe.Type.IDENT)} with version ${G.prettyReference(e.configuration,D.version??"0.0.0")}, ${u?"which does not satisfy all requests.":"which satisfies all requests"}`),u?.type===3&&(u.range?p.reportInfo(0,` The combined requested range is ${pe.pretty(e.configuration,u.range,pe.Type.RANGE)}`):p.reportInfo(0," Unfortunately, the requested ranges have no overlap"))}})).exitCode()}async function L0t(t,e){return(await Lt.start({configuration:t.configuration,stdout:e.stdout,includeFooter:!1,includePrefix:!1},async o=>{let a=pe.mark(t.configuration),n=qe.sortMap(t.peerRequirementNodes,[([,u])=>G.stringifyLocator(u.subject),([,u])=>G.stringifyIdent(u.ident)]);for(let[,u]of n.values()){if(!u.root)continue;let A=t.peerWarnings.find(E=>E.hash===u.hash),p=[...G.allPeerRequests(u)],h;if(p.length>2?h=` and ${p.length-1} other dependencies`:p.length===2?h=" and 1 other dependency":h="",u.provided.range!=="missing:"){let E=t.storedResolutions.get(u.provided.descriptorHash);if(!E)throw new Error("Assertion failed: Expected the resolution to have been registered");let w=t.storedPackages.get(E);if(!w)throw new Error("Assertion failed: Expected the provided package to have been registered");let D=`${pe.pretty(t.configuration,u.hash,pe.Type.CODE)} \u2192 ${A?a.Cross:a.Check} ${G.prettyLocator(t.configuration,u.subject)} provides ${G.prettyLocator(t.configuration,w)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;A?o.reportWarning(0,D):o.reportInfo(0,D)}else{let E=`${pe.pretty(t.configuration,u.hash,pe.Type.CODE)} \u2192 ${A?a.Cross:a.Check} ${G.prettyLocator(t.configuration,u.subject)} doesn't provide ${G.prettyIdent(t.configuration,u.ident)} to ${G.prettyLocator(t.configuration,p[0].requester)}${h}`;A?o.reportWarning(0,E):o.reportInfo(0,E)}}})).exitCode()}Ve();Gt();il();Ve();Ve();St();Gt();var Ude=et(ni()),SE=class extends ut{constructor(){super(...arguments);this.useYarnPath=de.Boolean("--yarn-path",{description:"Set the yarnPath setting even if the version can be accessed by Corepack"});this.onlyIfNeeded=de.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=de.String()}static{this.paths=[["set","version"]]}static{this.usage=ot.Usage({description:"lock the Yarn version used by the project",details:"\n This command will set a specific release of Yarn to be used by Corepack: https://nodejs.org/api/corepack.html.\n\n By default it only will set the `packageManager` field at the root of your project, but if the referenced release cannot be represented this way, if you already have `yarnPath` configured, or if you set the `--yarn-path` command line flag, then the release will also be downloaded from the Yarn GitHub repository, stored inside your project, and referenced via the `yarnPath` settings from your project `.yarnrc.yml` file.\n\n A very good use case for this command is to enforce the version of Yarn used by any single member of your team inside the same project - by doing this you ensure that you have control over Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting different behavior.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Use a release from a URL","$0 set version https://repo.yarnpkg.com/3.1.0/packages/yarnpkg-cli/bin/yarn.js"],["Download the version used to invoke the command","$0 set version self"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(this.onlyIfNeeded&&r.get("yarnPath")){let A=r.sources.get("yarnPath");if(!A)throw new Error("Assertion failed: Expected 'yarnPath' to have a source");let p=r.projectCwd??r.startingCwd;if(V.contains(p,A))return 0}let o=()=>{if(typeof nn>"u")throw new it("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},a,n=(A,p)=>({version:p,url:A.replace(/\{\}/g,p)});if(this.version==="self")a={url:o(),version:nn??"self"};else if(this.version==="latest"||this.version==="berry"||this.version==="stable")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await O2(r,"stable"));else if(this.version==="canary")a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await O2(r,"canary"));else if(this.version==="classic")a={url:"https://classic.yarnpkg.com/latest.js",version:"classic"};else if(this.version.match(/^https?:/))a={url:this.version,version:"remote"};else if(this.version.match(/^\.{0,2}[\\/]/)||Ae.isAbsolute(this.version))a={url:`file://${V.resolve(Ae.toPortablePath(this.version))}`,version:"file"};else if(Ur.satisfiesWithPrereleases(this.version,">=2.0.0"))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",this.version);else if(Ur.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))a=n("https://github.com/yarnpkg/yarn/releases/download/v{}/yarn-{}.js",this.version);else if(Ur.validRange(this.version))a=n("https://repo.yarnpkg.com/{}/packages/yarnpkg-cli/bin/yarn.js",await N0t(r,this.version));else throw new it(`Invalid version descriptor "${this.version}"`);return(await Lt.start({configuration:r,stdout:this.context.stdout,includeLogs:!this.context.quiet},async A=>{let p=async()=>{let h="file://";return a.url.startsWith(h)?(A.reportInfo(0,`Retrieving ${pe.pretty(r,a.url,pe.Type.PATH)}`),await ae.readFilePromise(a.url.slice(h.length))):(A.reportInfo(0,`Downloading ${pe.pretty(r,a.url,pe.Type.URL)}`),await on.get(a.url,{configuration:r}))};await IH(r,a.version,p,{report:A,useYarnPath:this.useYarnPath})})).exitCode()}};async function N0t(t,e){let o=(await on.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(a=>Ur.satisfiesWithPrereleases(a,e));if(o.length===0)throw new it(`No matching release found for range ${pe.pretty(t,e,pe.Type.RANGE)}.`);return o[0]}async function O2(t,e){let r=await on.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new it(`Tag ${pe.pretty(t,e,pe.Type.RANGE)} not found`);return r.latest[e]}async function IH(t,e,r,{report:o,useYarnPath:a}){let n,u=async()=>(typeof n>"u"&&(n=await r()),n);if(e===null){let te=await u();await ae.mktempPromise(async le=>{let ce=V.join(le,"yarn.cjs");await ae.writeFilePromise(ce,te);let{stdout:ue}=await Hr.execvp(process.execPath,[Ae.fromPortablePath(ce),"--version"],{cwd:le,env:{...t.env,YARN_IGNORE_PATH:"1"}});if(e=ue.trim(),!Ude.default.valid(e))throw new Error(`Invalid semver version. ${pe.pretty(t,"yarn --version",pe.Type.CODE)} returned: -${e}`)})}let A=t.projectCwd??t.startingCwd,p=V.resolve(A,".yarn/releases"),h=V.resolve(p,`yarn-${e}.cjs`),E=V.relative(t.startingCwd,h),w=qe.isTaggedYarnVersion(e),D=t.get("yarnPath"),b=!w,C=b||!!D||!!a;if(a===!1){if(b)throw new Jt(0,"You explicitly opted out of yarnPath usage in your command line, but the version you specified cannot be represented by Corepack");C=!1}else!C&&!process.env.COREPACK_ROOT&&(o.reportWarning(0,`You don't seem to have ${pe.applyHyperlink(t,"Corepack","https://nodejs.org/api/corepack.html")} enabled; we'll have to rely on ${pe.applyHyperlink(t,"yarnPath","https://yarnpkg.com/configuration/yarnrc#yarnPath")} instead`),C=!0);if(C){let te=await u();o.reportInfo(0,`Saving the new release in ${pe.pretty(t,E,"magenta")}`),await ae.removePromise(V.dirname(h)),await ae.mkdirPromise(V.dirname(h),{recursive:!0}),await ae.writeFilePromise(h,te,{mode:493}),await ze.updateConfiguration(A,{yarnPath:V.relative(A,h)})}else await ae.removePromise(V.dirname(h)),await ze.updateConfiguration(A,{yarnPath:ze.deleteProperty});let T=await _t.tryFind(A)||new _t;T.packageManager=`yarn@${w?e:await O2(t,"stable")}`;let N={};T.exportTo(N);let U=V.join(A,_t.fileName),J=`${JSON.stringify(N,null,T.indent)} -`;return await ae.changeFilePromise(U,J,{automaticNewlines:!0}),{bundleVersion:e}}function _de(t){return vr[jS(t)]}var O0t=/## (?YN[0-9]{4}) - `(?[A-Z_]+)`\n\n(?
(?:.(?!##))+)/gs;async function M0t(t){let r=`https://repo.yarnpkg.com/${qe.isTaggedYarnVersion(nn)?nn:await O2(t,"canary")}/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx`,o=await on.get(r,{configuration:t});return new Map(Array.from(o.toString().matchAll(O0t),({groups:a})=>{if(!a)throw new Error("Assertion failed: Expected the match to have been successful");let n=_de(a.code);if(a.name!==n)throw new Error(`Assertion failed: Invalid error code data: Expected "${a.name}" to be named "${n}"`);return[a.code,a.details]}))}var PE=class extends ut{constructor(){super(...arguments);this.code=de.String({required:!1,validator:vw(Pm(),[Bw(/^YN[0-9]{4}$/)])});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["explain"]]}static{this.usage=ot.Usage({description:"explain an error code",details:` - When the code argument is specified, this command prints its name and its details. - - When used without arguments, this command lists all error codes and their names. - `,examples:[["Explain an error code","$0 explain YN0006"],["List all error codes","$0 explain"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);if(typeof this.code<"u"){let o=_de(this.code),a=pe.pretty(r,o,pe.Type.CODE),n=this.cli.format().header(`${this.code} - ${a}`),A=(await M0t(r)).get(this.code),p=typeof A<"u"?pe.jsonOrPretty(this.json,r,pe.tuple(pe.Type.MARKDOWN,{text:A,format:this.cli.format(),paragraphs:!0})):`This error code does not have a description. - -You can help us by editing this page on GitHub \u{1F642}: -${pe.jsonOrPretty(this.json,r,pe.tuple(pe.Type.URL,"https://github.com/yarnpkg/berry/blob/master/packages/docusaurus/docs/advanced/01-general-reference/error-codes.mdx"))} -`;this.json?this.context.stdout.write(`${JSON.stringify({code:this.code,name:o,details:p})} -`):this.context.stdout.write(`${n} - -${p} -`)}else{let o={children:qe.mapAndFilter(Object.entries(vr),([a,n])=>Number.isNaN(Number(a))?qe.mapAndFilter.skip:{label:Ju(Number(a)),value:pe.tuple(pe.Type.CODE,n)})};As.emitTree(o,{configuration:r,stdout:this.context.stdout,json:this.json})}}};Ve();St();Gt();var Hde=et(Xo()),xE=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=de.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=de.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=de.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=de.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=de.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=de.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=de.Rest()}static{this.paths=[["info"]]}static{this.usage=ot.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a&&!this.all)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let u=new Set(this.extra);this.cache&&u.add("cache"),this.dependents&&u.add("dependents"),this.manifest&&u.add("manifest");let A=(le,{recursive:ce})=>{let ue=le.anchoredLocator.locatorHash,Ie=new Map,he=[ue];for(;he.length>0;){let De=he.shift();if(Ie.has(De))continue;let Ee=o.storedPackages.get(De);if(typeof Ee>"u")throw new Error("Assertion failed: Expected the package to be registered");if(Ie.set(De,Ee),G.isVirtualLocator(Ee)&&he.push(G.devirtualizeLocator(Ee).locatorHash),!(!ce&&De!==ue))for(let g of Ee.dependencies.values()){let me=o.storedResolutions.get(g.descriptorHash);if(typeof me>"u")throw new Error("Assertion failed: Expected the resolution to be registered");he.push(me)}}return Ie.values()},p=({recursive:le})=>{let ce=new Map;for(let ue of o.workspaces)for(let Ie of A(ue,{recursive:le}))ce.set(Ie.locatorHash,Ie);return ce.values()},h=({all:le,recursive:ce})=>le&&ce?o.storedPackages.values():le?p({recursive:ce}):A(a,{recursive:ce}),E=({all:le,recursive:ce})=>{let ue=h({all:le,recursive:ce}),Ie=this.patterns.map(Ee=>{let g=G.parseLocator(Ee),me=Hde.default.makeRe(G.stringifyIdent(g)),Ce=G.isVirtualLocator(g),fe=Ce?G.devirtualizeLocator(g):g;return ie=>{let Z=G.stringifyIdent(ie);if(!me.test(Z))return!1;if(g.reference==="unknown")return!0;let Se=G.isVirtualLocator(ie),Re=Se?G.devirtualizeLocator(ie):ie;return!(Ce&&Se&&g.reference!==ie.reference||fe.reference!==Re.reference)}}),he=qe.sortMap([...ue],Ee=>G.stringifyLocator(Ee));return{selection:he.filter(Ee=>Ie.length===0||Ie.some(g=>g(Ee))),sortedLookup:he}},{selection:w,sortedLookup:D}=E({all:this.all,recursive:this.recursive});if(w.length===0)throw new it("No package matched your request");let b=new Map;if(this.dependents)for(let le of D)for(let ce of le.dependencies.values()){let ue=o.storedResolutions.get(ce.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: Expected the resolution to be registered");qe.getArrayWithDefault(b,ue).push(le)}let C=new Map;for(let le of D){if(!G.isVirtualLocator(le))continue;let ce=G.devirtualizeLocator(le);qe.getArrayWithDefault(C,ce.locatorHash).push(le)}let T={},N={children:T},U=r.makeFetcher(),J={project:o,fetcher:U,cache:n,checksums:o.storedChecksums,report:new Ri,cacheOptions:{skipIntegrityCheck:!0}},te=[async(le,ce,ue)=>{if(!ce.has("manifest"))return;let Ie=await U.fetch(le,J),he;try{he=await _t.find(Ie.prefixPath,{baseFs:Ie.packageFs})}finally{Ie.releaseFs?.()}ue("Manifest",{License:pe.tuple(pe.Type.NO_HINT,he.license),Homepage:pe.tuple(pe.Type.URL,he.raw.homepage??null)})},async(le,ce,ue)=>{if(!ce.has("cache"))return;let Ie=o.storedChecksums.get(le.locatorHash)??null,he=n.getLocatorPath(le,Ie),De;if(he!==null)try{De=await ae.statPromise(he)}catch{}let Ee=typeof De<"u"?[De.size,pe.Type.SIZE]:void 0;ue("Cache",{Checksum:pe.tuple(pe.Type.NO_HINT,Ie),Path:pe.tuple(pe.Type.PATH,he),Size:Ee})}];for(let le of w){let ce=G.isVirtualLocator(le);if(!this.virtuals&&ce)continue;let ue={},Ie={value:[le,pe.Type.LOCATOR],children:ue};if(T[G.stringifyLocator(le)]=Ie,this.nameOnly){delete Ie.children;continue}let he=C.get(le.locatorHash);typeof he<"u"&&(ue.Instances={label:"Instances",value:pe.tuple(pe.Type.NUMBER,he.length)}),ue.Version={label:"Version",value:pe.tuple(pe.Type.NO_HINT,le.version)};let De=(g,me)=>{let Ce={};if(ue[g]=Ce,Array.isArray(me))Ce.children=me.map(fe=>({value:fe}));else{let fe={};Ce.children=fe;for(let[ie,Z]of Object.entries(me))typeof Z>"u"||(fe[ie]={label:ie,value:Z})}};if(!ce){for(let g of te)await g(le,u,De);await r.triggerHook(g=>g.fetchPackageInfo,le,u,De)}le.bin.size>0&&!ce&&De("Exported Binaries",[...le.bin.keys()].map(g=>pe.tuple(pe.Type.PATH,g)));let Ee=b.get(le.locatorHash);typeof Ee<"u"&&Ee.length>0&&De("Dependents",Ee.map(g=>pe.tuple(pe.Type.LOCATOR,g))),le.dependencies.size>0&&!ce&&De("Dependencies",[...le.dependencies.values()].map(g=>{let me=o.storedResolutions.get(g.descriptorHash),Ce=typeof me<"u"?o.storedPackages.get(me)??null:null;return pe.tuple(pe.Type.RESOLUTION,{descriptor:g,locator:Ce})})),le.peerDependencies.size>0&&ce&&De("Peer dependencies",[...le.peerDependencies.values()].map(g=>{let me=le.dependencies.get(g.identHash),Ce=typeof me<"u"?o.storedResolutions.get(me.descriptorHash)??null:null,fe=Ce!==null?o.storedPackages.get(Ce)??null:null;return pe.tuple(pe.Type.RESOLUTION,{descriptor:g,locator:fe})}))}As.emitTree(N,{configuration:r,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};Ve();St();Ol();var Vk=et(sg());Gt();var wH=et(ni());il();var U0t=[{selector:t=>t===-1,name:"nodeLinker",value:"node-modules"},{selector:t=>t!==-1&&t<8,name:"enableGlobalCache",value:!1},{selector:t=>t!==-1&&t<8,name:"compressionLevel",value:"mixed"}],bE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=de.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=de.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.refreshLockfile=de.Boolean("--refresh-lockfile",{description:"Refresh the package metadata stored in the lockfile"});this.checkCache=de.Boolean("--check-cache",{description:"Always refetch the packages and ensure that their checksums are consistent"});this.checkResolutions=de.Boolean("--check-resolutions",{description:"Validates that the package resolutions are coherent"});this.inlineBuilds=de.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.cacheFolder=de.String("--cache-folder",{hidden:!0});this.frozenLockfile=de.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=de.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=de.Boolean("--non-interactive",{hidden:!0});this.preferOffline=de.Boolean("--prefer-offline",{hidden:!0});this.production=de.Boolean("--production",{hidden:!0});this.registry=de.String("--registry",{hidden:!0});this.silent=de.Boolean("--silent",{hidden:!0});this.networkTimeout=de.String("--network-timeout",{hidden:!0})}static{this.paths=[["install"],ot.Default]}static{this.usage=ot.Usage({description:"install the project dependencies",details:"\n This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics:\n\n - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ).\n\n - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of `cacheFolder` in `yarn config` to see where the cache files are stored).\n\n - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the `.pnp.cjs` file you might know).\n\n - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail.\n\n Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your `.pnp.cjs` file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches.\n\n If the `--immutable` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the `immutablePatterns` configuration setting). For backward compatibility we offer an alias under the name of `--frozen-lockfile`, but it will be removed in a later release.\n\n If the `--immutable-cache` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed).\n\n If the `--refresh-lockfile` option is set, Yarn will keep the same resolution for the packages currently in the lockfile but will refresh their metadata. If used together with `--immutable`, it can validate that the lockfile information are consistent. This flag is enabled by default when Yarn detects it runs within a pull request context.\n\n If the `--check-cache` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them.\n\n If the `--inline-builds` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n ",examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds<"u"&&r.useWithSource("",{enableInlineBuilds:this.inlineBuilds},r.startingCwd,{overwrite:!0});let o=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,a=await Qy({configuration:r,stdout:this.context.stdout},[{option:this.ignoreEngines,message:"The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",error:!Vk.default.VERCEL},{option:this.registry,message:"The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file"},{option:this.preferOffline,message:"The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",error:!Vk.default.VERCEL},{option:this.production,message:"The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",error:!0},{option:this.nonInteractive,message:"The --non-interactive option is deprecated",error:!o},{option:this.frozenLockfile,message:"The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",callback:()=>this.immutable=this.frozenLockfile},{option:this.cacheFolder,message:"The cache-folder option has been deprecated; use rc settings instead",error:!Vk.default.NETLIFY}]);if(a!==null)return a;let n=this.mode==="update-lockfile";if(n&&(this.immutable||this.immutableCache))throw new it(`${pe.pretty(r,"--immutable",pe.Type.CODE)} and ${pe.pretty(r,"--immutable-cache",pe.Type.CODE)} cannot be used with ${pe.pretty(r,"--mode=update-lockfile",pe.Type.CODE)}`);let u=(this.immutable??r.get("enableImmutableInstalls"))&&!n,A=this.immutableCache&&!n;if(r.projectCwd!==null){let T=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U=!1;await q0t(r,u)&&(N.reportInfo(48,"Automatically removed core plugins that are now builtins \u{1F44D}"),U=!0),await H0t(r,u)&&(N.reportInfo(48,"Automatically fixed merge conflicts \u{1F44D}"),U=!0),U&&N.reportSeparator()});if(T.hasErrors())return T.exitCode()}if(r.projectCwd!==null){let T=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{if(ze.telemetry?.isNew)ze.telemetry.commitTips(),N.reportInfo(65,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),N.reportInfo(65,`Run ${pe.pretty(r,"yarn config set --home enableTelemetry 0",pe.Type.CODE)} to disable`),N.reportSeparator();else if(ze.telemetry?.shouldShowTips){let U=await on.get("https://repo.yarnpkg.com/tags",{configuration:r,jsonResponse:!0}).catch(()=>null);if(U!==null){let J=null;if(nn!==null){let le=wH.default.prerelease(nn)?"canary":"stable",ce=U.latest[le];wH.default.gt(ce,nn)&&(J=[le,ce])}if(J)ze.telemetry.commitTips(),N.reportInfo(88,`${pe.applyStyle(r,`A new ${J[0]} version of Yarn is available:`,pe.Style.BOLD)} ${G.prettyReference(r,J[1])}!`),N.reportInfo(88,`Upgrade now by running ${pe.pretty(r,`yarn set version ${J[1]}`,pe.Type.CODE)}`),N.reportSeparator();else{let te=ze.telemetry.selectTip(U.tips);te&&(N.reportInfo(89,pe.pretty(r,te.message,pe.Type.MARKDOWN_INLINE)),te.url&&N.reportInfo(89,`Learn more at ${te.url}`),N.reportSeparator())}}}});if(T.hasErrors())return T.exitCode()}let{project:p,workspace:h}=await Qt.find(r,this.context.cwd),E=p.lockfileLastVersion;if(E!==null){let T=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async N=>{let U={};for(let J of U0t)J.selector(E)&&typeof r.sources.get(J.name)>"u"&&(r.use("",{[J.name]:J.value},p.cwd,{overwrite:!0}),U[J.name]=J.value);Object.keys(U).length>0&&(await ze.updateConfiguration(p.cwd,U),N.reportInfo(87,"Migrated your project to the latest Yarn version \u{1F680}"),N.reportSeparator())});if(T.hasErrors())return T.exitCode()}let w=await Wr.find(r,{immutable:A,check:this.checkCache});if(!h)throw new or(p.cwd,this.context.cwd);await p.restoreInstallState({restoreResolutions:!1});let D=r.get("enableHardenedMode");D&&typeof r.sources.get("enableHardenedMode")>"u"&&await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,includeFooter:!1},async T=>{T.reportWarning(0,"Yarn detected that the current workflow is executed from a public pull request. For safety the hardened mode has been enabled."),T.reportWarning(0,`It will prevent malicious lockfile manipulations, in exchange for a slower install time. You can opt-out if necessary; check our ${pe.applyHyperlink(r,"documentation","https://yarnpkg.com/features/security#hardened-mode")} for more details.`),T.reportSeparator()}),(this.refreshLockfile??D)&&(p.lockfileNeedsRefresh=!0);let b=this.checkResolutions??D;return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout,forceSectionAlignment:!0,includeLogs:!0,includeVersion:!0},async T=>{await p.install({cache:w,report:T,immutable:u,checkResolutions:b,mode:this.mode})})).exitCode()}},_0t="<<<<<<<";async function H0t(t,e){if(!t.projectCwd)return!1;let r=V.join(t.projectCwd,mr.lockfile);if(!await ae.existsPromise(r)||!(await ae.readFilePromise(r,"utf8")).includes(_0t))return!1;if(e)throw new Jt(47,"Cannot autofix a lockfile when running an immutable install");let a=await Hr.execvp("git",["rev-parse","MERGE_HEAD","HEAD"],{cwd:t.projectCwd});if(a.code!==0&&(a=await Hr.execvp("git",["rev-parse","REBASE_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0&&(a=await Hr.execvp("git",["rev-parse","CHERRY_PICK_HEAD","HEAD"],{cwd:t.projectCwd})),a.code!==0)throw new Jt(83,"Git returned an error when trying to find the commits pertaining to the conflict");let n=await Promise.all(a.stdout.trim().split(/\n/).map(async A=>{let p=await Hr.execvp("git",["show",`${A}:./${mr.lockfile}`],{cwd:t.projectCwd});if(p.code!==0)throw new Jt(83,`Git returned an error when trying to access the lockfile content in ${A}`);try{return Vi(p.stdout)}catch{throw new Jt(46,"A variant of the conflicting lockfile failed to parse")}}));n=n.filter(A=>!!A.__metadata);for(let A of n){if(A.__metadata.version<7)for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=G.parseDescriptor(p,!0),E=t.normalizeDependency(h),w=G.stringifyDescriptor(E);w!==p&&(A[w]=A[p],delete A[p])}for(let p of Object.keys(A)){if(p==="__metadata")continue;let h=A[p].checksum;typeof h>"u"||h.includes("/")||(A[p].checksum=`${A.__metadata.cacheKey}/${h}`)}}let u=Object.assign({},...n);u.__metadata.version=`${Math.min(...n.map(A=>parseInt(A.__metadata.version??0)))}`,u.__metadata.cacheKey="merged";for(let[A,p]of Object.entries(u))typeof p=="string"&&delete u[A];return await ae.changeFilePromise(r,Sa(u),{automaticNewlines:!0}),!0}async function q0t(t,e){if(!t.projectCwd)return!1;let r=[],o=V.join(t.projectCwd,".yarn/plugins/@yarnpkg");return await ze.updateConfiguration(t.projectCwd,{plugins:n=>{if(!Array.isArray(n))return n;let u=n.filter(A=>{if(!A.path)return!0;let p=V.resolve(t.projectCwd,A.path),h=j1.has(A.spec)&&V.contains(o,p);return h&&r.push(p),!h});return u.length===0?ze.deleteProperty:u.length===n.length?n:u}},{immutable:e})?(await Promise.all(r.map(async n=>{await ae.removePromise(n)})),!0):!1}Ve();St();Gt();var kE=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target projects to the current one"});this.private=de.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target projects to the current one"});this.relative=de.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destinations=de.Rest()}static{this.paths=[["link"]]}static{this.usage=ot.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register one or more remote workspaces for use in the current project","$0 link ~/ts-loader ~/jest"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=o.topLevelWorkspace,A=[];for(let p of this.destinations){let h=V.resolve(this.context.cwd,Ae.toPortablePath(p)),E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:w,workspace:D}=await Qt.find(E,h);if(o.cwd===w.cwd)throw new it(`Invalid destination '${p}'; Can't link the project to itself`);if(!D)throw new or(w.cwd,h);if(this.all){let b=!1;for(let C of w.workspaces)C.manifest.name&&(!C.manifest.private||this.private)&&(A.push(C),b=!0);if(!b)throw new it(`No workspace found to be linked in the target project: ${p}`)}else{if(!D.manifest.name)throw new it(`The target workspace at '${p}' doesn't have a name and thus cannot be linked`);if(D.manifest.private&&!this.private)throw new it(`The target workspace at '${p}' is marked private - use the --private flag to link it anyway`);A.push(D)}}for(let p of A){let h=G.stringifyIdent(p.anchoredLocator),E=this.relative?V.relative(o.cwd,p.cwd):p.cwd;u.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${E}`})}return await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Gt();var QE=class extends ut{constructor(){super(...arguments);this.args=de.Proxy()}static{this.paths=[["node"]]}static{this.usage=ot.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]})}async execute(){return this.cli.run(["exec","node",...this.args])}};Ve();Gt();var FE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","check"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"find all third-party plugins that differ from their own spec",details:` - Check only the plugins from https. - - If this command detects any plugin differences in the CI environment, it will throw an error. - `,examples:[["find all third-party plugins that differ from their own spec","$0 plugin check"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=await ze.findRcFiles(this.context.cwd);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{for(let u of o)if(u.data?.plugins)for(let A of u.data.plugins){if(!A.checksum||!A.spec.match(/^https?:/))continue;let p=await on.get(A.spec,{configuration:r}),h=bn.makeHash(p);if(A.checksum===h)continue;let E=pe.pretty(r,A.path,pe.Type.PATH),w=pe.pretty(r,A.spec,pe.Type.URL),D=`${E} is different from the file provided by ${w}`;n.reportJson({...A,newChecksum:h}),n.reportError(0,D)}})).exitCode()}};Ve();Ve();St();Gt();var Yde=ve("os");Ve();St();Gt();var qde=ve("os");Ve();Ol();Gt();var j0t="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Jg(t,e){let r=await on.get(j0t,{configuration:t}),o=Vi(r.toString());return Object.fromEntries(Object.entries(o).filter(([a,n])=>!e||Ur.satisfiesWithPrereleases(e,n.range??"<4.0.0-rc.1")))}var RE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","list"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{let n=await Jg(r,nn);for(let[u,{experimental:A,...p}]of Object.entries(n)){let h=u;A&&(h+=" [experimental]"),a.reportJson({name:u,experimental:A,...p}),a.reportInfo(null,h)}})).exitCode()}};var G0t=/^[0-9]+$/,W0t=process.platform==="win32";function jde(t){return G0t.test(t)?`pull/${t}/head`:t}var Y0t=({repository:t,branch:e},r)=>[["git","init",Ae.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin","--depth=1",jde(e)],["git","reset","--hard","FETCH_HEAD"]],V0t=({branch:t})=>[["git","fetch","origin","--depth=1",jde(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx","-e","packages/yarnpkg-cli/bundles"]],K0t=({plugins:t,noMinify:e},r,o)=>[["yarn","build:cli",...new Array().concat(...t.map(a=>["--plugin",V.resolve(o,a)])),...e?["--no-minify"]:[],"|"],[W0t?"move":"mv","packages/yarnpkg-cli/bundles/yarn.js",Ae.fromPortablePath(r),"|"]],TE=class extends ut{constructor(){super(...arguments);this.installPath=de.String("--path",{description:"The path where the repository should be cloned to"});this.repository=de.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=de.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=de.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.dryRun=de.Boolean("-n,--dry-run",!1,{description:"If set, the bundle will be built but not added to the project"});this.noMinify=de.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=de.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=de.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}static{this.paths=[["set","version","from","sources"]]}static{this.usage=ot.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),a=typeof this.installPath<"u"?V.resolve(this.context.cwd,Ae.toPortablePath(this.installPath)):V.resolve(Ae.toPortablePath((0,qde.tmpdir)()),"yarnpkg-sources",bn.makeHash(this.repository).slice(0,6));return(await Lt.start({configuration:r,stdout:this.context.stdout},async u=>{await BH(this,{configuration:r,report:u,target:a}),u.reportSeparator(),u.reportInfo(0,"Building a fresh bundle"),u.reportSeparator();let A=await Hr.execvp("git",["rev-parse","--short","HEAD"],{cwd:a,strict:!0}),p=V.join(a,`packages/yarnpkg-cli/bundles/yarn-${A.stdout.trim()}.js`);ae.existsSync(p)||(await M2(K0t(this,p,a),{configuration:r,context:this.context,target:a}),u.reportSeparator());let h=await ae.readFilePromise(p);if(!this.dryRun){let{bundleVersion:E}=await IH(r,null,async()=>h,{report:u});this.skipPlugins||await J0t(this,E,{project:o,report:u,target:a})}})).exitCode()}};async function M2(t,{configuration:e,context:r,target:o}){for(let[a,...n]of t){let u=n[n.length-1]==="|";if(u&&n.pop(),u)await Hr.pipevp(a,n,{cwd:o,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${pe.pretty(e,` $ ${[a,...n].join(" ")}`,"grey")} -`);try{await Hr.execvp(a,n,{cwd:o,strict:!0})}catch(A){throw r.stdout.write(A.stdout||A.stack),A}}}}async function BH(t,{configuration:e,report:r,target:o}){let a=!1;if(!t.force&&ae.existsSync(V.join(o,".git"))){r.reportInfo(0,"Fetching the latest commits"),r.reportSeparator();try{await M2(V0t(t),{configuration:e,context:t.context,target:o}),a=!0}catch{r.reportSeparator(),r.reportWarning(0,"Repository update failed; we'll try to regenerate it")}}a||(r.reportInfo(0,"Cloning the remote repository"),r.reportSeparator(),await ae.removePromise(o),await ae.mkdirPromise(o,{recursive:!0}),await M2(Y0t(t,o),{configuration:e,context:t.context,target:o}))}async function J0t(t,e,{project:r,report:o,target:a}){let n=await Jg(r.configuration,e),u=new Set(Object.keys(n));for(let A of r.configuration.plugins.keys())u.has(A)&&await vH(A,t,{project:r,report:o,target:a})}Ve();Ve();St();Gt();var Gde=et(ni()),Wde=ve("vm");var LE=class extends ut{constructor(){super(...arguments);this.name=de.String();this.checksum=de.Boolean("--checksum",!0,{description:"Whether to care if this plugin is modified"})}static{this.paths=[["plugin","import"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - If the \`--no-checksum\` option is set, Yarn will no longer care if the plugin is modified. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,stdout:this.context.stdout},async a=>{let{project:n}=await Qt.find(r,this.context.cwd),u,A;if(this.name.match(/^\.{0,2}[\\/]/)||Ae.isAbsolute(this.name)){let p=V.resolve(this.context.cwd,Ae.toPortablePath(this.name));a.reportInfo(0,`Reading ${pe.pretty(r,p,pe.Type.PATH)}`),u=V.relative(n.cwd,p),A=await ae.readFilePromise(p)}else{let p;if(this.name.match(/^https?:/)){try{new URL(this.name)}catch{throw new Jt(52,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}u=this.name,p=this.name}else{let h=G.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(h.reference!=="unknown"&&!Gde.default.valid(h.reference))throw new Jt(0,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let E=G.stringifyIdent(h),w=await Jg(r,nn);if(!Object.hasOwn(w,E)){let D=`Couldn't find a plugin named ${G.prettyIdent(r,h)} on the remote registry. -`;throw r.plugins.has(E)?D+=`A plugin named ${G.prettyIdent(r,h)} is already installed; possibly attempting to import a built-in plugin.`:D+=`Note that only the plugins referenced on our website (${pe.pretty(r,"https://github.com/yarnpkg/berry/blob/master/plugins.yml",pe.Type.URL)}) can be referenced by their name; any other plugin will have to be referenced through its public url (for example ${pe.pretty(r,"https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js",pe.Type.URL)}).`,new Jt(51,D)}u=E,p=w[E].url,h.reference!=="unknown"?p=p.replace(/\/master\//,`/${E}/${h.reference}/`):nn!==null&&(p=p.replace(/\/master\//,`/@yarnpkg/cli/${nn}/`))}a.reportInfo(0,`Downloading ${pe.pretty(r,p,"green")}`),A=await on.get(p,{configuration:r})}await DH(u,A,{checksum:this.checksum,project:n,report:a})})).exitCode()}};async function DH(t,e,{checksum:r=!0,project:o,report:a}){let{configuration:n}=o,u={},A={exports:u};(0,Wde.runInNewContext)(e.toString(),{module:A,exports:u});let h=`.yarn/plugins/${A.exports.name}.cjs`,E=V.resolve(o.cwd,h);a.reportInfo(0,`Saving the new plugin in ${pe.pretty(n,h,"magenta")}`),await ae.mkdirPromise(V.dirname(E),{recursive:!0}),await ae.writeFilePromise(E,e);let w={path:h,spec:t};r&&(w.checksum=bn.makeHash(e)),await ze.addPlugin(o.cwd,[w])}var z0t=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],NE=class extends ut{constructor(){super(...arguments);this.installPath=de.String("--path",{description:"The path where the repository should be cloned to"});this.repository=de.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=de.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=de.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=de.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=de.String()}static{this.paths=[["plugin","import","from","sources"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=typeof this.installPath<"u"?V.resolve(this.context.cwd,Ae.toPortablePath(this.installPath)):V.resolve(Ae.toPortablePath((0,Yde.tmpdir)()),"yarnpkg-sources",bn.makeHash(this.repository).slice(0,6));return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let{project:u}=await Qt.find(r,this.context.cwd),A=G.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),p=G.stringifyIdent(A),h=await Jg(r,nn);if(!Object.hasOwn(h,p))throw new Jt(51,`Couldn't find a plugin named "${p}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let E=p;await BH(this,{configuration:r,report:n,target:o}),await vH(E,this,{project:u,report:n,target:o})})).exitCode()}};async function vH(t,{context:e,noMinify:r},{project:o,report:a,target:n}){let u=t.replace(/@yarnpkg\//,""),{configuration:A}=o;a.reportSeparator(),a.reportInfo(0,`Building a fresh ${u}`),a.reportSeparator(),await M2(z0t({pluginName:u,noMinify:r},n),{configuration:A,context:e,target:n}),a.reportSeparator();let p=V.resolve(n,`packages/${u}/bundles/${t}.js`),h=await ae.readFilePromise(p);await DH(t,h,{project:o,report:a})}Ve();St();Gt();var OE=class extends ut{constructor(){super(...arguments);this.name=de.String()}static{this.paths=[["plugin","remove"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let u=this.name,A=G.parseIdent(u);if(!r.plugins.has(u))throw new it(`${G.prettyIdent(r,A)} isn't referenced by the current configuration`);let p=`.yarn/plugins/${u}.cjs`,h=V.resolve(o.cwd,p);ae.existsSync(h)&&(n.reportInfo(0,`Removing ${pe.pretty(r,p,pe.Type.PATH)}...`),await ae.removePromise(h)),n.reportInfo(0,"Updating the configuration..."),await ze.updateConfiguration(o.cwd,{plugins:E=>{if(!Array.isArray(E))return E;let w=E.filter(D=>D.path!==p);return w.length===0?ze.deleteProperty:w.length===E.length?E:w}})})).exitCode()}};Ve();Gt();var ME=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["plugin","runtime"]]}static{this.usage=ot.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async a=>{for(let n of r.plugins.keys()){let u=this.context.plugins.plugins.has(n),A=n;u&&(A+=" [builtin]"),a.reportJson({name:n,builtin:u}),a.reportInfo(null,`${A}`)}})).exitCode()}};Ve();Ve();Gt();var UE=class extends ut{constructor(){super(...arguments);this.idents=de.Rest()}static{this.paths=[["rebuild"]]}static{this.usage=ot.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);let u=new Set;for(let A of this.idents)u.add(G.parseIdent(A).identHash);if(await o.restoreInstallState({restoreResolutions:!1}),await o.resolveEverything({cache:n,report:new Ri}),u.size>0)for(let A of o.storedPackages.values())u.has(A.identHash)&&(o.storedBuildState.delete(A.locatorHash),o.skippedBuilds.delete(A.locatorHash));else o.storedBuildState.clear(),o.skippedBuilds.clear();return await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ve();Ve();Ve();Gt();var SH=et(Xo());il();var _E=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.patterns=de.Rest()}static{this.paths=[["remove"]]}static{this.usage=ot.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.all?o.workspaces:[a],A=["dependencies","devDependencies","peerDependencies"],p=[],h=!1,E=[];for(let C of this.patterns){let T=!1,N=G.parseIdent(C);for(let U of u){let J=[...U.manifest.peerDependenciesMeta.keys()];for(let te of(0,SH.default)(J,C))U.manifest.peerDependenciesMeta.delete(te),h=!0,T=!0;for(let te of A){let le=U.manifest.getForScope(te),ce=[...le.values()].map(ue=>G.stringifyIdent(ue));for(let ue of(0,SH.default)(ce,G.stringifyIdent(N))){let{identHash:Ie}=G.parseIdent(ue),he=le.get(Ie);if(typeof he>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");U.manifest[te].delete(Ie),E.push([U,te,he]),h=!0,T=!0}}}T||p.push(C)}let w=p.length>1?"Patterns":"Pattern",D=p.length>1?"don't":"doesn't",b=this.all?"any":"this";if(p.length>0)throw new it(`${w} ${pe.prettyList(r,p,pe.Type.CODE)} ${D} match any packages referenced by ${b} workspace`);return h?(await r.triggerMultipleHooks(C=>C.afterWorkspaceDependencyRemoval,E),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})):0}};Ve();Ve();Gt();var Vde=ve("util"),HE=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["run"]]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);return(await Lt.start({configuration:r,stdout:this.context.stdout,json:this.json},async u=>{let A=a.manifest.scripts,p=qe.sortMap(A.keys(),w=>w),h={breakLength:1/0,colors:r.get("enableColors"),maxArrayLength:2},E=p.reduce((w,D)=>Math.max(w,D.length),0);for(let[w,D]of A.entries())u.reportInfo(null,`${w.padEnd(E," ")} ${(0,Vde.inspect)(D,h)}`),u.reportJson({name:w,script:D})})).exitCode()}};Ve();Ve();Gt();var qE=class extends ut{constructor(){super(...arguments);this.inspect=de.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=de.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=de.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=de.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.require=de.String("--require",{description:"Forwarded to the underlying Node process when executing a binary"});this.silent=de.Boolean("--silent",{hidden:!0});this.scriptName=de.String();this.args=de.Proxy()}static{this.paths=[["run"]]}static{this.usage=ot.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a,locator:n}=await Qt.find(r,this.context.cwd);await o.restoreInstallState();let u=this.topLevel?o.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await hn.hasPackageScript(u,this.scriptName,{project:o}))return await hn.executePackageScript(u,this.scriptName,this.args,{project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let A=await hn.getPackageAccessibleBinaries(u,{project:o});if(A.get(this.scriptName)){let h=[];return this.inspect&&(typeof this.inspect=="string"?h.push(`--inspect=${this.inspect}`):h.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?h.push(`--inspect-brk=${this.inspectBrk}`):h.push("--inspect-brk")),this.require&&h.push(`--require=${this.require}`),await hn.executePackageAccessibleBinary(u,this.scriptName,this.args,{cwd:this.context.cwd,project:o,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:h,packageAccessibleBinaries:A})}if(!this.topLevel&&!this.binariesOnly&&a&&this.scriptName.includes(":")){let E=(await Promise.all(o.workspaces.map(async w=>w.manifest.scripts.has(this.scriptName)?w:null))).filter(w=>w!==null);if(E.length===1)return await hn.executeWorkspaceScript(E[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${G.prettyLocator(r,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new it(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${G.prettyLocator(r,n)}).`);{if(this.scriptName==="global")throw new it("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let h=[this.scriptName].concat(this.args);for(let[E,w]of oE)for(let D of w)if(h.length>=D.length&&JSON.stringify(h.slice(0,D.length))===JSON.stringify(D))throw new it(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${E} plugin. You can install it with "yarn plugin import ${E}".`);throw new it(`Couldn't find a script named "${this.scriptName}".`)}}};Ve();Ve();Gt();var jE=class extends ut{constructor(){super(...arguments);this.descriptor=de.String();this.resolution=de.String()}static{this.paths=[["set","resolution"]]}static{this.usage=ot.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, edit the `resolutions` field in your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(await o.restoreInstallState({restoreResolutions:!1}),!a)throw new or(o.cwd,this.context.cwd);let u=G.parseDescriptor(this.descriptor,!0),A=G.makeDescriptor(u,this.resolution);return o.storedDescriptors.set(u.descriptorHash,u),o.storedDescriptors.set(A.descriptorHash,A),o.resolutionAliases.set(u.descriptorHash,A.descriptorHash),await o.installWithNewReport({stdout:this.context.stdout},{cache:n})}};Ve();St();Gt();var Kde=et(Xo()),GE=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=de.Rest()}static{this.paths=[["unlink"]]}static{this.usage=ot.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);let u=o.topLevelWorkspace,A=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:p,reference:h}of u.manifest.resolutions)h.startsWith("portal:")&&A.add(p.descriptor.fullName);if(this.leadingArguments.length>0)for(let p of this.leadingArguments){let h=V.resolve(this.context.cwd,Ae.toPortablePath(p));if(qe.isPathLike(p)){let E=await ze.find(h,this.context.plugins,{useRc:!1,strict:!1}),{project:w,workspace:D}=await Qt.find(E,h);if(!D)throw new or(w.cwd,h);if(this.all){for(let b of w.workspaces)b.manifest.name&&A.add(G.stringifyIdent(b.anchoredLocator));if(A.size===0)throw new it("No workspace found to be unlinked in the target project")}else{if(!D.manifest.name)throw new it("The target workspace doesn't have a name and thus cannot be unlinked");A.add(G.stringifyIdent(D.anchoredLocator))}}else{let E=[...u.manifest.resolutions.map(({pattern:w})=>w.descriptor.fullName)];for(let w of(0,Kde.default)(E,p))A.add(w)}}return u.manifest.resolutions=u.manifest.resolutions.filter(({pattern:p})=>!A.has(p.descriptor.fullName)),await o.installWithNewReport({stdout:this.context.stdout,quiet:this.context.quiet},{cache:n})}};Ve();Ve();Ve();Gt();var Jde=et(Q2()),PH=et(Xo());il();var WE=class extends ut{constructor(){super(...arguments);this.interactive=de.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.fixed=de.Boolean("-F,--fixed",!1,{description:"Store dependency tags as-is instead of resolving them"});this.exact=de.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=de.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=de.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=de.String("--mode",{description:"Change what artifacts installs generate",validator:js(yl)});this.patterns=de.Rest()}static{this.paths=[["up"]]}static{this.usage=ot.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the latter will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]})}static{this.schema=[Sw("recursive",Vu.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})]}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=[...o.storedDescriptors.values()],A=u.map(E=>G.stringifyIdent(E)),p=new Set;for(let E of this.patterns){if(G.parseDescriptor(E).range!=="unknown")throw new it("Ranges aren't allowed when using --recursive");for(let w of(0,PH.default)(A,E)){let D=G.parseIdent(w);p.add(D.identHash)}}let h=u.filter(E=>p.has(E.identHash));for(let E of h)o.storedDescriptors.delete(E.descriptorHash),o.storedResolutions.delete(E.descriptorHash);return await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}async executeUpClassic(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=this.fixed,A=r.isInteractive({interactive:this.interactive,stdout:this.context.stdout}),p=R2(this,o),h=A?["keep","reuse","project","latest"]:["project","latest"],E=[],w=[];for(let N of this.patterns){let U=!1,J=G.parseDescriptor(N),te=G.stringifyIdent(J);for(let le of o.workspaces)for(let ce of["dependencies","devDependencies"]){let Ie=[...le.manifest.getForScope(ce).values()].map(De=>G.stringifyIdent(De)),he=te==="*"?Ie:(0,PH.default)(Ie,te);for(let De of he){let Ee=G.parseIdent(De),g=le.manifest[ce].get(Ee.identHash);if(typeof g>"u")throw new Error("Assertion failed: Expected the descriptor to be registered");let me=G.makeDescriptor(Ee,J.range);E.push(Promise.resolve().then(async()=>[le,ce,g,await T2(me,{project:o,workspace:le,cache:n,target:ce,fixed:u,modifier:p,strategies:h})])),U=!0}}U||w.push(N)}if(w.length>1)throw new it(`Patterns ${pe.prettyList(r,w,pe.Type.CODE)} don't match any packages referenced by any workspace`);if(w.length>0)throw new it(`Pattern ${pe.prettyList(r,w,pe.Type.CODE)} doesn't match any packages referenced by any workspace`);let D=await Promise.all(E),b=await pA.start({configuration:r,stdout:this.context.stdout,suggestInstall:!1},async N=>{for(let[,,U,{suggestions:J,rejections:te}]of D){let le=J.filter(ce=>ce.descriptor!==null);if(le.length===0){let[ce]=te;if(typeof ce>"u")throw new Error("Assertion failed: Expected an error to have been set");let ue=this.cli.error(ce);o.configuration.get("enableNetwork")?N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range - -${ue}`):N.reportError(27,`${G.prettyDescriptor(r,U)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${ue}`)}else le.length>1&&!A&&N.reportError(27,`${G.prettyDescriptor(r,U)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(b.hasErrors())return b.exitCode();let C=!1,T=[];for(let[N,U,,{suggestions:J}]of D){let te,le=J.filter(he=>he.descriptor!==null),ce=le[0].descriptor,ue=le.every(he=>G.areDescriptorsEqual(he.descriptor,ce));le.length===1||ue?te=ce:(C=!0,{answer:te}=await(0,Jde.prompt)({type:"select",name:"answer",message:`Which range do you want to use in ${G.prettyWorkspace(r,N)} \u276F ${U}?`,choices:J.map(({descriptor:he,name:De,reason:Ee})=>he?{name:De,hint:Ee,descriptor:he}:{name:De,hint:Ee,disabled:!0}),onCancel:()=>process.exit(130),result(he){return this.find(he,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let Ie=N.manifest[U].get(te.identHash);if(typeof Ie>"u")throw new Error("Assertion failed: This descriptor should have a matching entry");if(Ie.descriptorHash!==te.descriptorHash)N.manifest[U].set(te.identHash,te),T.push([N,U,Ie,te]);else{let he=r.makeResolver(),De={project:o,resolver:he},Ee=r.normalizeDependency(Ie),g=he.bindDescriptor(Ee,N.anchoredLocator,De);o.forgetResolution(g)}}return await r.triggerMultipleHooks(N=>N.afterWorkspaceDependencyReplacement,T),C&&this.context.stdout.write(` -`),await o.installWithNewReport({stdout:this.context.stdout},{cache:n,mode:this.mode})}};Ve();Ve();Ve();Gt();var YE=class extends ut{constructor(){super(...arguments);this.recursive=de.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=de.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=de.String()}static{this.paths=[["why"]]}static{this.usage=ot.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=G.parseIdent(this.package).identHash,u=this.recursive?Z0t(o,n,{configuration:r,peers:this.peers}):X0t(o,n,{configuration:r,peers:this.peers});As.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1})}};function X0t(t,e,{configuration:r,peers:o}){let a=qe.sortMap(t.storedPackages.values(),A=>G.stringifyLocator(A)),n={},u={children:n};for(let A of a){let p={};for(let E of A.dependencies.values()){if(!o&&A.peerDependencies.has(E.identHash))continue;let w=t.storedResolutions.get(E.descriptorHash);if(!w)throw new Error("Assertion failed: The resolution should have been registered");let D=t.storedPackages.get(w);if(!D)throw new Error("Assertion failed: The package should have been registered");if(D.identHash!==e)continue;{let C=G.stringifyLocator(A);n[C]={value:[A,pe.Type.LOCATOR],children:p}}let b=G.stringifyLocator(D);p[b]={value:[{descriptor:E,locator:D},pe.Type.DEPENDENT]}}}return u}function Z0t(t,e,{configuration:r,peers:o}){let a=qe.sortMap(t.workspaces,D=>G.stringifyLocator(D.anchoredLocator)),n=new Set,u=new Set,A=D=>{if(n.has(D.locatorHash))return u.has(D.locatorHash);if(n.add(D.locatorHash),D.identHash===e)return u.add(D.locatorHash),!0;let b=!1;D.identHash===e&&(b=!0);for(let C of D.dependencies.values()){if(!o&&D.peerDependencies.has(C.identHash))continue;let T=t.storedResolutions.get(C.descriptorHash);if(!T)throw new Error("Assertion failed: The resolution should have been registered");let N=t.storedPackages.get(T);if(!N)throw new Error("Assertion failed: The package should have been registered");A(N)&&(b=!0)}return b&&u.add(D.locatorHash),b};for(let D of a)A(D.anchoredPackage);let p=new Set,h={},E={children:h},w=(D,b,C)=>{if(!u.has(D.locatorHash))return;let T=C!==null?pe.tuple(pe.Type.DEPENDENT,{locator:D,descriptor:C}):pe.tuple(pe.Type.LOCATOR,D),N={},U={value:T,children:N},J=G.stringifyLocator(D);if(b[J]=U,!(C!==null&&t.tryWorkspaceByLocator(D))&&!p.has(D.locatorHash)){p.add(D.locatorHash);for(let te of D.dependencies.values()){if(!o&&D.peerDependencies.has(te.identHash))continue;let le=t.storedResolutions.get(te.descriptorHash);if(!le)throw new Error("Assertion failed: The resolution should have been registered");let ce=t.storedPackages.get(le);if(!ce)throw new Error("Assertion failed: The package should have been registered");w(ce,N,te)}}};for(let D of a)w(D.anchoredPackage,h,null);return E}Ve();var OH={};Vt(OH,{GitFetcher:()=>_2,GitResolver:()=>H2,default:()=>Egt,gitUtils:()=>ra});Ve();St();var ra={};Vt(ra,{TreeishProtocols:()=>U2,clone:()=>NH,fetchBase:()=>mme,fetchChangedFiles:()=>yme,fetchChangedWorkspaces:()=>mgt,fetchRoot:()=>dme,isGitUrl:()=>JE,lsRemote:()=>gme,normalizeLocator:()=>dgt,normalizeRepoUrl:()=>VE,resolveUrl:()=>LH,splitRepoUrl:()=>Rh,validateRepoUrl:()=>TH});Ve();St();Gt();var fme=et(cme()),pme=et(t3()),KE=et(ve("querystring")),FH=et(ni());function QH(t,e,r){let o=t.indexOf(r);return t.lastIndexOf(e,o>-1?o:1/0)}function ume(t){try{return new URL(t)}catch{return}}function hgt(t){let e=QH(t,"@","#"),r=QH(t,":","#");return r>e&&(t=`${t.slice(0,r)}/${t.slice(r+1)}`),QH(t,":","#")===-1&&t.indexOf("//")===-1&&(t=`ssh://${t}`),t}function Ame(t){return ume(t)||ume(hgt(t))}function VE(t,{git:e=!1}={}){if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/|git:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){let r=Ame(t);r&&(t=r.href),t=t.replace(/^git\+([^:]+):/,"$1:")}return t}function hme(){return{...process.env,GIT_SSH_COMMAND:process.env.GIT_SSH_COMMAND||`${process.env.GIT_SSH||"ssh"} -o BatchMode=yes`}}var ggt=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],U2=(a=>(a.Commit="commit",a.Head="head",a.Tag="tag",a.Semver="semver",a))(U2||{});function JE(t){return t?ggt.some(e=>!!t.match(e)):!1}function Rh(t){t=VE(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:"head",request:"HEAD"},extra:{}};let r=t.slice(0,e),o=t.slice(e+1);if(o.match(/^[a-z]+=/)){let a=KE.default.parse(o);for(let[p,h]of Object.entries(a))if(typeof h!="string")throw new Error(`Assertion failed: The ${p} parameter must be a literal string`);let n=Object.values(U2).find(p=>Object.hasOwn(a,p)),[u,A]=typeof n<"u"?[n,a[n]]:["head","HEAD"];for(let p of Object.values(U2))delete a[p];return{repo:r,treeish:{protocol:u,request:A},extra:a}}else{let a=o.indexOf(":"),[n,u]=a===-1?[null,o]:[o.slice(0,a),o.slice(a+1)];return{repo:r,treeish:{protocol:n,request:u},extra:{}}}}function dgt(t){return G.makeLocator(t,VE(t.reference))}function TH(t,{configuration:e}){let r=VE(t,{git:!0});if(!on.getNetworkSettings(`https://${(0,fme.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Jt(80,`Request to '${r}' has been blocked because of your configuration settings`);return r}async function gme(t,e){let r=TH(t,{configuration:e}),o=await RH("listing refs",["ls-remote",r],{cwd:e.startingCwd,env:hme()},{configuration:e,normalizedRepoUrl:r}),a=new Map,n=/^([a-f0-9]{40})\t([^\n]+)/gm,u;for(;(u=n.exec(o.stdout))!==null;)a.set(u[2],u[1]);return a}async function LH(t,e){let{repo:r,treeish:{protocol:o,request:a},extra:n}=Rh(t),u=await gme(r,e),A=(h,E)=>{switch(h){case"commit":{if(!E.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return KE.default.stringify({...n,commit:E})}case"head":{let w=u.get(E==="HEAD"?E:`refs/heads/${E}`);if(typeof w>"u")throw new Error(`Unknown head ("${E}")`);return KE.default.stringify({...n,commit:w})}case"tag":{let w=u.get(`refs/tags/${E}`);if(typeof w>"u")throw new Error(`Unknown tag ("${E}")`);return KE.default.stringify({...n,commit:w})}case"semver":{let w=Ur.validRange(E);if(!w)throw new Error(`Invalid range ("${E}")`);let D=new Map([...u.entries()].filter(([C])=>C.startsWith("refs/tags/")).map(([C,T])=>[FH.default.parse(C.slice(10)),T]).filter(C=>C[0]!==null)),b=FH.default.maxSatisfying([...D.keys()],w);if(b===null)throw new Error(`No matching range ("${E}")`);return KE.default.stringify({...n,commit:D.get(b)})}case null:{let w;if((w=p("commit",E))!==null||(w=p("tag",E))!==null||(w=p("head",E))!==null)return w;throw E.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${E}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${h}")`)}},p=(h,E)=>{try{return A(h,E)}catch{return null}};return VE(`${r}#${A(o,a)}`)}async function NH(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:o,request:a}}=Rh(t);if(o!=="commit")throw new Error("Invalid treeish protocol when cloning");let n=TH(r,{configuration:e}),u=await ae.mktempPromise(),A={cwd:u,env:hme()};return await RH("cloning the repository",["clone","-c core.autocrlf=false",n,Ae.fromPortablePath(u)],A,{configuration:e,normalizedRepoUrl:n}),await RH("switching branch",["checkout",`${a}`],A,{configuration:e,normalizedRepoUrl:n}),u})}async function dme(t){let e,r=t;do{if(e=r,await ae.existsPromise(V.join(e,".git")))return e;r=V.dirname(e)}while(r!==e);return null}async function mme(t,{baseRefs:e}){if(e.length===0)throw new it("Can't run this command with zero base refs specified.");let r=[];for(let A of e){let{code:p}=await Hr.execvp("git",["merge-base",A,"HEAD"],{cwd:t});p===0&&r.push(A)}if(r.length===0)throw new it(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:o}=await Hr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),a=o.trim(),{stdout:n}=await Hr.execvp("git",["show","--quiet","--pretty=format:%s",a],{cwd:t,strict:!0}),u=n.trim();return{hash:a,title:u}}async function yme(t,{base:e,project:r}){let o=qe.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:a}=await Hr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),n=a.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>V.resolve(t,Ae.toPortablePath(h))),{stdout:u}=await Hr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),A=u.split(/\r\n|\r|\n/).filter(h=>h.length>0).map(h=>V.resolve(t,Ae.toPortablePath(h))),p=[...new Set([...n,...A].sort())];return o?p.filter(h=>!V.relative(r.cwd,h).match(o)):p}async function mgt({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let r=[V.resolve(e.cwd,mr.lockfile),V.resolve(e.cwd,e.configuration.get("cacheFolder")),V.resolve(e.cwd,e.configuration.get("installStatePath")),V.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(u=>u.populateYarnPaths,e,u=>{u!=null&&r.push(u)});let o=await dme(e.configuration.projectCwd);if(o==null)throw new it("This command can only be run on Git repositories");let a=await mme(o,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),n=await yme(o,{base:a.hash,project:e});return new Set(qe.mapAndFilter(n,u=>{let A=e.tryWorkspaceByFilePath(u);return A===null?qe.mapAndFilter.skip:r.some(p=>u.startsWith(p))?qe.mapAndFilter.skip:A}))}async function RH(t,e,r,{configuration:o,normalizedRepoUrl:a}){try{return await Hr.execvp("git",e,{...r,strict:!0})}catch(n){if(!(n instanceof Hr.ExecError))throw n;let u=n.reportExtra,A=n.stderr.toString();throw new Jt(1,`Failed ${t}`,p=>{p.reportError(1,` ${pe.prettyField(o,{label:"Repository URL",value:pe.tuple(pe.Type.URL,a)})}`);for(let h of A.matchAll(/^(.+?): (.*)$/gm)){let[,E,w]=h;E=E.toLowerCase();let D=E==="error"?"Error":`${(0,pme.default)(E)} Error`;p.reportError(1,` ${pe.prettyField(o,{label:D,value:pe.tuple(pe.Type.NO_HINT,w)})}`)}u?.(p)})}}var _2=class{supports(e,r){return JE(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,a=new Map(r.checksums);a.set(e.locatorHash,o);let n={...r,checksums:a},u=await this.downloadHosted(e,n);if(u!==null)return u;let[A,p,h]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(e,n),...r.cacheOptions});return{packageFs:A,releaseFs:p,prefixPath:G.getIdentVendorPath(e),checksum:h}}async downloadHosted(e,r){return r.project.configuration.reduceHook(o=>o.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let o=Rh(e.reference),a=await NH(e.reference,r.project.configuration),n=V.resolve(a,o.extra.cwd??Bt.dot),u=V.join(n,"package.tgz");await hn.prepareExternalProject(n,u,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let A=await ae.readFilePromise(u);return await qe.releaseAfterUseAsync(async()=>await $i.convertToZip(A,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1}))}};Ve();Ve();var H2=class{supportsDescriptor(e,r){return JE(e.range)}supportsLocator(e,r){return JE(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=await LH(e.range,o.project.configuration);return[G.makeLocator(e,a)]}async getSatisfying(e,r,o,a){let n=Rh(e.range);return{locators:o.filter(A=>{if(A.identHash!==e.identHash)return!1;let p=Rh(A.reference);return!(n.repo!==p.repo||n.treeish.protocol==="commit"&&n.treeish.request!==p.treeish.request)}),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var ygt={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:"STRING",isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:"STRING",default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:"NUMBER",default:2}},fetchers:[_2],resolvers:[H2]};var Egt=ygt;Gt();var zE=class extends ut{constructor(){super(...arguments);this.since=de.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.noPrivate=de.Boolean("--no-private",{description:"Exclude workspaces that have the private field set to true"});this.verbose=de.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["workspaces","list"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `--no-private` is set, Yarn will not list any workspaces that have the `private` field set to `true`.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);return(await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async n=>{let u=this.since?await ra.fetchChangedWorkspaces({ref:this.since,project:o}):o.workspaces,A=new Set(u);if(this.recursive)for(let p of[...u].map(h=>h.getRecursiveWorkspaceDependents()))for(let h of p)A.add(h);for(let p of A){let{manifest:h}=p;if(h.private&&this.noPrivate)continue;let E;if(this.verbose){let w=new Set,D=new Set;for(let b of _t.hardDependencies)for(let[C,T]of h.getForScope(b)){let N=o.tryWorkspaceByDescriptor(T);N===null?o.workspacesByIdent.has(C)&&D.add(T):w.add(N)}E={workspaceDependencies:Array.from(w).map(b=>b.relativeCwd),mismatchedWorkspaceDependencies:Array.from(D).map(b=>G.stringifyDescriptor(b))}}n.reportInfo(null,`${p.relativeCwd}`),n.reportJson({location:p.relativeCwd,name:h.name?G.stringifyIdent(h.name):null,...E})}})).exitCode()}};Ve();Ve();Gt();var XE=class extends ut{constructor(){super(...arguments);this.workspaceName=de.String();this.commandName=de.String();this.args=de.Proxy()}static{this.paths=[["workspace"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=o.workspaces,u=new Map(n.map(p=>[G.stringifyIdent(p.anchoredLocator),p])),A=u.get(this.workspaceName);if(A===void 0){let p=Array.from(u.keys()).sort();throw new it(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${p.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:A.cwd})}};var Cgt={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:"BOOLEAN",default:Eme.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:"STRING",values:["^","~",""],default:"^"},preferReuse:{description:"If true, `yarn add` will attempt to reuse the most common dependency range in other workspaces.",type:"BOOLEAN",default:!1}},commands:[hE,gE,dE,mE,jE,TE,SE,zE,CE,IE,wE,BE,fE,pE,yE,EE,vE,DE,PE,xE,bE,kE,GE,QE,FE,NE,LE,OE,RE,ME,UE,_E,HE,qE,WE,YE,XE]},Igt=Cgt;var jH={};Vt(jH,{default:()=>Bgt});Ve();var kt={optional:!0},UH=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:kt,zenObservable:kt}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{"supports-color":kt}}],["got@<11",{dependencies:{"@types/responselike":"^1.0.0","@types/keyv":"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{"@types/keyv":"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{"vscode-jsonrpc":"^5.0.1","vscode-languageserver-protocol":"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{"postcss-html":kt,"postcss-jsx":kt,"postcss-less":kt,"postcss-markdown":kt,"postcss-scss":kt}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{"tiny-warning":"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:kt}}],["snowpack@>=3.3.0",{dependencies:{"node-gyp":"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:kt}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@<=0.5.2",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:kt,"vue-template-compiler":kt}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:kt,"utf-8-validate":kt}}],["react-portal@<4.2.2",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{"babel-polyfill":"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{"cross-spawn":"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@<=4.6.0-next.3",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@<=5.6.0-next.0",{dependencies:{"prop-types":"^15.7.2"}}],["@rebass/forms@*",{dependencies:{"@styled-system/should-forward-prop":"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt,"vuetify-loader":kt}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["vue-cli-plugin-vuetify@>=2.4.3",{peerDependencies:{vue:"*"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":kt}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":kt}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":kt}}],["consolidate@<0.16.0",{peerDependencies:{mustache:"^3.0.0"},peerDependenciesMeta:{mustache:kt}}],["consolidate@<=0.16.0",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:kt,tinyliquid:kt,"liquid-node":kt,jade:kt,"then-jade":kt,dust:kt,"dustjs-helpers":kt,"dustjs-linkedin":kt,swig:kt,"swig-templates":kt,"razor-tmpl":kt,atpl:kt,liquor:kt,twig:kt,ejs:kt,eco:kt,jazz:kt,jqtpl:kt,hamljs:kt,hamlet:kt,whiskers:kt,"haml-coffee":kt,"hogan.js":kt,templayed:kt,handlebars:kt,underscore:kt,lodash:kt,pug:kt,"then-pug":kt,qejs:kt,walrus:kt,mustache:kt,just:kt,ect:kt,mote:kt,toffee:kt,dot:kt,"bracket-template":kt,ractive:kt,nunjucks:kt,htmling:kt,"babel-core":kt,plates:kt,"react-dom":kt,react:kt,"arc-templates":kt,vash:kt,slm:kt,marko:kt,teacup:kt,"coffee-script":kt,squirrelly:kt,twing:kt}}],["vue-loader@<=16.3.3",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"},peerDependenciesMeta:{"@vue/compiler-sfc":kt}}],["vue-loader@^16.7.0",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",vue:"^3.2.13"},peerDependenciesMeta:{"@vue/compiler-sfc":kt,vue:kt}}],["scss-parser@<=1.0.5",{dependencies:{lodash:"^4.17.21"}}],["query-ast@<1.0.5",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@<2.0.0",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@<2.3.0",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@<=0.8.0",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@<3.8.6",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:kt}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:kt}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":kt,"webpack-command":kt}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":kt}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":kt}}],["@docusaurus/responsive-loader@<1.5.0",{peerDependenciesMeta:{sharp:kt,jimp:kt}}],["eslint-module-utils@*",{peerDependenciesMeta:{"eslint-import-resolver-node":kt,"eslint-import-resolver-typescript":kt,"eslint-import-resolver-webpack":kt,"@typescript-eslint/parser":kt}}],["eslint-plugin-import@*",{peerDependenciesMeta:{"@typescript-eslint/parser":kt}}],["critters-webpack-plugin@<3.0.2",{peerDependenciesMeta:{"html-webpack-plugin":kt}}],["terser@<=5.10.0",{dependencies:{acorn:"^8.5.0"}}],["babel-preset-react-app@10.0.x <10.0.2",{dependencies:{"@babel/plugin-proposal-private-property-in-object":"^7.16.7"}}],["eslint-config-react-app@*",{peerDependenciesMeta:{typescript:kt}}],["@vue/eslint-config-typescript@<11.0.0",{peerDependenciesMeta:{typescript:kt}}],["unplugin-vue2-script-setup@<0.9.1",{peerDependencies:{"@vue/composition-api":"^1.4.3","@vue/runtime-dom":"^3.2.26"}}],["@cypress/snapshot@*",{dependencies:{debug:"^3.2.7"}}],["auto-relay@<=0.14.0",{peerDependencies:{"reflect-metadata":"^0.1.13"}}],["vue-template-babel-compiler@<1.2.0",{peerDependencies:{"vue-template-compiler":"^2.6.0"}}],["@parcel/transformer-image@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["@parcel/transformer-js@<2.5.0",{peerDependencies:{"@parcel/core":"*"}}],["parcel@*",{peerDependenciesMeta:{"@parcel/core":kt}}],["react-scripts@*",{peerDependencies:{eslint:"*"}}],["focus-trap-react@^8.0.0",{dependencies:{tabbable:"^5.3.2"}}],["react-rnd@<10.3.7",{peerDependencies:{react:">=16.3.0","react-dom":">=16.3.0"}}],["connect-mongo@<5.0.0",{peerDependencies:{"express-session":"^1.17.1"}}],["vue-i18n@<9",{peerDependencies:{vue:"^2"}}],["vue-router@<4",{peerDependencies:{vue:"^2"}}],["unified@<10",{dependencies:{"@types/unist":"^2.0.0"}}],["react-github-btn@<=1.3.0",{peerDependencies:{react:">=16.3.0"}}],["react-dev-utils@*",{peerDependencies:{typescript:">=2.7",webpack:">=4"},peerDependenciesMeta:{typescript:kt}}],["@asyncapi/react-component@<=1.0.0-next.39",{peerDependencies:{react:">=16.8.0","react-dom":">=16.8.0"}}],["xo@*",{peerDependencies:{webpack:">=1.11.0"},peerDependenciesMeta:{webpack:kt}}],["babel-plugin-remove-graphql-queries@<=4.20.0-next.0",{dependencies:{"@babel/types":"^7.15.4"}}],["gatsby-plugin-page-creator@<=4.20.0-next.1",{dependencies:{"fs-extra":"^10.1.0"}}],["gatsby-plugin-utils@<=3.14.0-next.1",{dependencies:{fastq:"^1.13.0"},peerDependencies:{graphql:"^15.0.0"}}],["gatsby-plugin-mdx@<3.1.0-next.1",{dependencies:{mkdirp:"^1.0.4"}}],["gatsby-plugin-mdx@^2",{peerDependencies:{gatsby:"^3.0.0-next"}}],["fdir@<=5.2.0",{peerDependencies:{picomatch:"2.x"},peerDependenciesMeta:{picomatch:kt}}],["babel-plugin-transform-typescript-metadata@<=0.3.2",{peerDependencies:{"@babel/core":"^7","@babel/traverse":"^7"},peerDependenciesMeta:{"@babel/traverse":kt}}],["graphql-compose@>=9.0.10",{peerDependencies:{graphql:"^14.2.0 || ^15.0.0 || ^16.0.0"}}],["vite-plugin-vuetify@<=1.0.2",{peerDependencies:{vue:"^3.0.0"}}],["webpack-plugin-vuetify@<=2.0.1",{peerDependencies:{vue:"^3.2.6"}}],["eslint-import-resolver-vite@<2.0.1",{dependencies:{debug:"^4.3.4",resolve:"^1.22.8"}}],["notistack@^3.0.0",{dependencies:{csstype:"^3.0.10"}}]];var _H;function Cme(){return typeof _H>"u"&&(_H=ve("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),_H}var HH;function Ime(){return typeof HH>"u"&&(HH=ve("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),HH}var qH;function wme(){return typeof qH>"u"&&(qH=ve("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),qH}var Bme=new Map([[G.makeIdent(null,"fsevents").identHash,Cme],[G.makeIdent(null,"resolve").identHash,Ime],[G.makeIdent(null,"typescript").identHash,wme]]),wgt={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,o]of UH)e(G.parseDescriptor(r,!0),o)},getBuiltinPatch:async(t,e)=>{let r="compat/";if(!e.startsWith(r))return;let o=G.parseIdent(e.slice(r.length)),a=Bme.get(o.identHash)?.();return typeof a<"u"?a:null},reduceDependency:async(t,e,r,o)=>typeof Bme.get(t.identHash)>"u"?t:G.makeDescriptor(t,G.makeRange({protocol:"patch:",source:G.stringifyDescriptor(t),selector:`optional!builtin`,params:null}))}},Bgt=wgt;var a6={};Vt(a6,{ConstraintsCheckCommand:()=>sC,ConstraintsQueryCommand:()=>nC,ConstraintsSourceCommand:()=>iC,default:()=>zgt});Ve();Ve();j2();var $E=class{constructor(e){this.project=e}createEnvironment(){let e=new ZE(["cwd","ident"]),r=new ZE(["workspace","type","ident"]),o=new ZE(["ident"]),a={manifestUpdates:new Map,reportedErrors:new Map},n=new Map,u=new Map;for(let A of this.project.storedPackages.values()){let p=Array.from(A.peerDependencies.values(),h=>[G.stringifyIdent(h),h.range]);n.set(A.locatorHash,{workspace:null,ident:G.stringifyIdent(A),version:A.version,dependencies:new Map,peerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional!==!0)),optionalPeerDependencies:new Map(p.filter(([h])=>A.peerDependenciesMeta.get(h)?.optional===!0))})}for(let A of this.project.storedPackages.values()){let p=n.get(A.locatorHash);p.dependencies=new Map(Array.from(A.dependencies.values(),h=>{let E=this.project.storedResolutions.get(h.descriptorHash);if(typeof E>"u")throw new Error("Assertion failed: The resolution should have been registered");let w=n.get(E);if(typeof w>"u")throw new Error("Assertion failed: The package should have been registered");return[G.stringifyIdent(h),w]})),p.dependencies.delete(p.ident)}for(let A of this.project.workspaces){let p=G.stringifyIdent(A.anchoredLocator),h=A.manifest.exportTo({}),E=n.get(A.anchoredLocator.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");let w=(T,N,{caller:U=Xi.getCaller()}={})=>{let J=q2(T),te=qe.getMapWithDefault(a.manifestUpdates,A.cwd),le=qe.getMapWithDefault(te,J),ce=qe.getSetWithDefault(le,N);U!==null&&ce.add(U)},D=T=>w(T,void 0,{caller:Xi.getCaller()}),b=T=>{qe.getArrayWithDefault(a.reportedErrors,A.cwd).push(T)},C=e.insert({cwd:A.relativeCwd,ident:p,manifest:h,pkg:E,set:w,unset:D,error:b});u.set(A,C);for(let T of _t.allDependencies)for(let N of A.manifest[T].values()){let U=G.stringifyIdent(N),J=()=>{w([T,U],void 0,{caller:Xi.getCaller()})},te=ce=>{w([T,U],ce,{caller:Xi.getCaller()})},le=null;if(T!=="peerDependencies"&&(T!=="dependencies"||!A.manifest.devDependencies.has(N.identHash))){let ce=A.anchoredPackage.dependencies.get(N.identHash);if(ce){if(typeof ce>"u")throw new Error("Assertion failed: The dependency should have been registered");let ue=this.project.storedResolutions.get(ce.descriptorHash);if(typeof ue>"u")throw new Error("Assertion failed: The resolution should have been registered");let Ie=n.get(ue);if(typeof Ie>"u")throw new Error("Assertion failed: The package should have been registered");le=Ie}}r.insert({workspace:C,ident:U,range:N.range,type:T,resolution:le,update:te,delete:J,error:b})}}for(let A of this.project.storedPackages.values()){let p=this.project.tryWorkspaceByLocator(A);if(!p)continue;let h=u.get(p);if(typeof h>"u")throw new Error("Assertion failed: The workspace should have been registered");let E=n.get(A.locatorHash);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");E.workspace=h}return{workspaces:e,dependencies:r,packages:o,result:a}}async process(){let e=this.createEnvironment(),r={Yarn:{workspace:a=>e.workspaces.find(a)[0]??null,workspaces:a=>e.workspaces.find(a),dependency:a=>e.dependencies.find(a)[0]??null,dependencies:a=>e.dependencies.find(a),package:a=>e.packages.find(a)[0]??null,packages:a=>e.packages.find(a)}},o=await this.project.loadUserConfig();return o?.constraints?(await o.constraints(r),e.result):null}};Ve();Ve();Gt();var nC=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.query=de.String()}static{this.paths=[["constraints","query"]]}static{this.usage=ot.Usage({category:"Constraints-related commands",description:"query the constraints fact database",details:` - This command will output all matches to the given prolog query. - `,examples:[["List all dependencies throughout the workspace","yarn constraints query 'workspace_has_dependency(_, DependencyName, _, _).'"]]})}async execute(){let{Constraints:r}=await Promise.resolve().then(()=>(V2(),Y2)),o=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Qt.find(o,this.context.cwd),n=await r.find(a),u=this.query;return u.endsWith(".")||(u=`${u}.`),(await Lt.start({configuration:o,json:this.json,stdout:this.context.stdout},async p=>{for await(let h of n.query(u)){let E=Array.from(Object.entries(h)),w=E.length,D=E.reduce((b,[C])=>Math.max(b,C.length),0);for(let b=0;b(V2(),Y2)),o=await ze.find(this.context.cwd,this.context.plugins),{project:a}=await Qt.find(o,this.context.cwd),n=await r.find(a);this.context.stdout.write(this.verbose?n.fullSource:n.source)}};Ve();Ve();Gt();j2();var sC=class extends ut{constructor(){super(...arguments);this.fix=de.Boolean("--fix",!1,{description:"Attempt to automatically fix unambiguous issues, following a multi-pass process"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["constraints"]]}static{this.usage=ot.Usage({category:"Constraints-related commands",description:"check that the project constraints are met",details:` - This command will run constraints on your project and emit errors for each one that is found but isn't met. If any error is emitted the process will exit with a non-zero exit code. - - If the \`--fix\` flag is used, Yarn will attempt to automatically fix the issues the best it can, following a multi-pass process (with a maximum of 10 iterations). Some ambiguous patterns cannot be autofixed, in which case you'll have to manually specify the right resolution. - - For more information as to how to write constraints, please consult our dedicated page on our website: https://yarnpkg.com/features/constraints. - `,examples:[["Check that all constraints are satisfied","yarn constraints"],["Autofix all unmet constraints","yarn constraints --fix"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd);await o.restoreInstallState();let a=await o.loadUserConfig(),n;if(a?.constraints)n=new $E(o);else{let{Constraints:h}=await Promise.resolve().then(()=>(V2(),Y2));n=await h.find(o)}let u,A=!1,p=!1;for(let h=this.fix?10:1;h>0;--h){let E=await n.process();if(!E)break;let{changedWorkspaces:w,remainingErrors:D}=Kk(o,E,{fix:this.fix}),b=[];for(let[C,T]of w){let N=C.manifest.indent;C.manifest=new _t,C.manifest.indent=N,C.manifest.load(T),b.push(C.persistManifest())}if(await Promise.all(b),!(w.size>0&&h>1)){u=kme(D,{configuration:r}),A=!1,p=!0;for(let[,C]of D)for(let T of C)T.fixable?A=!0:p=!1}}if(u.children.length===0)return 0;if(A){let h=p?`Those errors can all be fixed by running ${pe.pretty(r,"yarn constraints --fix",pe.Type.CODE)}`:`Errors prefixed by '\u2699' can be fixed by running ${pe.pretty(r,"yarn constraints --fix",pe.Type.CODE)}`;await Lt.start({configuration:r,stdout:this.context.stdout,includeNames:!1,includeFooter:!1},async E=>{E.reportInfo(0,h),E.reportSeparator()})}return u.children=qe.sortMap(u.children,h=>h.value[1]),As.emitTree(u,{configuration:r,stdout:this.context.stdout,json:this.json,separators:1}),1}};j2();var Jgt={configuration:{enableConstraintsChecks:{description:"If true, constraints will run during installs",type:"BOOLEAN",default:!1},constraintsPath:{description:"The path of the constraints file.",type:"ABSOLUTE_PATH",default:"./constraints.pro"}},commands:[nC,iC,sC],hooks:{async validateProjectAfterInstall(t,{reportError:e}){if(!t.configuration.get("enableConstraintsChecks"))return;let r=await t.loadUserConfig(),o;if(r?.constraints)o=new $E(t);else{let{Constraints:u}=await Promise.resolve().then(()=>(V2(),Y2));o=await u.find(t)}let a=await o.process();if(!a)return;let{remainingErrors:n}=Kk(t,a);if(n.size!==0)if(t.configuration.isCI)for(let[u,A]of n)for(let p of A)e(84,`${pe.pretty(t.configuration,u.anchoredLocator,pe.Type.IDENT)}: ${p.text}`);else e(84,`Constraint check failed; run ${pe.pretty(t.configuration,"yarn constraints",pe.Type.CODE)} for more details`)}}},zgt=Jgt;var l6={};Vt(l6,{CreateCommand:()=>oC,DlxCommand:()=>aC,default:()=>Zgt});Ve();Gt();var oC=class extends ut{constructor(){super(...arguments);this.pkg=de.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=de.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=de.String();this.args=de.Proxy()}static{this.paths=[["create"]]}async execute(){let r=[];this.pkg&&r.push("--package",this.pkg),this.quiet&&r.push("--quiet");let o=this.command.replace(/^(@[^@/]+)(@|$)/,"$1/create$2"),a=G.parseDescriptor(o),n=a.name.match(/^create(-|$)/)?a:a.scope?G.makeIdent(a.scope,`create-${a.name}`):G.makeIdent(null,`create-${a.name}`),u=G.stringifyIdent(n);return a.range!=="unknown"&&(u+=`@${a.range}`),this.cli.run(["dlx",...r,u,...this.args])}};Ve();Ve();St();Gt();var aC=class extends ut{constructor(){super(...arguments);this.packages=de.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=de.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=de.String();this.args=de.Proxy()}static{this.paths=[["dlx"]]}static{this.usage=ot.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]})}async execute(){return ze.telemetry=null,await ae.mktempPromise(async r=>{let o=V.join(r,`dlx-${process.pid}`);await ae.mkdirPromise(o),await ae.writeFilePromise(V.join(o,"package.json"),`{} -`),await ae.writeFilePromise(V.join(o,"yarn.lock"),"");let a=V.join(o,".yarnrc.yml"),n=await ze.findProjectCwd(this.context.cwd),A={enableGlobalCache:!(await ze.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),enableTelemetry:!1,logFilters:[{code:Ju(68),level:pe.LogLevel.Discard}]},p=n!==null?V.join(n,".yarnrc.yml"):null;p!==null&&ae.existsSync(p)?(await ae.copyFilePromise(p,a),await ze.updateConfiguration(o,N=>{let U=qe.toMerged(N,A);return Array.isArray(N.plugins)&&(U.plugins=N.plugins.map(J=>{let te=typeof J=="string"?J:J.path,le=Ae.isAbsolute(te)?te:Ae.resolve(Ae.fromPortablePath(n),te);return typeof J=="string"?le:{path:le,spec:J.spec}})),U})):await ae.writeJsonPromise(a,A);let h=this.packages??[this.command],E=G.parseDescriptor(this.command).name,w=await this.cli.run(["add","--fixed","--",...h],{cwd:o,quiet:this.quiet});if(w!==0)return w;this.quiet||this.context.stdout.write(` -`);let D=await ze.find(o,this.context.plugins),{project:b,workspace:C}=await Qt.find(D,o);if(C===null)throw new or(b.cwd,o);await b.restoreInstallState();let T=await hn.getWorkspaceAccessibleBinaries(C);return T.has(E)===!1&&T.size===1&&typeof this.packages>"u"&&(E=Array.from(T)[0][0]),await hn.executeWorkspaceAccessibleBinary(C,E,this.args,{packageAccessibleBinaries:T,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};var Xgt={commands:[oC,aC]},Zgt=Xgt;var A6={};Vt(A6,{ExecFetcher:()=>J2,ExecResolver:()=>z2,default:()=>tdt,execUtils:()=>Zk});Ve();Ve();St();var hA="exec:";var Zk={};Vt(Zk,{loadGeneratorFile:()=>K2,makeLocator:()=>u6,makeSpec:()=>rye,parseSpec:()=>c6});Ve();St();function c6(t){let{params:e,selector:r}=G.parseRange(t),o=Ae.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?G.parseLocator(e.locator):null,path:o}}function rye({parentLocator:t,path:e,generatorHash:r,protocol:o}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return G.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function u6(t,{parentLocator:e,path:r,generatorHash:o,protocol:a}){return G.makeLocator(t,rye({parentLocator:e,path:r,generatorHash:o,protocol:a}))}async function K2(t,e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(t,{protocol:e}),n=V.isAbsolute(a)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,n.localPath)}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.join(u.prefixPath,a);return await A.readFilePromise(p,"utf8")}var J2=class{supports(e,r){return!!e.reference.startsWith(hA)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:hA});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){let o=await K2(e.reference,hA,r);return ae.mktempPromise(async a=>{let n=V.join(a,"generator.js");return await ae.writeFilePromise(n,o),ae.mktempPromise(async u=>{if(await this.generatePackage(u,e,n,r),!ae.existsSync(V.join(u,"build")))throw new Error("The script should have generated a build directory");return await $i.makeArchiveFromDirectory(V.join(u,"build"),{prefixPath:G.getIdentVendorPath(e),compressionLevel:r.project.configuration.get("compressionLevel")})})})}async generatePackage(e,r,o,a){return await ae.mktempPromise(async n=>{let u=await hn.makeScriptEnv({project:a.project,binFolder:n}),A=V.join(e,"runtime.js");return await ae.mktempPromise(async p=>{let h=V.join(p,"buildfile.log"),E=V.join(e,"generator"),w=V.join(e,"build");await ae.mkdirPromise(E),await ae.mkdirPromise(w);let D={tempDir:Ae.fromPortablePath(E),buildDir:Ae.fromPortablePath(w),locator:G.stringifyLocator(r)};await ae.writeFilePromise(A,` - // Expose 'Module' as a global variable - Object.defineProperty(global, 'Module', { - get: () => require('module'), - configurable: true, - enumerable: false, - }); - - // Expose non-hidden built-in modules as global variables - for (const name of Module.builtinModules.filter((name) => name !== 'module' && !name.startsWith('_'))) { - Object.defineProperty(global, name, { - get: () => require(name), - configurable: true, - enumerable: false, - }); - } - - // Expose the 'execEnv' global variable - Object.defineProperty(global, 'execEnv', { - value: { - ...${JSON.stringify(D)}, - }, - enumerable: true, - }); - `);let b=u.NODE_OPTIONS||"",C=/\s*--require\s+\S*\.pnp\.c?js\s*/g;b=b.replace(C," ").trim(),u.NODE_OPTIONS=b;let{stdout:T,stderr:N}=a.project.configuration.getSubprocessStreams(h,{header:`# This file contains the result of Yarn generating a package (${G.stringifyLocator(r)}) -`,prefix:G.prettyLocator(a.project.configuration,r),report:a.report}),{code:U}=await Hr.pipevp(process.execPath,["--require",Ae.fromPortablePath(A),Ae.fromPortablePath(o),G.stringifyIdent(r)],{cwd:e,env:u,stdin:null,stdout:T,stderr:N});if(U!==0)throw ae.detachTemp(p),new Error(`Package generation failed (exit code ${U}, logs can be found here: ${pe.pretty(a.project.configuration,h,pe.Type.PATH)})`)})})}};Ve();Ve();var $gt=2,z2=class{supportsDescriptor(e,r){return!!e.range.startsWith(hA)}supportsLocator(e,r){return!!e.reference.startsWith(hA)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=c6(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await K2(G.makeRange({protocol:hA,source:a,selector:a,params:{locator:G.stringifyLocator(n)}}),hA,o.fetchOptions),A=bn.makeHash(`${$gt}`,u).slice(0,6);return[u6(e,{parentLocator:n,path:a,generatorHash:A,protocol:hA})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var edt={fetchers:[J2],resolvers:[z2]},tdt=edt;var p6={};Vt(p6,{FileFetcher:()=>eB,FileResolver:()=>tB,TarballFileFetcher:()=>rB,TarballFileResolver:()=>nB,default:()=>idt,fileUtils:()=>$g});Ve();St();var lC=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,X2=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,_i="file:";var $g={};Vt($g,{fetchArchiveFromLocator:()=>$2,makeArchiveFromLocator:()=>$k,makeBufferFromLocator:()=>f6,makeLocator:()=>cC,makeSpec:()=>nye,parseSpec:()=>Z2});Ve();St();function Z2(t){let{params:e,selector:r}=G.parseRange(t),o=Ae.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?G.parseLocator(e.locator):null,path:o}}function nye({parentLocator:t,path:e,hash:r,protocol:o}){let a=t!==null?{locator:G.stringifyLocator(t)}:{},n=typeof r<"u"?{hash:r}:{};return G.makeRange({protocol:o,source:e,selector:e,params:{...n,...a}})}function cC(t,{parentLocator:e,path:r,hash:o,protocol:a}){return G.makeLocator(t,nye({parentLocator:e,path:r,hash:o,protocol:a}))}async function $2(t,e){let{parentLocator:r,path:o}=G.parseFileStyleRange(t.reference,{protocol:_i}),a=V.isAbsolute(o)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await e.fetcher.fetch(r,e),n=a.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,a.localPath)}:a;a!==n&&a.releaseFs&&a.releaseFs();let u=n.packageFs,A=V.join(n.prefixPath,o);return await qe.releaseAfterUseAsync(async()=>await u.readFilePromise(A),n.releaseFs)}async function $k(t,{protocol:e,fetchOptions:r,inMemory:o=!1}){let{parentLocator:a,path:n}=G.parseFileStyleRange(t.reference,{protocol:e}),u=V.isAbsolute(n)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(a,r),A=u.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,u.localPath)}:u;u!==A&&u.releaseFs&&u.releaseFs();let p=A.packageFs,h=V.join(A.prefixPath,n);return await qe.releaseAfterUseAsync(async()=>await $i.makeArchiveFromDirectory(h,{baseFs:p,prefixPath:G.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:o}),A.releaseFs)}async function f6(t,{protocol:e,fetchOptions:r}){return(await $k(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var eB=class{supports(e,r){return!!e.reference.startsWith(_i)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:_i});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async fetchFromDisk(e,r){return $k(e,{protocol:_i,fetchOptions:r})}};Ve();Ve();var rdt=2,tB=class{supportsDescriptor(e,r){return e.range.match(lC)?!0:!!e.range.startsWith(_i)}supportsLocator(e,r){return!!e.reference.startsWith(_i)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return lC.test(e.range)&&(e=G.makeDescriptor(e,`${_i}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=Z2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=await f6(G.makeLocator(e,G.makeRange({protocol:_i,source:a,selector:a,params:{locator:G.stringifyLocator(n)}})),{protocol:_i,fetchOptions:o.fetchOptions}),A=bn.makeHash(`${rdt}`,u).slice(0,6);return[cC(e,{parentLocator:n,path:a,hash:A,protocol:_i})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};Ve();var rB=class{supports(e,r){return X2.test(e.reference)?!!e.reference.startsWith(_i):!1}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromDisk(e,r){let o=await $2(e,r);return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ve();Ve();Ve();var nB=class{supportsDescriptor(e,r){return X2.test(e.range)?!!(e.range.startsWith(_i)||lC.test(e.range)):!1}supportsLocator(e,r){return X2.test(e.reference)?!!e.reference.startsWith(_i):!1}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return lC.test(e.range)&&(e=G.makeDescriptor(e,`${_i}${e.range}`)),G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:a,parentLocator:n}=Z2(e.range);if(n===null)throw new Error("Assertion failed: The descriptor should have been bound");let u=cC(e,{parentLocator:n,path:a,hash:"",protocol:_i}),A=await $2(u,o.fetchOptions),p=bn.makeHash(A).slice(0,6);return[cC(e,{parentLocator:n,path:a,hash:p,protocol:_i})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var ndt={fetchers:[rB,eB],resolvers:[nB,tB]},idt=ndt;var d6={};Vt(d6,{GithubFetcher:()=>iB,default:()=>odt,githubUtils:()=>eQ});Ve();St();var eQ={};Vt(eQ,{invalidGithubUrlMessage:()=>oye,isGithubUrl:()=>h6,parseGithubUrl:()=>g6});var iye=et(ve("querystring")),sye=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function h6(t){return t?sye.some(e=>!!t.match(e)):!1}function g6(t){let e;for(let A of sye)if(e=t.match(A),e)break;if(!e)throw new Error(oye(t));let[,r,o,a,n="master"]=e,{commit:u}=iye.default.parse(n);return n=u||n.replace(/[^:]*:/,""),{auth:r,username:o,reponame:a,treeish:n}}function oye(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var iB=class{supports(e,r){return!!h6(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await on.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await ae.mktempPromise(async a=>{let n=new En(a);await $i.extractArchiveTo(o,n,{stripComponents:1});let u=ra.splitRepoUrl(e.reference),A=V.join(a,"package.tgz");await hn.prepareExternalProject(a,A,{configuration:r.project.configuration,report:r.report,workspace:u.extra.workspace,locator:e});let p=await ae.readFilePromise(A);return await $i.convertToZip(p,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:o,username:a,reponame:n,treeish:u}=g6(e.reference);return`https://${o?`${o}@`:""}github.com/${a}/${n}/archive/${u}.tar.gz`}};var sdt={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let o=new iB;if(!o.supports(e,r))return null;try{return await o.fetch(e,r)}catch{return null}}}},odt=sdt;var m6={};Vt(m6,{TarballHttpFetcher:()=>oB,TarballHttpResolver:()=>aB,default:()=>ldt});Ve();function sB(t){let e;try{e=new URL(t)}catch{return!1}return!(e.protocol!=="http:"&&e.protocol!=="https:"||!e.pathname.match(/(\.tar\.gz|\.tgz|\/[^.]+)$/))}var oB=class{supports(e,r){return sB(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o=await on.get(e.reference,{configuration:r.project.configuration});return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ve();Ve();var aB=class{supportsDescriptor(e,r){return sB(e.range)}supportsLocator(e,r){return sB(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){return[G.convertDescriptorToLocator(e)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"HARD",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var adt={fetchers:[oB],resolvers:[aB]},ldt=adt;var y6={};Vt(y6,{InitCommand:()=>uC,default:()=>udt});Ve();Ve();St();Gt();var uC=class extends ut{constructor(){super(...arguments);this.private=de.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=de.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=de.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.name=de.String("-n,--name",{description:"Initialize a package with the given name"});this.initializer=de.String({required:!1});this.usev2=de.Boolean("-2",!1,{hidden:!0});this.yes=de.Boolean("-y,--yes",{hidden:!0})}static{this.paths=[["init"]]}static{this.usage=ot.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return o!==null?await this.executeProxy(r,o):await this.executeRegular(r)}async executeProxy(r,o){if(r.projectCwd!==null&&r.projectCwd!==this.context.cwd)throw new it("Cannot use the --install flag from within a project subdirectory");ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=V.join(this.context.cwd,mr.lockfile);ae.existsSync(a)||await ae.writeFilePromise(a,"");let n=await this.cli.run(["set","version",o],{quiet:!0});if(n!==0)return n;let u=[];return this.private&&u.push("-p"),this.workspace&&u.push("-w"),this.name&&u.push(`-n=${this.name}`),this.yes&&u.push("-y"),await ae.mktempPromise(async A=>{let{code:p}=await Hr.pipevp("yarn",["init",...u],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await hn.makeScriptEnv({binFolder:A})});return p})}async executeRegular(r){let o=null;try{o=(await Qt.find(r,this.context.cwd)).project}catch{o=null}ae.existsSync(this.context.cwd)||await ae.mkdirPromise(this.context.cwd,{recursive:!0});let a=await _t.tryFind(this.context.cwd),n=a??new _t,u=Object.fromEntries(r.get("initFields").entries());n.load(u),n.name=n.name??G.makeIdent(r.get("initScope"),this.name??V.basename(this.context.cwd)),n.packageManager=nn&&qe.isTaggedYarnVersion(nn)?`yarn@${nn}`:null,(!a&&this.workspace||this.private)&&(n.private=!0),this.workspace&&n.workspaceDefinitions.length===0&&(await ae.mkdirPromise(V.join(this.context.cwd,"packages"),{recursive:!0}),n.workspaceDefinitions=[{pattern:"packages/*"}]);let A={};n.exportTo(A);let p=V.join(this.context.cwd,_t.fileName);await ae.changeFilePromise(p,`${JSON.stringify(A,null,2)} -`,{automaticNewlines:!0});let h=[p],E=V.join(this.context.cwd,"README.md");if(ae.existsSync(E)||(await ae.writeFilePromise(E,`# ${G.stringifyIdent(n.name)} -`),h.push(E)),!o||o.cwd===this.context.cwd){let w=V.join(this.context.cwd,mr.lockfile);ae.existsSync(w)||(await ae.writeFilePromise(w,""),h.push(w));let b=[".yarn/*","!.yarn/patches","!.yarn/plugins","!.yarn/releases","!.yarn/sdks","!.yarn/versions","","# Whether you use PnP or not, the node_modules folder is often used to store","# build artifacts that should be gitignored","node_modules","","# Swap the comments on the following lines if you wish to use zero-installs","# In that case, don't forget to run `yarn config set enableGlobalCache false`!","# Documentation here: https://yarnpkg.com/features/caching#zero-installs","","#!.yarn/cache",".pnp.*"].map(ce=>`${ce} -`).join(""),C=V.join(this.context.cwd,".gitignore");ae.existsSync(C)||(await ae.writeFilePromise(C,b),h.push(C));let N=["/.yarn/** linguist-vendored","/.yarn/releases/* binary","/.yarn/plugins/**/* binary","/.pnp.* binary linguist-generated"].map(ce=>`${ce} -`).join(""),U=V.join(this.context.cwd,".gitattributes");ae.existsSync(U)||(await ae.writeFilePromise(U,N),h.push(U));let J={"*":{charset:"utf-8",endOfLine:"lf",indentSize:2,indentStyle:"space",insertFinalNewline:!0}};qe.mergeIntoTarget(J,r.get("initEditorConfig"));let te=`root = true -`;for(let[ce,ue]of Object.entries(J)){te+=` -[${ce}] -`;for(let[Ie,he]of Object.entries(ue)){let De=Ie.replace(/[A-Z]/g,Ee=>`_${Ee.toLowerCase()}`);te+=`${De} = ${he} -`}}let le=V.join(this.context.cwd,".editorconfig");ae.existsSync(le)||(await ae.writeFilePromise(le,te),h.push(le)),await this.cli.run(["install"],{quiet:!0}),this.initializer&&(this.context.stdout.write(` -`),await this.cli.run(["dlx",this.initializer],{quiet:!0})),ae.existsSync(V.join(this.context.cwd,".git"))||(await Hr.execvp("git",["init"],{cwd:this.context.cwd}),await Hr.execvp("git",["add","--",...h],{cwd:this.context.cwd}),await Hr.execvp("git",["commit","--allow-empty","-m","First commit"],{cwd:this.context.cwd}))}}};var cdt={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:"STRING",default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:"MAP",valueDefinition:{description:"",type:"ANY"}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:"MAP",valueDefinition:{description:"",type:"ANY"}}},commands:[uC]},udt=cdt;var mj={};Vt(mj,{SearchCommand:()=>xC,UpgradeInteractiveCommand:()=>bC,default:()=>UIt});Ve();var lye=et(ve("os"));function AC({stdout:t}){if(lye.default.endianness()==="BE")throw new Error("Interactive commands cannot be used on big-endian systems because ink depends on yoga-layout-prebuilt which only supports little-endian architectures");if(!t.isTTY)throw new Error("Interactive commands can only be used inside a TTY environment")}Gt();var CEe=et(N6()),O6={appId:"OFCNCOG2CU",apiKey:"6fe4476ee5a1832882e326b506d14126",indexName:"npm-search"},ayt=(0,CEe.default)(O6.appId,O6.apiKey).initIndex(O6.indexName),M6=async(t,e=0)=>await ayt.search(t,{analyticsTags:["yarn-plugin-interactive-tools"],attributesToRetrieve:["name","version","owner","repository","humanDownloadsLast30Days"],page:e,hitsPerPage:10});var sv=["regular","dev","peer"],xC=class extends ut{static{this.paths=[["search"]]}static{this.usage=ot.Usage({category:"Interactive commands",description:"open the search interface",details:` - This command opens a fullscreen terminal interface where you can search for and install packages from the npm registry. - `,examples:[["Open the search window","yarn search"]]})}async execute(){AC(this.context);let{Gem:e}=await Promise.resolve().then(()=>(UQ(),oj)),{ScrollableItems:r}=await Promise.resolve().then(()=>(jQ(),qQ)),{useKeypress:o}=await Promise.resolve().then(()=>(rv(),bwe)),{useMinistore:a}=await Promise.resolve().then(()=>(fj(),Aj)),{renderForm:n}=await Promise.resolve().then(()=>(VQ(),YQ)),{default:u}=await Promise.resolve().then(()=>et(Uwe())),{Box:A,Text:p}=await Promise.resolve().then(()=>et(ac())),{default:h,useEffect:E,useState:w}=await Promise.resolve().then(()=>et(ln())),D=await ze.find(this.context.cwd,this.context.plugins),b=()=>h.createElement(A,{flexDirection:"row"},h.createElement(A,{flexDirection:"column",width:48},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move between packages.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select a package.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," again to change the target."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to install the selected packages.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),C=()=>h.createElement(h.Fragment,null,h.createElement(A,{width:15},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Owner")),h.createElement(A,{width:11},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Version")),h.createElement(A,{width:10},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Downloads"))),T=()=>h.createElement(A,{width:17},h.createElement(p,{bold:!0,underline:!0,color:"gray"},"Target")),N=({hit:he,active:De})=>{let[Ee,g]=a(he.name,null);o({active:De},(fe,ie)=>{if(ie.name!=="space")return;if(!Ee){g(sv[0]);return}let Z=sv.indexOf(Ee)+1;Z===sv.length?g(null):g(sv[Z])},[Ee,g]);let me=G.parseIdent(he.name),Ce=G.prettyIdent(D,me);return h.createElement(A,null,h.createElement(A,{width:45},h.createElement(p,{bold:!0,wrap:"wrap"},Ce)),h.createElement(A,{width:14,marginLeft:1},h.createElement(p,{bold:!0,wrap:"truncate"},he.owner.name)),h.createElement(A,{width:10,marginLeft:1},h.createElement(p,{italic:!0,wrap:"truncate"},he.version)),h.createElement(A,{width:16,marginLeft:1},h.createElement(p,null,he.humanDownloadsLast30Days)))},U=({name:he,active:De})=>{let[Ee]=a(he,null),g=G.parseIdent(he);return h.createElement(A,null,h.createElement(A,{width:47},h.createElement(p,{bold:!0}," - ",G.prettyIdent(D,g))),sv.map(me=>h.createElement(A,{key:me,width:14,marginLeft:1},h.createElement(p,null," ",h.createElement(e,{active:Ee===me})," ",h.createElement(p,{bold:!0},me)))))},J=()=>h.createElement(A,{marginTop:1},h.createElement(p,null,"Powered by Algolia.")),le=await n(({useSubmit:he})=>{let De=a();he(De);let Ee=Array.from(De.keys()).filter(q=>De.get(q)!==null),[g,me]=w(""),[Ce,fe]=w(0),[ie,Z]=w([]),Se=q=>{q.match(/\t| /)||me(q)},Re=async()=>{fe(0);let q=await M6(g);q.query===g&&Z(q.hits)},ht=async()=>{let q=await M6(g,Ce+1);q.query===g&&q.page-1===Ce&&(fe(q.page),Z([...ie,...q.hits]))};return E(()=>{g?Re():Z([])},[g]),h.createElement(A,{flexDirection:"column"},h.createElement(b,null),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(p,{bold:!0},"Search: "),h.createElement(A,{width:41},h.createElement(u,{value:g,onChange:Se,placeholder:"i.e. babel, webpack, react...",showCursor:!1})),h.createElement(C,null)),ie.length?h.createElement(r,{radius:2,loop:!1,children:ie.map(q=>h.createElement(N,{key:q.name,hit:q,active:!1})),willReachEnd:ht}):h.createElement(p,{color:"gray"},"Start typing..."),h.createElement(A,{flexDirection:"row",marginTop:1},h.createElement(A,{width:49},h.createElement(p,{bold:!0},"Selected:")),h.createElement(T,null)),Ee.length?Ee.map(q=>h.createElement(U,{key:q,name:q,active:!1})):h.createElement(p,{color:"gray"},"No selected packages..."),h.createElement(J,null))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof le>"u")return 1;let ce=Array.from(le.keys()).filter(he=>le.get(he)==="regular"),ue=Array.from(le.keys()).filter(he=>le.get(he)==="dev"),Ie=Array.from(le.keys()).filter(he=>le.get(he)==="peer");return ce.length&&await this.cli.run(["add",...ce]),ue.length&&await this.cli.run(["add","--dev",...ue]),Ie&&await this.cli.run(["add","--peer",...Ie]),0}};Ve();Gt();n8();var Ywe=et(ni()),Wwe=/^((?:[\^~]|>=?)?)([0-9]+)(\.[0-9]+)(\.[0-9]+)((?:-\S+)?)$/;function Vwe(t,e){return t.length>0?[t.slice(0,e)].concat(Vwe(t.slice(e),e)):[]}var bC=class extends ut{static{this.paths=[["upgrade-interactive"]]}static{this.usage=ot.Usage({category:"Interactive commands",description:"open the upgrade interface",details:` - This command opens a fullscreen terminal interface where you can see any out of date packages used by your application, their status compared to the latest versions available on the remote registry, and select packages to upgrade. - `,examples:[["Open the upgrade window","yarn upgrade-interactive"]]})}async execute(){AC(this.context);let{ItemOptions:e}=await Promise.resolve().then(()=>(Gwe(),jwe)),{Pad:r}=await Promise.resolve().then(()=>(dj(),qwe)),{ScrollableItems:o}=await Promise.resolve().then(()=>(jQ(),qQ)),{useMinistore:a}=await Promise.resolve().then(()=>(fj(),Aj)),{renderForm:n}=await Promise.resolve().then(()=>(VQ(),YQ)),{Box:u,Text:A}=await Promise.resolve().then(()=>et(ac())),{default:p,useEffect:h,useRef:E,useState:w}=await Promise.resolve().then(()=>et(ln())),D=await ze.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await Qt.find(D,this.context.cwd),T=await Wr.find(D);if(!C)throw new or(b.cwd,this.context.cwd);await b.restoreInstallState({restoreResolutions:!1});let N=this.context.stdout.rows-7,U=(me,Ce)=>{let fe=$pe(me,Ce),ie="";for(let Z of fe)Z.added?ie+=pe.pretty(D,Z.value,"green"):Z.removed||(ie+=Z.value);return ie},J=(me,Ce)=>{if(me===Ce)return Ce;let fe=G.parseRange(me),ie=G.parseRange(Ce),Z=fe.selector.match(Wwe),Se=ie.selector.match(Wwe);if(!Z||!Se)return U(me,Ce);let Re=["gray","red","yellow","green","magenta"],ht=null,q="";for(let nt=1;nt{let ie=await nu.fetchDescriptorFrom(me,fe,{project:b,cache:T,preserveModifier:Ce,workspace:C});return ie!==null?ie.range:me.range},le=async me=>{let Ce=Ywe.default.valid(me.range)?`^${me.range}`:me.range,[fe,ie]=await Promise.all([te(me,me.range,Ce).catch(()=>null),te(me,me.range,"latest").catch(()=>null)]),Z=[{value:null,label:me.range}];return fe&&fe!==me.range?Z.push({value:fe,label:J(me.range,fe)}):Z.push({value:null,label:""}),ie&&ie!==fe&&ie!==me.range?Z.push({value:ie,label:J(me.range,ie)}):Z.push({value:null,label:""}),Z},ce=()=>p.createElement(u,{flexDirection:"row"},p.createElement(u,{flexDirection:"column",width:49},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select packages.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},""),"/",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to select versions."))),p.createElement(u,{flexDirection:"column"},p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to install.")),p.createElement(u,{marginLeft:1},p.createElement(A,null,"Press ",p.createElement(A,{bold:!0,color:"cyanBright"},"")," to abort.")))),ue=()=>p.createElement(u,{flexDirection:"row",paddingTop:1,paddingBottom:1},p.createElement(u,{width:50},p.createElement(A,{bold:!0},p.createElement(A,{color:"greenBright"},"?")," Pick the packages you want to upgrade.")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Current")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Range")),p.createElement(u,{width:17},p.createElement(A,{bold:!0,underline:!0,color:"gray"},"Latest"))),Ie=({active:me,descriptor:Ce,suggestions:fe})=>{let[ie,Z]=a(Ce.descriptorHash,null),Se=G.stringifyIdent(Ce),Re=Math.max(0,45-Se.length);return p.createElement(p.Fragment,null,p.createElement(u,null,p.createElement(u,{width:45},p.createElement(A,{bold:!0},G.prettyIdent(D,Ce)),p.createElement(r,{active:me,length:Re})),p.createElement(e,{active:me,options:fe,value:ie,skewer:!0,onChange:Z,sizes:[17,17,17]})))},he=({dependencies:me})=>{let[Ce,fe]=w(me.map(()=>null)),ie=E(!0),Z=async Se=>{let Re=await le(Se);return Re.filter(ht=>ht.label!=="").length<=1?null:{descriptor:Se,suggestions:Re}};return h(()=>()=>{ie.current=!1},[]),h(()=>{let Se=Math.trunc(N*1.75),Re=me.slice(0,Se),ht=me.slice(Se),q=Vwe(ht,N),nt=Re.map(Z).reduce(async(Le,Te)=>{await Le;let ke=await Te;ke!==null&&ie.current&&fe(Ke=>{let xe=Ke.findIndex(He=>He===null),tt=[...Ke];return tt[xe]=ke,tt})},Promise.resolve());q.reduce((Le,Te)=>Promise.all(Te.map(ke=>Promise.resolve().then(()=>Z(ke)))).then(async ke=>{ke=ke.filter(Ke=>Ke!==null),await Le,ie.current&&fe(Ke=>{let xe=Ke.findIndex(tt=>tt===null);return Ke.slice(0,xe).concat(ke).concat(Ke.slice(xe+ke.length))})}),nt).then(()=>{ie.current&&fe(Le=>Le.filter(Te=>Te!==null))})},[]),Ce.length?p.createElement(o,{radius:N>>1,children:Ce.map((Se,Re)=>Se!==null?p.createElement(Ie,{key:Re,active:!1,descriptor:Se.descriptor,suggestions:Se.suggestions}):p.createElement(A,{key:Re},"Loading..."))}):p.createElement(A,null,"No upgrades found")},Ee=await n(({useSubmit:me})=>{me(a());let Ce=new Map;for(let ie of b.workspaces)for(let Z of["dependencies","devDependencies"])for(let Se of ie.manifest[Z].values())b.tryWorkspaceByDescriptor(Se)===null&&(Se.range.startsWith("link:")||Ce.set(Se.descriptorHash,Se));let fe=qe.sortMap(Ce.values(),ie=>G.stringifyDescriptor(ie));return p.createElement(u,{flexDirection:"column"},p.createElement(ce,null),p.createElement(ue,null),p.createElement(he,{dependencies:fe}))},{},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof Ee>"u")return 1;let g=!1;for(let me of b.workspaces)for(let Ce of["dependencies","devDependencies"]){let fe=me.manifest[Ce];for(let ie of fe.values()){let Z=Ee.get(ie.descriptorHash);typeof Z<"u"&&Z!==null&&(fe.set(ie.identHash,G.makeDescriptor(ie,Z)),g=!0)}}return g?await b.installWithNewReport({quiet:this.context.quiet,stdout:this.context.stdout},{cache:T}):0}};var MIt={commands:[xC,bC]},UIt=MIt;var yj={};Vt(yj,{LinkFetcher:()=>av,LinkResolver:()=>lv,PortalFetcher:()=>cv,PortalResolver:()=>uv,default:()=>HIt});Ve();St();var Zf="portal:",$f="link:";var av=class{supports(e,r){return!!e.reference.startsWith($f)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:$f});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:$f}),n=V.isAbsolute(a)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new En(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0,localPath:p}:{packageFs:new Gu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,discardFromLookup:!0}}};Ve();St();var lv=class{supportsDescriptor(e,r){return!!e.range.startsWith($f)}supportsLocator(e,r){return!!e.reference.startsWith($f)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice($f.length);return[G.makeLocator(e,`${$f}${Ae.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){return{...e,version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map}}};Ve();St();var cv=class{supports(e,r){return!!e.reference.startsWith(Zf)}getLocalPath(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Zf});if(V.isAbsolute(a))return a;let n=r.fetcher.getLocalPath(o,r);return n===null?null:V.resolve(n,a)}async fetch(e,r){let{parentLocator:o,path:a}=G.parseFileStyleRange(e.reference,{protocol:Zf}),n=V.isAbsolute(a)?{packageFs:new En(Bt.root),prefixPath:Bt.dot,localPath:Bt.root}:await r.fetcher.fetch(o,r),u=n.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,n.localPath),localPath:Bt.root}:n;n!==u&&n.releaseFs&&n.releaseFs();let A=u.packageFs,p=V.resolve(u.localPath??u.packageFs.getRealPath(),u.prefixPath,a);return n.localPath?{packageFs:new En(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot,localPath:p}:{packageFs:new Gu(p,{baseFs:A}),releaseFs:u.releaseFs,prefixPath:Bt.dot}}};Ve();Ve();St();var uv=class{supportsDescriptor(e,r){return!!e.range.startsWith(Zf)}supportsLocator(e,r){return!!e.reference.startsWith(Zf)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){return G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Zf.length);return[G.makeLocator(e,`${Zf}${Ae.toPortablePath(a)}`)]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let o=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),a=await qe.releaseAfterUseAsync(async()=>await _t.find(o.prefixPath,{baseFs:o.packageFs}),o.releaseFs);return{...e,version:a.version||"0.0.0",languageName:a.languageName||r.project.configuration.get("defaultLanguageName"),linkType:"SOFT",conditions:a.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(a.dependencies),peerDependencies:a.peerDependencies,dependenciesMeta:a.dependenciesMeta,peerDependenciesMeta:a.peerDependenciesMeta,bin:a.bin}}};var _It={fetchers:[av,cv],resolvers:[lv,uv]},HIt=_It;var tG={};Vt(tG,{NodeModulesLinker:()=>Dv,NodeModulesMode:()=>Xj,PnpLooseLinker:()=>Sv,default:()=>n1t});St();Ve();St();St();var Cj=(t,e)=>`${t}@${e}`,Kwe=(t,e)=>{let r=e.indexOf("#"),o=r>=0?e.substring(r+1):e;return Cj(t,o)};var zwe=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),o=e.check||r>=9,a=e.hoistingLimits||new Map,n={check:o,debugLevel:r,hoistingLimits:a,fastLookupPossible:!0},u;n.debugLevel>=0&&(u=Date.now());let A=KIt(t,n),p=!1,h=0;do{let E=Ij(A,[A],new Set([A.locator]),new Map,n);p=E.anotherRoundNeeded||E.isGraphChanged,n.fastLookupPossible=!1,h++}while(p);if(n.debugLevel>=0&&console.log(`hoist time: ${Date.now()-u}ms, rounds: ${h}`),n.debugLevel>=1){let E=Av(A);if(Ij(A,[A],new Set([A.locator]),new Map,n).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${E}, next tree: -${Av(A)}`);let D=Xwe(A);if(D)throw new Error(`${D}, after hoisting finished: -${Av(A)}`)}return n.debugLevel>=2&&console.log(Av(A)),JIt(A)},qIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=n=>{if(!o.has(n)){o.add(n);for(let u of n.hoistedDependencies.values())r.set(u.name,u);for(let u of n.dependencies.values())n.peerNames.has(u.name)||a(u)}};return a(e),r},jIt=t=>{let e=t[t.length-1],r=new Map,o=new Set,a=new Set,n=(u,A)=>{if(o.has(u))return;o.add(u);for(let h of u.hoistedDependencies.values())if(!A.has(h.name)){let E;for(let w of t)E=w.dependencies.get(h.name),E&&r.set(E.name,E)}let p=new Set;for(let h of u.dependencies.values())p.add(h.name);for(let h of u.dependencies.values())u.peerNames.has(h.name)||n(h,p)};return n(e,a),r},Jwe=(t,e)=>{if(e.decoupled)return e;let{name:r,references:o,ident:a,locator:n,dependencies:u,originalDependencies:A,hoistedDependencies:p,peerNames:h,reasons:E,isHoistBorder:w,hoistPriority:D,dependencyKind:b,hoistedFrom:C,hoistedTo:T}=e,N={name:r,references:new Set(o),ident:a,locator:n,dependencies:new Map(u),originalDependencies:new Map(A),hoistedDependencies:new Map(p),peerNames:new Set(h),reasons:new Map(E),decoupled:!0,isHoistBorder:w,hoistPriority:D,dependencyKind:b,hoistedFrom:new Map(C),hoistedTo:new Map(T)},U=N.dependencies.get(r);return U&&U.ident==N.ident&&N.dependencies.set(r,N),t.dependencies.set(N.name,N),N},GIt=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let a of t.dependencies.values())t.peerNames.has(a.name)||r.set(a.name,[a.ident]);let o=Array.from(e.keys());o.sort((a,n)=>{let u=e.get(a),A=e.get(n);if(A.hoistPriority!==u.hoistPriority)return A.hoistPriority-u.hoistPriority;{let p=u.dependents.size+u.peerDependents.size;return A.dependents.size+A.peerDependents.size-p}});for(let a of o){let n=a.substring(0,a.indexOf("@",1)),u=a.substring(n.length+1);if(!t.peerNames.has(n)){let A=r.get(n);A||(A=[],r.set(n,A)),A.indexOf(u)<0&&A.push(u)}}return r},Ej=t=>{let e=new Set,r=(o,a=new Set)=>{if(!a.has(o)){a.add(o);for(let n of o.peerNames)if(!t.peerNames.has(n)){let u=t.dependencies.get(n);u&&!e.has(u)&&r(u,a)}e.add(o)}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||r(o);return e},Ij=(t,e,r,o,a,n=new Set)=>{let u=e[e.length-1];if(n.has(u))return{anotherRoundNeeded:!1,isGraphChanged:!1};n.add(u);let A=zIt(u),p=GIt(u,A),h=t==u?new Map:a.fastLookupPossible?qIt(e):jIt(e),E,w=!1,D=!1,b=new Map(Array.from(p.entries()).map(([T,N])=>[T,N[0]])),C=new Map;do{let T=VIt(t,e,r,h,b,p,o,C,a);T.isGraphChanged&&(D=!0),T.anotherRoundNeeded&&(w=!0),E=!1;for(let[N,U]of p)U.length>1&&!u.dependencies.has(N)&&(b.delete(N),U.shift(),b.set(N,U[0]),E=!0)}while(E);for(let T of u.dependencies.values())if(!u.peerNames.has(T.name)&&!r.has(T.locator)){r.add(T.locator);let N=Ij(t,[...e,T],r,C,a);N.isGraphChanged&&(D=!0),N.anotherRoundNeeded&&(w=!0),r.delete(T.locator)}return{anotherRoundNeeded:w,isGraphChanged:D}},WIt=t=>{for(let[e,r]of t.dependencies)if(!t.peerNames.has(e)&&r.ident!==t.ident)return!0;return!1},YIt=(t,e,r,o,a,n,u,A,{outputReason:p,fastLookupPossible:h})=>{let E,w=null,D=new Set;p&&(E=`${Array.from(e).map(N=>zs(N)).join("\u2192")}`);let b=r[r.length-1],T=!(o.ident===b.ident);if(p&&!T&&(w="- self-reference"),T&&(T=o.dependencyKind!==1,p&&!T&&(w="- workspace")),T&&o.dependencyKind===2&&(T=!WIt(o),p&&!T&&(w="- external soft link with unhoisted dependencies")),T&&(T=!t.peerNames.has(o.name),p&&!T&&(w=`- cannot shadow peer: ${zs(t.originalDependencies.get(o.name).locator)} at ${E}`)),T){let N=!1,U=a.get(o.name);if(N=!U||U.ident===o.ident,p&&!N&&(w=`- filled by: ${zs(U.locator)} at ${E}`),N)for(let J=r.length-1;J>=1;J--){let le=r[J].dependencies.get(o.name);if(le&&le.ident!==o.ident){N=!1;let ce=A.get(b);ce||(ce=new Set,A.set(b,ce)),ce.add(o.name),p&&(w=`- filled by ${zs(le.locator)} at ${r.slice(0,J).map(ue=>zs(ue.locator)).join("\u2192")}`);break}}T=N}if(T&&(T=n.get(o.name)===o.ident,p&&!T&&(w=`- filled by: ${zs(u.get(o.name)[0])} at ${E}`)),T){let N=!0,U=new Set(o.peerNames);for(let J=r.length-1;J>=1;J--){let te=r[J];for(let le of U){if(te.peerNames.has(le)&&te.originalDependencies.has(le))continue;let ce=te.dependencies.get(le);ce&&t.dependencies.get(le)!==ce&&(J===r.length-1?D.add(ce):(D=null,N=!1,p&&(w=`- peer dependency ${zs(ce.locator)} from parent ${zs(te.locator)} was not hoisted to ${E}`))),U.delete(le)}if(!N)break}T=N}if(T&&!h)for(let N of o.hoistedDependencies.values()){let U=a.get(N.name)||t.dependencies.get(N.name);if(!U||N.ident!==U.ident){T=!1,p&&(w=`- previously hoisted dependency mismatch, needed: ${zs(N.locator)}, available: ${zs(U?.locator)}`);break}}return D!==null&&D.size>0?{isHoistable:2,dependsOn:D,reason:w}:{isHoistable:T?0:1,reason:w}},KQ=t=>`${t.name}@${t.locator}`,VIt=(t,e,r,o,a,n,u,A,p)=>{let h=e[e.length-1],E=new Set,w=!1,D=!1,b=(U,J,te,le,ce)=>{if(E.has(le))return;let ue=[...J,KQ(le)],Ie=[...te,KQ(le)],he=new Map,De=new Map;for(let fe of Ej(le)){let ie=YIt(h,r,[h,...U,le],fe,o,a,n,A,{outputReason:p.debugLevel>=2,fastLookupPossible:p.fastLookupPossible});if(De.set(fe,ie),ie.isHoistable===2)for(let Z of ie.dependsOn){let Se=he.get(Z.name)||new Set;Se.add(fe.name),he.set(Z.name,Se)}}let Ee=new Set,g=(fe,ie,Z)=>{if(!Ee.has(fe)){Ee.add(fe),De.set(fe,{isHoistable:1,reason:Z});for(let Se of he.get(fe.name)||[])g(le.dependencies.get(Se),ie,p.debugLevel>=2?`- peer dependency ${zs(fe.locator)} from parent ${zs(le.locator)} was not hoisted`:"")}};for(let[fe,ie]of De)ie.isHoistable===1&&g(fe,ie,ie.reason);let me=!1;for(let fe of De.keys())if(!Ee.has(fe)){D=!0;let ie=u.get(le);ie&&ie.has(fe.name)&&(w=!0),me=!0,le.dependencies.delete(fe.name),le.hoistedDependencies.set(fe.name,fe),le.reasons.delete(fe.name);let Z=h.dependencies.get(fe.name);if(p.debugLevel>=2){let Se=Array.from(J).concat([le.locator]).map(ht=>zs(ht)).join("\u2192"),Re=h.hoistedFrom.get(fe.name);Re||(Re=[],h.hoistedFrom.set(fe.name,Re)),Re.push(Se),le.hoistedTo.set(fe.name,Array.from(e).map(ht=>zs(ht.locator)).join("\u2192"))}if(!Z)h.ident!==fe.ident&&(h.dependencies.set(fe.name,fe),ce.add(fe));else for(let Se of fe.references)Z.references.add(Se)}if(le.dependencyKind===2&&me&&(w=!0),p.check){let fe=Xwe(t);if(fe)throw new Error(`${fe}, after hoisting dependencies of ${[h,...U,le].map(ie=>zs(ie.locator)).join("\u2192")}: -${Av(t)}`)}let Ce=Ej(le);for(let fe of Ce)if(Ee.has(fe)){let ie=De.get(fe);if((a.get(fe.name)===fe.ident||!le.reasons.has(fe.name))&&ie.isHoistable!==0&&le.reasons.set(fe.name,ie.reason),!fe.isHoistBorder&&Ie.indexOf(KQ(fe))<0){E.add(le);let Se=Jwe(le,fe);b([...U,le],ue,Ie,Se,T),E.delete(le)}}},C,T=new Set(Ej(h)),N=Array.from(e).map(U=>KQ(U));do{C=T,T=new Set;for(let U of C){if(U.locator===h.locator||U.isHoistBorder)continue;let J=Jwe(h,U);b([],Array.from(r),N,J,T)}}while(T.size>0);return{anotherRoundNeeded:w,isGraphChanged:D}},Xwe=t=>{let e=[],r=new Set,o=new Set,a=(n,u,A)=>{if(r.has(n)||(r.add(n),o.has(n)))return;let p=new Map(u);for(let h of n.dependencies.values())n.peerNames.has(h.name)||p.set(h.name,h);for(let h of n.originalDependencies.values()){let E=p.get(h.name),w=()=>`${Array.from(o).concat([n]).map(D=>zs(D.locator)).join("\u2192")}`;if(n.peerNames.has(h.name)){let D=u.get(h.name);(D!==E||!D||D.ident!==h.ident)&&e.push(`${w()} - broken peer promise: expected ${h.ident} but found ${D&&D.ident}`)}else{let D=A.hoistedFrom.get(n.name),b=n.hoistedTo.get(h.name),C=`${D?` hoisted from ${D.join(", ")}`:""}`,T=`${b?` hoisted to ${b}`:""}`,N=`${w()}${C}`;E?E.ident!==h.ident&&e.push(`${N} - broken require promise for ${h.name}${T}: expected ${h.ident}, but found: ${E.ident}`):e.push(`${N} - broken require promise: no required dependency ${h.name}${T} found`)}}o.add(n);for(let h of n.dependencies.values())n.peerNames.has(h.name)||a(h,p,n);o.delete(n)};return a(t,t.dependencies,t),e.join(` -`)},KIt=(t,e)=>{let{identName:r,name:o,reference:a,peerNames:n}=t,u={name:o,references:new Set([a]),locator:Cj(r,a),ident:Kwe(r,a),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(n),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,dependencyKind:1,hoistedFrom:new Map,hoistedTo:new Map},A=new Map([[t,u]]),p=(h,E)=>{let w=A.get(h),D=!!w;if(!w){let{name:b,identName:C,reference:T,peerNames:N,hoistPriority:U,dependencyKind:J}=h,te=e.hoistingLimits.get(E.locator);w={name:b,references:new Set([T]),locator:Cj(C,T),ident:Kwe(C,T),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(N),reasons:new Map,decoupled:!0,isHoistBorder:te?te.has(b):!1,hoistPriority:U||0,dependencyKind:J||0,hoistedFrom:new Map,hoistedTo:new Map},A.set(h,w)}if(E.dependencies.set(h.name,w),E.originalDependencies.set(h.name,w),D){let b=new Set,C=T=>{if(!b.has(T)){b.add(T),T.decoupled=!1;for(let N of T.dependencies.values())T.peerNames.has(N.name)||C(N)}};C(w)}else for(let b of h.dependencies)p(b,w)};for(let h of t.dependencies)p(h,u);return u},wj=t=>t.substring(0,t.indexOf("@",1)),JIt=t=>{let e={name:t.name,identName:wj(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),o=(a,n,u)=>{let A=r.has(a),p;if(n===a)p=u;else{let{name:h,references:E,locator:w}=a;p={name:h,identName:wj(w),references:E,dependencies:new Set}}if(u.dependencies.add(p),!A){r.add(a);for(let h of a.dependencies.values())a.peerNames.has(h.name)||o(h,a,p);r.delete(a)}};for(let a of t.dependencies.values())o(a,t,e);return e},zIt=t=>{let e=new Map,r=new Set([t]),o=u=>`${u.name}@${u.ident}`,a=u=>{let A=o(u),p=e.get(A);return p||(p={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(A,p)),p},n=(u,A)=>{let p=!!r.has(A);if(a(A).dependents.add(u.ident),!p){r.add(A);for(let E of A.dependencies.values()){let w=a(E);w.hoistPriority=Math.max(w.hoistPriority,E.hoistPriority),A.peerNames.has(E.name)?w.peerDependents.add(A.ident):n(A,E)}}};for(let u of t.dependencies.values())t.peerNames.has(u.name)||n(t,u);return e},zs=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let o=t.substring(e+1);if(o==="workspace:.")return".";if(o){let a=(o.indexOf("#")>0?o.split("#")[1]:o).replace("npm:","");return o.startsWith("virtual")&&(r=`v:${r}`),a.startsWith("workspace")&&(r=`w:${r}`,a=""),`${r}${a?`@${a}`:""}`}else return`${r}`};var Av=t=>{let e=0,r=(a,n,u="")=>{if(e>5e4||n.has(a))return"";e++;let A=Array.from(a.dependencies.values()).sort((h,E)=>h.name===E.name?0:h.name>E.name?1:-1),p="";n.add(a);for(let h=0;h":"")+(D!==E.name?`a:${E.name}:`:"")+zs(E.locator)+(w?` ${w}`:"")} -`,p+=r(E,n,`${u}${h5e4?` -Tree is too large, part of the tree has been dunped -`:"")};var fv=(o=>(o.WORKSPACES="workspaces",o.DEPENDENCIES="dependencies",o.NONE="none",o))(fv||{}),Zwe="node_modules",jh="$wsroot$";var pv=(t,e)=>{let{packageTree:r,hoistingLimits:o,errors:a,preserveSymlinksRequired:n}=ZIt(t,e),u=null;if(a.length===0){let A=zwe(r,{hoistingLimits:o});u=ewt(t,A,e)}return{tree:u,errors:a,preserveSymlinksRequired:n}},yA=t=>`${t.name}@${t.reference}`,vj=t=>{let e=new Map;for(let[r,o]of t.entries())if(!o.dirList){let a=e.get(o.locator);a||(a={target:o.target,linkType:o.linkType,locations:[],aliases:o.aliases},e.set(o.locator,a)),a.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((o,a)=>{let n=o.split(V.delimiter).length,u=a.split(V.delimiter).length;return a===o?0:n!==u?u-n:a>o?1:-1});return e},$we=(t,e)=>{let r=G.isVirtualLocator(t)?G.devirtualizeLocator(t):t,o=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e;return G.areLocatorsEqual(r,o)},Bj=(t,e,r,o)=>{if(t.linkType!=="SOFT")return!1;let a=Ae.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return V.contains(o,a)===null},XIt=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let o=Ae.toPortablePath(e.packageLocation.slice(0,-1)),a=new Map,n={children:new Map},u=t.getDependencyTreeRoots(),A=new Map,p=new Set,h=(D,b)=>{let C=yA(D);if(p.has(C))return;p.add(C);let T=t.getPackageInformation(D);if(T){let N=b?yA(b):"";if(yA(D)!==N&&T.linkType==="SOFT"&&!D.reference.startsWith("link:")&&!Bj(T,D,t,o)){let U=e1e(T,D,t);(!A.get(U)||D.reference.startsWith("workspace:"))&&A.set(U,D)}for(let[U,J]of T.packageDependencies)J!==null&&(T.packagePeers.has(U)||h(t.getLocator(U,J),D))}};for(let D of u)h(D,null);let E=o.split(V.sep);for(let D of A.values()){let b=t.getPackageInformation(D),T=Ae.toPortablePath(b.packageLocation.slice(0,-1)).split(V.sep).slice(E.length),N=n;for(let U of T){let J=N.children.get(U);J||(J={children:new Map},N.children.set(U,J)),N=J}N.workspaceLocator=D}let w=(D,b)=>{if(D.workspaceLocator){let C=yA(b),T=a.get(C);T||(T=new Set,a.set(C,T)),T.add(D.workspaceLocator)}for(let C of D.children.values())w(C,D.workspaceLocator||b)};for(let D of n.children.values())w(D,n.workspaceLocator);return a},ZIt=(t,e)=>{let r=[],o=!1,a=new Map,n=XIt(t),u=t.getPackageInformation(t.topLevel);if(u===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let A=t.findPackageLocator(u.packageLocation);if(A===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let p=Ae.toPortablePath(u.packageLocation.slice(0,-1)),h={name:A.name,identName:A.name,reference:A.reference,peerNames:u.packagePeers,dependencies:new Set,dependencyKind:1},E=new Map,w=(b,C)=>`${yA(C)}:${b}`,D=(b,C,T,N,U,J,te,le)=>{let ce=w(b,T),ue=E.get(ce),Ie=!!ue;!Ie&&T.name===A.name&&T.reference===A.reference&&(ue=h,E.set(ce,h));let he=Bj(C,T,t,p);if(!ue){let fe=0;he?fe=2:C.linkType==="SOFT"&&T.name.endsWith(jh)&&(fe=1),ue={name:b,identName:T.name,reference:T.reference,dependencies:new Set,peerNames:fe===1?new Set:C.packagePeers,dependencyKind:fe},E.set(ce,ue)}let De;if(he?De=2:U.linkType==="SOFT"?De=1:De=0,ue.hoistPriority=Math.max(ue.hoistPriority||0,De),le&&!he){let fe=yA({name:N.identName,reference:N.reference}),ie=a.get(fe)||new Set;a.set(fe,ie),ie.add(ue.name)}let Ee=new Map(C.packageDependencies);if(e.project){let fe=e.project.workspacesByCwd.get(Ae.toPortablePath(C.packageLocation.slice(0,-1)));if(fe){let ie=new Set([...Array.from(fe.manifest.peerDependencies.values(),Z=>G.stringifyIdent(Z)),...Array.from(fe.manifest.peerDependenciesMeta.keys())]);for(let Z of ie)Ee.has(Z)||(Ee.set(Z,J.get(Z)||null),ue.peerNames.add(Z))}}let g=yA({name:T.name.replace(jh,""),reference:T.reference}),me=n.get(g);if(me)for(let fe of me)Ee.set(`${fe.name}${jh}`,fe.reference);(C!==U||C.linkType!=="SOFT"||!he&&(!e.selfReferencesByCwd||e.selfReferencesByCwd.get(te)))&&N.dependencies.add(ue);let Ce=T!==A&&C.linkType==="SOFT"&&!T.name.endsWith(jh)&&!he;if(!Ie&&!Ce){let fe=new Map;for(let[ie,Z]of Ee)if(Z!==null){let Se=t.getLocator(ie,Z),Re=t.getLocator(ie.replace(jh,""),Z),ht=t.getPackageInformation(Re);if(ht===null)throw new Error("Assertion failed: Expected the package to have been registered");let q=Bj(ht,Se,t,p);if(e.validateExternalSoftLinks&&e.project&&q){ht.packageDependencies.size>0&&(o=!0);for(let[Ke,xe]of ht.packageDependencies)if(xe!==null){let tt=G.parseLocator(Array.isArray(xe)?`${xe[0]}@${xe[1]}`:`${Ke}@${xe}`);if(yA(tt)!==yA(Se)){let He=Ee.get(Ke);if(He){let x=G.parseLocator(Array.isArray(He)?`${He[0]}@${He[1]}`:`${Ke}@${He}`);$we(x,tt)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(Se.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${T.name}@${T.reference}`))} dependency ${G.prettyLocator(e.project.configuration,tt)} conflicts with parent dependency ${G.prettyLocator(e.project.configuration,x)}`})}else{let x=fe.get(Ke);if(x){let I=x.target,P=G.parseLocator(Array.isArray(I)?`${I[0]}@${I[1]}`:`${Ke}@${I}`);$we(P,tt)||r.push({messageName:71,text:`Cannot link ${G.prettyIdent(e.project.configuration,G.parseIdent(Se.name))} into ${G.prettyLocator(e.project.configuration,G.parseLocator(`${T.name}@${T.reference}`))} dependency ${G.prettyLocator(e.project.configuration,tt)} conflicts with dependency ${G.prettyLocator(e.project.configuration,P)} from sibling portal ${G.prettyIdent(e.project.configuration,G.parseIdent(x.portal.name))}`})}else fe.set(Ke,{target:tt.reference,portal:Se})}}}}let nt=e.hoistingLimitsByCwd?.get(te),Le=q?te:V.relative(p,Ae.toPortablePath(ht.packageLocation))||Bt.dot,Te=e.hoistingLimitsByCwd?.get(Le);D(ie,ht,Se,ue,C,Ee,Le,nt==="dependencies"||Te==="dependencies"||Te==="workspaces")}}};return D(A.name,u,A,h,u,u.packageDependencies,Bt.dot,!1),{packageTree:h,hoistingLimits:a,errors:r,preserveSymlinksRequired:o}};function e1e(t,e,r){let o=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return Ae.toPortablePath(o||t.packageLocation)}function $It(t,e,r){let o=e.getLocator(t.name.replace(jh,""),t.reference),a=e.getPackageInformation(o);if(a===null)throw new Error("Assertion failed: Expected the package to be registered");return r.pnpifyFs?{linkType:"SOFT",target:Ae.toPortablePath(a.packageLocation)}:{linkType:a.linkType,target:e1e(a,t,e)}}var ewt=(t,e,r)=>{let o=new Map,a=(E,w,D)=>{let{linkType:b,target:C}=$It(E,t,r);return{locator:yA(E),nodePath:w,target:C,linkType:b,aliases:D}},n=E=>{let[w,D]=E.split("/");return D?{scope:w,name:D}:{scope:null,name:w}},u=new Set,A=(E,w,D)=>{if(u.has(E))return;u.add(E);let b=Array.from(E.references).sort().join("#");for(let C of E.dependencies){let T=Array.from(C.references).sort().join("#");if(C.identName===E.identName.replace(jh,"")&&T===b)continue;let N=Array.from(C.references).sort(),U={name:C.identName,reference:N[0]},{name:J,scope:te}=n(C.name),le=te?[te,J]:[J],ce=V.join(w,Zwe),ue=V.join(ce,...le),Ie=`${D}/${U.name}`,he=a(U,D,N.slice(1)),De=!1;if(he.linkType==="SOFT"&&r.project){let Ee=r.project.workspacesByCwd.get(he.target.slice(0,-1));De=!!(Ee&&!Ee.manifest.name)}if(!C.name.endsWith(jh)&&!De){let Ee=o.get(ue);if(Ee){if(Ee.dirList)throw new Error(`Assertion failed: ${ue} cannot merge dir node with leaf node`);{let Ce=G.parseLocator(Ee.locator),fe=G.parseLocator(he.locator);if(Ee.linkType!==he.linkType)throw new Error(`Assertion failed: ${ue} cannot merge nodes with different link types ${Ee.nodePath}/${G.stringifyLocator(Ce)} and ${D}/${G.stringifyLocator(fe)}`);if(Ce.identHash!==fe.identHash)throw new Error(`Assertion failed: ${ue} cannot merge nodes with different idents ${Ee.nodePath}/${G.stringifyLocator(Ce)} and ${D}/s${G.stringifyLocator(fe)}`);he.aliases=[...he.aliases,...Ee.aliases,G.parseLocator(Ee.locator).reference]}}o.set(ue,he);let g=ue.split("/"),me=g.indexOf(Zwe);for(let Ce=g.length-1;me>=0&&Ce>me;Ce--){let fe=Ae.toPortablePath(g.slice(0,Ce).join(V.sep)),ie=g[Ce],Z=o.get(fe);if(!Z)o.set(fe,{dirList:new Set([ie])});else if(Z.dirList){if(Z.dirList.has(ie))break;Z.dirList.add(ie)}}}A(C,he.linkType==="SOFT"?he.target:ue,Ie)}},p=a({name:e.name,reference:Array.from(e.references)[0]},"",[]),h=p.target;return o.set(h,p),A(e,h,""),o};Ve();Ve();St();St();sA();Ol();var jj={};Vt(jj,{PnpInstaller:()=>pd,PnpLinker:()=>Yh,UnplugCommand:()=>QC,default:()=>kwt,getPnpPath:()=>Vh,jsInstallUtils:()=>CA,pnpUtils:()=>vv,quotePathIfNeeded:()=>M1e});St();var O1e=ve("url");Ve();Ve();St();St();var t1e={DEFAULT:{collapsed:!1,next:{"*":"DEFAULT"}},TOP_LEVEL:{collapsed:!1,next:{fallbackExclusionList:"FALLBACK_EXCLUSION_LIST",packageRegistryData:"PACKAGE_REGISTRY_DATA","*":"DEFAULT"}},FALLBACK_EXCLUSION_LIST:{collapsed:!1,next:{"*":"FALLBACK_EXCLUSION_ENTRIES"}},FALLBACK_EXCLUSION_ENTRIES:{collapsed:!0,next:{"*":"FALLBACK_EXCLUSION_DATA"}},FALLBACK_EXCLUSION_DATA:{collapsed:!0,next:{"*":"DEFAULT"}},PACKAGE_REGISTRY_DATA:{collapsed:!1,next:{"*":"PACKAGE_REGISTRY_ENTRIES"}},PACKAGE_REGISTRY_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_STORE_DATA"}},PACKAGE_STORE_DATA:{collapsed:!1,next:{"*":"PACKAGE_STORE_ENTRIES"}},PACKAGE_STORE_ENTRIES:{collapsed:!0,next:{"*":"PACKAGE_INFORMATION_DATA"}},PACKAGE_INFORMATION_DATA:{collapsed:!1,next:{packageDependencies:"PACKAGE_DEPENDENCIES","*":"DEFAULT"}},PACKAGE_DEPENDENCIES:{collapsed:!1,next:{"*":"PACKAGE_DEPENDENCY"}},PACKAGE_DEPENDENCY:{collapsed:!0,next:{"*":"DEFAULT"}}};function twt(t,e,r){let o="";o+="[";for(let a=0,n=t.length;a"u"||(A!==0&&(a+=", "),a+=JSON.stringify(p),a+=": ",a+=JQ(p,h,e,r).replace(/^ +/g,""),A+=1)}return a+="}",a}function iwt(t,e,r){let o=Object.keys(t),a=`${r} `,n="";n+=r,n+=`{ -`;let u=0;for(let A=0,p=o.length;A"u"||(u!==0&&(n+=",",n+=` -`),n+=a,n+=JSON.stringify(h),n+=": ",n+=JQ(h,E,e,a).replace(/^ +/g,""),u+=1)}return u!==0&&(n+=` -`),n+=r,n+="}",n}function JQ(t,e,r,o){let{next:a}=t1e[r],n=a[t]||a["*"];return r1e(e,n,o)}function r1e(t,e,r){let{collapsed:o}=t1e[e];return Array.isArray(t)?o?twt(t,e,r):rwt(t,e,r):typeof t=="object"&&t!==null?o?nwt(t,e,r):iwt(t,e,r):JSON.stringify(t)}function n1e(t){return r1e(t,"TOP_LEVEL","")}function hv(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let o=[];for(let n of e)o.push(r.map(u=>n(u)));let a=r.map((n,u)=>u);return a.sort((n,u)=>{for(let A of o){let p=A[n]A[u]?1:0;if(p!==0)return p}return 0}),a.map(n=>r[n])}function swt(t){let e=new Map,r=hv(t.fallbackExclusionList||[],[({name:o,reference:a})=>o,({name:o,reference:a})=>a]);for(let{name:o,reference:a}of r){let n=e.get(o);typeof n>"u"&&e.set(o,n=new Set),n.add(a)}return Array.from(e).map(([o,a])=>[o,Array.from(a)])}function owt(t){return hv(t.fallbackPool||[],([e])=>e)}function awt(t){let e=[];for(let[r,o]of hv(t.packageRegistry,([a])=>a===null?"0":`1${a}`)){let a=[];e.push([r,a]);for(let[n,{packageLocation:u,packageDependencies:A,packagePeers:p,linkType:h,discardFromLookup:E}]of hv(o,([w])=>w===null?"0":`1${w}`)){let w=[];r!==null&&n!==null&&!A.has(r)&&w.push([r,n]);for(let[C,T]of hv(A.entries(),([N])=>N))w.push([C,T]);let D=p&&p.size>0?Array.from(p):void 0,b=E||void 0;a.push([n,{packageLocation:u,packageDependencies:w,packagePeers:D,linkType:h,discardFromLookup:b}])}}return e}function gv(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:swt(t),fallbackPool:owt(t),packageRegistryData:awt(t)}}var o1e=et(s1e());function a1e(t,e){return[t?`${t} -`:"",`/* eslint-disable */ -`,`// @ts-nocheck -`,`"use strict"; -`,` -`,e,` -`,(0,o1e.default)()].join("")}function lwt(t){return JSON.stringify(t,null,2)}function cwt(t){return`'${t.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\n/g,`\\ -`)}'`}function uwt(t){return[`const RAW_RUNTIME_STATE = -`,`${cwt(n1e(t))}; - -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,` return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); -`,`} -`].join("")}function Awt(){return[`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,` const fs = require('fs'); -`,` const path = require('path'); -`,` const pnpDataFilepath = path.resolve(__dirname, ${JSON.stringify(mr.pnpData)}); -`,` return hydrateRuntimeState(JSON.parse(fs.readFileSync(pnpDataFilepath, 'utf8')), {basePath: basePath || __dirname}); -`,`} -`].join("")}function l1e(t){let e=gv(t),r=uwt(e);return a1e(t.shebang,r)}function c1e(t){let e=gv(t),r=Awt(),o=a1e(t.shebang,r);return{dataFile:lwt(e),loaderFile:o}}St();function Sj(t,{basePath:e}){let r=Ae.toPortablePath(e),o=V.resolve(r),a=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,n=new Map,u=new Map(t.packageRegistryData.map(([w,D])=>[w,new Map(D.map(([b,C])=>{if(w===null!=(b===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let T=C.discardFromLookup??!1,N={name:w,reference:b},U=n.get(C.packageLocation);U?(U.discardFromLookup=U.discardFromLookup&&T,T||(U.locator=N)):n.set(C.packageLocation,{locator:N,discardFromLookup:T});let J=null;return[b,{packageDependencies:new Map(C.packageDependencies),packagePeers:new Set(C.packagePeers),linkType:C.linkType,discardFromLookup:T,get packageLocation(){return J||(J=V.join(o,C.packageLocation))}}]}))])),A=new Map(t.fallbackExclusionList.map(([w,D])=>[w,new Set(D)])),p=new Map(t.fallbackPool),h=t.dependencyTreeRoots,E=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:h,enableTopLevelFallback:E,fallbackExclusionList:A,fallbackPool:p,ignorePattern:a,packageLocatorsByLocations:n,packageRegistry:u}}St();St();var tp=ve("module"),fd=ve("url"),Nj=ve("util");var Qo=ve("url");var p1e=et(ve("assert"));var Pj=Array.isArray,dv=JSON.stringify,mv=Object.getOwnPropertyNames,Ad=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),xj=(t,e)=>RegExp.prototype.exec.call(t,e),bj=(t,...e)=>RegExp.prototype[Symbol.replace].apply(t,e),Gh=(t,...e)=>String.prototype.endsWith.apply(t,e),kj=(t,...e)=>String.prototype.includes.apply(t,e),Qj=(t,...e)=>String.prototype.lastIndexOf.apply(t,e),yv=(t,...e)=>String.prototype.indexOf.apply(t,e),u1e=(t,...e)=>String.prototype.replace.apply(t,e),Wh=(t,...e)=>String.prototype.slice.apply(t,e),EA=(t,...e)=>String.prototype.startsWith.apply(t,e),A1e=Map,f1e=JSON.parse;function Ev(t,e,r){return class extends r{constructor(...o){super(e(...o)),this.code=t,this.name=`${r.name} [${t}]`}}}var h1e=Ev("ERR_PACKAGE_IMPORT_NOT_DEFINED",(t,e,r)=>`Package import specifier "${t}" is not defined${e?` in package ${e}package.json`:""} imported from ${r}`,TypeError),Fj=Ev("ERR_INVALID_MODULE_SPECIFIER",(t,e,r=void 0)=>`Invalid module "${t}" ${e}${r?` imported from ${r}`:""}`,TypeError),g1e=Ev("ERR_INVALID_PACKAGE_TARGET",(t,e,r,o=!1,a=void 0)=>{let n=typeof r=="string"&&!o&&r.length&&!EA(r,"./");return e==="."?((0,p1e.default)(o===!1),`Invalid "exports" main target ${dv(r)} defined in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`):`Invalid "${o?"imports":"exports"}" target ${dv(r)} defined for '${e}' in the package config ${t}package.json${a?` imported from ${a}`:""}${n?'; targets must start with "./"':""}`},Error),Cv=Ev("ERR_INVALID_PACKAGE_CONFIG",(t,e,r)=>`Invalid package config ${t}${e?` while importing ${e}`:""}${r?`. ${r}`:""}`,Error),d1e=Ev("ERR_PACKAGE_PATH_NOT_EXPORTED",(t,e,r=void 0)=>e==="."?`No "exports" main defined in ${t}package.json${r?` imported from ${r}`:""}`:`Package subpath '${e}' is not defined by "exports" in ${t}package.json${r?` imported from ${r}`:""}`,Error);var XQ=ve("url");function m1e(t,e){let r=Object.create(null);for(let o=0;oe):t+e}Iv(r,t,o,u,a)}xj(E1e,Wh(t,2))!==null&&Iv(r,t,o,u,a);let p=new URL(t,o),h=p.pathname,E=new URL(".",o).pathname;if(EA(h,E)||Iv(r,t,o,u,a),e==="")return p;if(xj(E1e,e)!==null){let w=n?u1e(r,"*",()=>e):r+e;hwt(w,o,u,a)}return n?new URL(bj(C1e,p.href,()=>e)):new URL(e,p)}function dwt(t){let e=+t;return`${e}`!==t?!1:e>=0&&e<4294967295}function kC(t,e,r,o,a,n,u,A){if(typeof e=="string")return gwt(e,r,o,t,a,n,u,A);if(Pj(e)){if(e.length===0)return null;let p;for(let h=0;hn?-1:n>a||r===-1?1:o===-1||t.length>e.length?-1:e.length>t.length?1:0}function mwt(t,e,r){if(typeof t=="string"||Pj(t))return!0;if(typeof t!="object"||t===null)return!1;let o=mv(t),a=!1,n=0;for(let u=0;u=h.length&&Gh(e,w)&&w1e(n,h)===1&&Qj(h,"*")===E&&(n=h,u=Wh(e,E,e.length-w.length))}}if(n){let p=r[n],h=kC(t,p,u,n,o,!0,!1,a);return h==null&&Rj(e,t,o),h}Rj(e,t,o)}function v1e({name:t,base:e,conditions:r,readFileSyncFn:o}){if(t==="#"||EA(t,"#/")||Gh(t,"/")){let u="is not a valid internal imports specifier name";throw new Fj(t,u,(0,Qo.fileURLToPath)(e))}let a,n=y1e(e,o);if(n.exists){a=(0,Qo.pathToFileURL)(n.pjsonPath);let u=n.imports;if(u)if(Ad(u,t)&&!kj(t,"*")){let A=kC(a,u[t],"",t,e,!1,!0,r);if(A!=null)return A}else{let A="",p,h=mv(u);for(let E=0;E=w.length&&Gh(t,b)&&w1e(A,w)===1&&Qj(w,"*")===D&&(A=w,p=Wh(t,D,t.length-b.length))}}if(A){let E=u[A],w=kC(a,E,p,A,e,!0,!0,r);if(w!=null)return w}}}pwt(t,a,e)}St();var Ewt=new Set(["BUILTIN_NODE_RESOLUTION_FAILED","MISSING_DEPENDENCY","MISSING_PEER_DEPENDENCY","QUALIFIED_PATH_RESOLUTION_FAILED","UNDECLARED_DEPENDENCY"]);function ts(t,e,r={},o){o??=Ewt.has(t)?"MODULE_NOT_FOUND":t;let a={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:{...a,value:o},pnpCode:{...a,value:t},data:{...a,value:r}})}function pu(t){return Ae.normalize(Ae.fromPortablePath(t))}var x1e=et(S1e());function b1e(t){return Cwt(),Lj[t]}var Lj;function Cwt(){Lj||(Lj={"--conditions":[],...P1e(Iwt()),...P1e(process.execArgv)})}function P1e(t){return(0,x1e.default)({"--conditions":[String],"-C":"--conditions"},{argv:t,permissive:!0})}function Iwt(){let t=[],e=wwt(process.env.NODE_OPTIONS||"",t);return t.length,e}function wwt(t,e){let r=[],o=!1,a=!0;for(let n=0;nparseInt(t,10)),k1e=Ha>19||Ha===19&&ep>=2||Ha===18&&ep>=13,tzt=Ha===20&&ep<6||Ha===19&&ep>=3,rzt=Ha>19||Ha===19&&ep>=6,nzt=Ha>=21||Ha===20&&ep>=10||Ha===18&&ep>=19,izt=Ha>=21||Ha===20&&ep>=10||Ha===18&&ep>=20,szt=Ha>=22;function Q1e(t){if(process.env.WATCH_REPORT_DEPENDENCIES&&process.send)if(t=t.map(e=>Ae.fromPortablePath(qs.resolveVirtual(Ae.toPortablePath(e)))),k1e)process.send({"watch:require":t});else for(let e of t)process.send({"watch:require":e})}function Oj(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,o=Number(process.env.PNP_DEBUG_LEVEL),a=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,n=/^(\/|\.{1,2}(\/|$))/,u=/\/$/,A=/^\.{0,2}\//,p={name:null,reference:null},h=[],E=new Set;if(t.enableTopLevelFallback===!0&&h.push(p),e.compatibilityMode!==!1)for(let Le of["react-scripts","gatsby"]){let Te=t.packageRegistry.get(Le);if(Te)for(let ke of Te.keys()){if(ke===null)throw new Error("Assertion failed: This reference shouldn't be null");h.push({name:Le,reference:ke})}}let{ignorePattern:w,packageRegistry:D,packageLocatorsByLocations:b}=t;function C(Le,Te){return{fn:Le,args:Te,error:null,result:null}}function T(Le){let Te=process.stderr?.hasColors?.()??process.stdout.isTTY,ke=(tt,He)=>`\x1B[${tt}m${He}\x1B[0m`,Ke=Le.error;console.error(Ke?ke("31;1",`\u2716 ${Le.error?.message.replace(/\n.*/s,"")}`):ke("33;1","\u203C Resolution")),Le.args.length>0&&console.error();for(let tt of Le.args)console.error(` ${ke("37;1","In \u2190")} ${(0,Nj.inspect)(tt,{colors:Te,compact:!0})}`);Le.result&&(console.error(),console.error(` ${ke("37;1","Out \u2192")} ${(0,Nj.inspect)(Le.result,{colors:Te,compact:!0})}`));let xe=new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2)??[];if(xe.length>0){console.error();for(let tt of xe)console.error(` ${ke("38;5;244",tt)}`)}console.error()}function N(Le,Te){if(e.allowDebug===!1)return Te;if(Number.isFinite(o)){if(o>=2)return(...ke)=>{let Ke=C(Le,ke);try{return Ke.result=Te(...ke)}catch(xe){throw Ke.error=xe}finally{T(Ke)}};if(o>=1)return(...ke)=>{try{return Te(...ke)}catch(Ke){let xe=C(Le,ke);throw xe.error=Ke,T(xe),Ke}}}return Te}function U(Le){let Te=g(Le);if(!Te)throw ts("INTERNAL","Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return Te}function J(Le){if(Le.name===null)return!0;for(let Te of t.dependencyTreeRoots)if(Te.name===Le.name&&Te.reference===Le.reference)return!0;return!1}let te=new Set(["node","require",...b1e("--conditions")]);function le(Le,Te=te,ke){let Ke=fe(V.join(Le,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(Ke===null)throw ts("INTERNAL",`The locator that owns the "${Le}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:xe}=U(Ke),tt=V.join(xe,mr.manifest);if(!e.fakeFs.existsSync(tt))return null;let He=JSON.parse(e.fakeFs.readFileSync(tt,"utf8"));if(He.exports==null)return null;let x=V.contains(xe,Le);if(x===null)throw ts("INTERNAL","unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");x!=="."&&!A.test(x)&&(x=`./${x}`);try{let I=B1e({packageJSONUrl:(0,fd.pathToFileURL)(Ae.fromPortablePath(tt)),packageSubpath:x,exports:He.exports,base:ke?(0,fd.pathToFileURL)(Ae.fromPortablePath(ke)):null,conditions:Te});return Ae.toPortablePath((0,fd.fileURLToPath)(I))}catch(I){throw ts("EXPORTS_RESOLUTION_FAILED",I.message,{unqualifiedPath:pu(Le),locator:Ke,pkgJson:He,subpath:pu(x),conditions:Te},I.code)}}function ce(Le,Te,{extensions:ke}){let Ke;try{Te.push(Le),Ke=e.fakeFs.statSync(Le)}catch{}if(Ke&&!Ke.isDirectory())return e.fakeFs.realpathSync(Le);if(Ke&&Ke.isDirectory()){let xe;try{xe=JSON.parse(e.fakeFs.readFileSync(V.join(Le,mr.manifest),"utf8"))}catch{}let tt;if(xe&&xe.main&&(tt=V.resolve(Le,xe.main)),tt&&tt!==Le){let He=ce(tt,Te,{extensions:ke});if(He!==null)return He}}for(let xe=0,tt=ke.length;xe{let x=JSON.stringify(He.name);if(Ke.has(x))return;Ke.add(x);let I=me(He);for(let P of I)if(U(P).packagePeers.has(Le))xe(P);else{let R=ke.get(P.name);typeof R>"u"&&ke.set(P.name,R=new Set),R.add(P.reference)}};xe(Te);let tt=[];for(let He of[...ke.keys()].sort())for(let x of[...ke.get(He)].sort())tt.push({name:He,reference:x});return tt}function fe(Le,{resolveIgnored:Te=!1,includeDiscardFromLookup:ke=!1}={}){if(he(Le)&&!Te)return null;let Ke=V.relative(t.basePath,Le);Ke.match(n)||(Ke=`./${Ke}`),Ke.endsWith("/")||(Ke=`${Ke}/`);do{let xe=b.get(Ke);if(typeof xe>"u"||xe.discardFromLookup&&!ke){Ke=Ke.substring(0,Ke.lastIndexOf("/",Ke.length-2)+1);continue}return xe.locator}while(Ke!=="");return null}function ie(Le){try{return e.fakeFs.readFileSync(Ae.toPortablePath(Le),"utf8")}catch(Te){if(Te.code==="ENOENT")return;throw Te}}function Z(Le,Te,{considerBuiltins:ke=!0}={}){if(Le.startsWith("#"))throw new Error("resolveToUnqualified can not handle private import mappings");if(Le==="pnpapi")return Ae.toPortablePath(e.pnpapiResolution);if(ke&&(0,tp.isBuiltin)(Le))return null;let Ke=pu(Le),xe=Te&&pu(Te);if(Te&&he(Te)&&(!V.isAbsolute(Le)||fe(Le)===null)){let x=Ie(Le,Te);if(x===!1)throw ts("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${Ke}" -Required by: ${xe} -`,{request:Ke,issuer:xe});return Ae.toPortablePath(x)}let tt,He=Le.match(a);if(He){if(!Te)throw ts("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:Ke,issuer:xe});let[,x,I]=He,P=fe(Te);if(!P){let Fe=Ie(Le,Te);if(Fe===!1)throw ts("BUILTIN_NODE_RESOLUTION_FAILED",`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${Ke}" -Required by: ${xe} -`,{request:Ke,issuer:xe});return Ae.toPortablePath(Fe)}let R=U(P).packageDependencies.get(x),z=null;if(R==null&&P.name!==null){let Fe=t.fallbackExclusionList.get(P.name);if(!Fe||!Fe.has(P.reference)){for(let Et=0,qt=h.length;EtJ(lt))?X=ts("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) -${Fe.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference} -`).join("")} -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Fe}):X=ts("MISSING_PEER_DEPENDENCY",`${P.name} tried to access ${x} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) - -${Fe.map(lt=>`Ancestor breaking the chain: ${lt.name}@${lt.reference} -`).join("")} -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x,brokenAncestors:Fe})}else R===void 0&&(!ke&&(0,tp.isBuiltin)(Le)?J(P)?X=ts("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${xe} -`,{request:Ke,issuer:xe,dependencyName:x}):X=ts("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${x} isn't otherwise declared in ${P.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${xe} -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x}):J(P)?X=ts("UNDECLARED_DEPENDENCY",`Your application tried to access ${x}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${xe} -`,{request:Ke,issuer:xe,dependencyName:x}):X=ts("UNDECLARED_DEPENDENCY",`${P.name} tried to access ${x}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${x}${x!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) -`,{request:Ke,issuer:xe,issuerLocator:Object.assign({},P),dependencyName:x}));if(R==null){if(z===null||X===null)throw X||new Error("Assertion failed: Expected an error to have been set");R=z;let Fe=X.message.replace(/\n.*/g,"");X.message=Fe,!E.has(Fe)&&o!==0&&(E.add(Fe),process.emitWarning(X))}let $=Array.isArray(R)?{name:R[0],reference:R[1]}:{name:x,reference:R},se=U($);if(!se.packageLocation)throw ts("MISSING_DEPENDENCY",`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${$.name}@${$.reference}${$.name!==Ke?` (via "${Ke}")`:""} -Required by: ${P.name}@${P.reference} (via ${xe}) -`,{request:Ke,issuer:xe,dependencyLocator:Object.assign({},$)});let be=se.packageLocation;I?tt=V.join(be,I):tt=be}else if(V.isAbsolute(Le))tt=V.normalize(Le);else{if(!Te)throw ts("API_ERROR","The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:Ke,issuer:xe});let x=V.resolve(Te);Te.match(u)?tt=V.normalize(V.join(x,Le)):tt=V.normalize(V.join(V.dirname(x),Le))}return V.normalize(tt)}function Se(Le,Te,ke=te,Ke){if(n.test(Le))return Te;let xe=le(Te,ke,Ke);return xe?V.normalize(xe):Te}function Re(Le,{extensions:Te=Object.keys(tp.Module._extensions)}={}){let ke=[],Ke=ce(Le,ke,{extensions:Te});if(Ke)return V.normalize(Ke);{Q1e(ke.map(He=>Ae.fromPortablePath(He)));let xe=pu(Le),tt=fe(Le);if(tt){let{packageLocation:He}=U(tt),x=!0;try{e.fakeFs.accessSync(He)}catch(I){if(I?.code==="ENOENT")x=!1;else{let P=(I?.message??I??"empty exception thrown").replace(/^[A-Z]/,y=>y.toLowerCase());throw ts("QUALIFIED_PATH_RESOLUTION_FAILED",`Required package exists but could not be accessed (${P}). - -Missing package: ${tt.name}@${tt.reference} -Expected package location: ${pu(He)} -`,{unqualifiedPath:xe,extensions:Te})}}if(!x){let I=He.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ts("QUALIFIED_PATH_RESOLUTION_FAILED",`${I} - -Missing package: ${tt.name}@${tt.reference} -Expected package location: ${pu(He)} -`,{unqualifiedPath:xe,extensions:Te})}}throw ts("QUALIFIED_PATH_RESOLUTION_FAILED",`Qualified path resolution failed: we looked for the following paths, but none could be accessed. - -Source path: ${xe} -${ke.map(He=>`Not found: ${pu(He)} -`).join("")}`,{unqualifiedPath:xe,extensions:Te})}}function ht(Le,Te,ke){if(!Te)throw new Error("Assertion failed: An issuer is required to resolve private import mappings");let Ke=v1e({name:Le,base:(0,fd.pathToFileURL)(Ae.fromPortablePath(Te)),conditions:ke.conditions??te,readFileSyncFn:ie});if(Ke instanceof URL)return Re(Ae.toPortablePath((0,fd.fileURLToPath)(Ke)),{extensions:ke.extensions});if(Ke.startsWith("#"))throw new Error("Mapping from one private import to another isn't allowed");return q(Ke,Te,ke)}function q(Le,Te,ke={}){try{if(Le.startsWith("#"))return ht(Le,Te,ke);let{considerBuiltins:Ke,extensions:xe,conditions:tt}=ke,He=Z(Le,Te,{considerBuiltins:Ke});if(Le==="pnpapi")return He;if(He===null)return null;let x=()=>Te!==null?he(Te):!1,I=(!Ke||!(0,tp.isBuiltin)(Le))&&!x()?Se(Le,He,tt,Te):He;return Re(I,{extensions:xe})}catch(Ke){throw Object.hasOwn(Ke,"pnpCode")&&Object.assign(Ke.data,{request:pu(Le),issuer:Te&&pu(Te)}),Ke}}function nt(Le){let Te=V.normalize(Le),ke=qs.resolveVirtual(Te);return ke!==Te?ke:null}return{VERSIONS:De,topLevel:Ee,getLocator:(Le,Te)=>Array.isArray(Te)?{name:Te[0],reference:Te[1]}:{name:Le,reference:Te},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let Le=[];for(let[Te,ke]of D)for(let Ke of ke.keys())Te!==null&&Ke!==null&&Le.push({name:Te,reference:Ke});return Le},getPackageInformation:Le=>{let Te=g(Le);if(Te===null)return null;let ke=Ae.fromPortablePath(Te.packageLocation);return{...Te,packageLocation:ke}},findPackageLocator:Le=>fe(Ae.toPortablePath(Le)),resolveToUnqualified:N("resolveToUnqualified",(Le,Te,ke)=>{let Ke=Te!==null?Ae.toPortablePath(Te):null,xe=Z(Ae.toPortablePath(Le),Ke,ke);return xe===null?null:Ae.fromPortablePath(xe)}),resolveUnqualified:N("resolveUnqualified",(Le,Te)=>Ae.fromPortablePath(Re(Ae.toPortablePath(Le),Te))),resolveRequest:N("resolveRequest",(Le,Te,ke)=>{let Ke=Te!==null?Ae.toPortablePath(Te):null,xe=q(Ae.toPortablePath(Le),Ke,ke);return xe===null?null:Ae.fromPortablePath(xe)}),resolveVirtual:N("resolveVirtual",Le=>{let Te=nt(Ae.toPortablePath(Le));return Te!==null?Ae.fromPortablePath(Te):null})}}St();var F1e=(t,e,r)=>{let o=gv(t),a=Sj(o,{basePath:e}),n=Ae.join(e,mr.pnpCjs);return Oj(a,{fakeFs:r,pnpapiResolution:n})};var Uj=et(T1e());Gt();var CA={};Vt(CA,{checkManifestCompatibility:()=>L1e,extractBuildRequest:()=>ZQ,getExtractHint:()=>_j,hasBindingGyp:()=>Hj});Ve();St();function L1e(t){return G.isPackageCompatible(t,Xi.getArchitectureSet())}function ZQ(t,e,r,{configuration:o}){let a=[];for(let n of["preinstall","install","postinstall"])e.manifest.scripts.has(n)&&a.push({type:0,script:n});return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&a.push({type:1,script:"node-gyp rebuild"}),a.length===0?null:t.linkType!=="HARD"?{skipped:!0,explain:n=>n.reportWarningOnce(6,`${G.prettyLocator(o,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`)}:r&&r.built===!1?{skipped:!0,explain:n=>n.reportInfoOnce(5,`${G.prettyLocator(o,t)} lists build scripts, but its build has been explicitly disabled through configuration.`)}:!o.get("enableScripts")&&!r.built?{skipped:!0,explain:n=>n.reportWarningOnce(4,`${G.prettyLocator(o,t)} lists build scripts, but all build scripts have been disabled.`)}:L1e(t)?{skipped:!1,directives:a}:{skipped:!0,explain:n=>n.reportWarningOnce(76,`${G.prettyLocator(o,t)} The ${Xi.getArchitectureName()} architecture is incompatible with this package, build skipped.`)}}var vwt=new Set([".exe",".bin",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function _j(t){return t.packageFs.getExtractHint({relevantExtensions:vwt})}function Hj(t){let e=V.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var vv={};Vt(vv,{getUnpluggedPath:()=>Bv});Ve();St();function Bv(t,{configuration:e}){return V.resolve(e.get("pnpUnpluggedFolder"),G.slugifyLocator(t))}var Dwt=new Set([G.makeIdent(null,"open").identHash,G.makeIdent(null,"opn").identHash]),Yh=class{constructor(){this.mode="strict";this.pnpCache=new Map}getCustomDataKey(){return JSON.stringify({name:"PnpLinker",version:2})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the PnP linker to be enabled");let o=Vh(r.project).cjs;if(!ae.existsSync(o))throw new it(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let a=qe.getFactoryWithDefault(this.pnpCache,o,()=>qe.dynamicRequire(o,{cachingStrategy:qe.CachingStrategy.FsTime})),n={name:G.stringifyIdent(e),reference:e.reference},u=a.getPackageInformation(n);if(!u)throw new it(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return Ae.toPortablePath(u.packageLocation)}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=Vh(r.project).cjs;if(!ae.existsSync(o))return null;let n=qe.getFactoryWithDefault(this.pnpCache,o,()=>qe.dynamicRequire(o,{cachingStrategy:qe.CachingStrategy.FsTime})).findPackageLocator(Ae.fromPortablePath(e));return n?G.makeLocator(G.parseIdent(n.name),n.reference):null}makeInstaller(e){return new pd(e)}isEnabled(e){return!(e.project.configuration.get("nodeLinker")!=="pnp"||e.project.configuration.get("pnpMode")!==this.mode)}},pd=class{constructor(e){this.opts=e;this.mode="strict";this.asyncActions=new qe.AsyncActions(10);this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}attachCustomData(e){this.customData=e}async installPackage(e,r,o){let a=G.stringifyIdent(e),n=e.reference,u=!!this.opts.project.tryWorkspaceByLocator(e),A=G.isVirtualLocator(e),p=e.peerDependencies.size>0&&!A,h=!p&&!u,E=!p&&e.linkType!=="SOFT",w,D;if(h||E){let te=A?G.devirtualizeLocator(e):e;w=this.customData.store.get(te.locatorHash),typeof w>"u"&&(w=await Swt(r),e.linkType==="HARD"&&this.customData.store.set(te.locatorHash,w)),w.manifest.type==="module"&&(this.isESMLoaderRequired=!0),D=this.opts.project.getDependencyMeta(te,e.version)}let b=h?ZQ(e,w,D,{configuration:this.opts.project.configuration}):null,C=E?await this.unplugPackageIfNeeded(e,w,r,D,o):r.packageFs;if(V.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let T=V.resolve(C.getRealPath(),r.prefixPath),N=qj(this.opts.project.cwd,T),U=new Map,J=new Set;if(A){for(let te of e.peerDependencies.values())U.set(G.stringifyIdent(te),null),J.add(G.stringifyIdent(te));if(!u){let te=G.devirtualizeLocator(e);this.virtualTemplates.set(te.locatorHash,{location:qj(this.opts.project.cwd,qs.resolveVirtual(T)),locator:te})}}return qe.getMapWithDefault(this.packageRegistry,a).set(n,{packageLocation:N,packageDependencies:U,packagePeers:J,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:T,buildRequest:b}}async attachInternalDependencies(e,r){let o=this.getPackageInformation(e);for(let[a,n]of r){let u=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];o.packageDependencies.set(G.stringifyIdent(a),u)}}async attachExternalDependents(e,r){for(let o of r)this.getDiskInformation(o).packageDependencies.set(G.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=Vh(this.opts.project);if(this.isEsmEnabled()||await ae.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await ae.removePromise(e.cjs),await ae.removePromise(e.data),await ae.removePromise(e.esmLoader),await ae.removePromise(this.opts.project.configuration.get("pnpUnpluggedFolder"));return}for(let{locator:E,location:w}of this.virtualTemplates.values())qe.getMapWithDefault(this.packageRegistry,G.stringifyIdent(E)).set(E.reference,{packageLocation:w,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),o=this.opts.project.workspaces.map(({anchoredLocator:E})=>({name:G.stringifyIdent(E),reference:E.reference})),a=r!=="none",n=[],u=new Map,A=qe.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),p=this.packageRegistry,h=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let E of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(E)&&n.push({name:G.stringifyIdent(E),reference:E.reference});return await this.asyncActions.wait(),await this.finalizeInstallWithPnp({dependencyTreeRoots:o,enableTopLevelFallback:a,fallbackExclusionList:n,fallbackPool:u,ignorePattern:A,packageRegistry:p,shebang:h}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=Vh(this.opts.project),o=await this.locateNodeModules(e.ignorePattern);if(o.length>0){this.opts.report.reportWarning(31,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let n of o)await ae.removePromise(n)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let n=l1e(e);await ae.changeFilePromise(r.cjs,n,{automaticNewlines:!0,mode:493}),await ae.removePromise(r.data)}else{let{dataFile:n,loaderFile:u}=c1e(e);await ae.changeFilePromise(r.cjs,u,{automaticNewlines:!0,mode:493}),await ae.changeFilePromise(r.data,n,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(0,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await ae.changeFilePromise(r.esmLoader,(0,Uj.default)(),{automaticNewlines:!0,mode:420}));let a=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await ae.removePromise(a);else for(let n of await ae.readdirPromise(a)){let u=V.resolve(a,n);this.unpluggedPaths.has(u)||await ae.removePromise(u)}}async locateNodeModules(e){let r=[],o=e?new RegExp(e):null;for(let a of this.opts.project.workspaces){let n=V.join(a.cwd,"node_modules");if(o&&o.test(V.relative(this.opts.project.cwd,a.cwd))||!ae.existsSync(n))continue;let u=await ae.readdirPromise(n,{withFileTypes:!0}),A=u.filter(p=>!p.isDirectory()||p.name===".bin"||!p.name.startsWith("."));if(A.length===u.length)r.push(n);else for(let p of A)r.push(V.join(n,p.name))}return r}async unplugPackageIfNeeded(e,r,o,a,n){return this.shouldBeUnplugged(e,r,a)?this.unplugPackage(e,o,n):o.packageFs}shouldBeUnplugged(e,r,o){return typeof o.unplugged<"u"?o.unplugged:Dwt.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(ZQ(e,r,o,{configuration:this.opts.project.configuration})?.skipped===!1||r.misc.extractHint)}async unplugPackage(e,r,o){let a=Bv(e,{configuration:this.opts.project.configuration});return this.opts.project.disabledLocators.has(e.locatorHash)?new ju(a,{baseFs:r.packageFs,pathUtils:V}):(this.unpluggedPaths.add(a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{let n=V.join(a,r.prefixPath,".ready");await ae.existsPromise(n)||(this.opts.project.storedBuildState.delete(e.locatorHash),await ae.mkdirPromise(a,{recursive:!0}),await ae.copyPromise(a,Bt.dot,{baseFs:r.packageFs,overwrite:!1}),await ae.writeFilePromise(n,""))})),new En(a))}getPackageInformation(e){let r=G.stringifyIdent(e),o=e.reference,a=this.packageRegistry.get(r);if(!a)throw new Error(`Assertion failed: The package information store should have been available (for ${G.prettyIdent(this.opts.project.configuration,e)})`);let n=a.get(o);if(!n)throw new Error(`Assertion failed: The package information should have been available (for ${G.prettyLocator(this.opts.project.configuration,e)})`);return n}getDiskInformation(e){let r=qe.getMapWithDefault(this.packageRegistry,"@@disk"),o=qj(this.opts.project.cwd,e);return qe.getFactoryWithDefault(r,o,()=>({packageLocation:o,packageDependencies:new Map,packagePeers:new Set,linkType:"SOFT",discardFromLookup:!1}))}};function qj(t,e){let r=V.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function Swt(t){let e=await _t.tryFind(t.prefixPath,{baseFs:t.packageFs})??new _t,r=new Set(["preinstall","install","postinstall"]);for(let o of e.scripts.keys())r.has(o)||e.scripts.delete(o);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:_j(t),hasBindingGyp:Hj(t)}}}Ve();Ve();Gt();var N1e=et(Xo());var QC=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=de.Rest()}static{this.paths=[["unplug"]]}static{this.usage=ot.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);if(r.get("nodeLinker")!=="pnp")throw new it("This command can only be used if the `nodeLinker` option is set to `pnp`");await o.restoreInstallState();let u=new Set(this.patterns),A=this.patterns.map(b=>{let C=G.parseDescriptor(b),T=C.range!=="unknown"?C:G.makeDescriptor(C,"*");if(!Ur.validRange(T.range))throw new it(`The range of the descriptor patterns must be a valid semver range (${G.prettyDescriptor(r,T)})`);return N=>{let U=G.stringifyIdent(N);return!N1e.default.isMatch(U,G.stringifyIdent(T))||N.version&&!Ur.satisfiesWithPrereleases(N.version,T.range)?!1:(u.delete(b),!0)}}),p=()=>{let b=[];for(let C of o.storedPackages.values())!o.tryWorkspaceByLocator(C)&&!G.isVirtualLocator(C)&&A.some(T=>T(C))&&b.push(C);return b},h=b=>{let C=new Set,T=[],N=(U,J)=>{if(C.has(U.locatorHash))return;let te=!!o.tryWorkspaceByLocator(U);if(!(J>0&&!this.recursive&&te)&&(C.add(U.locatorHash),!o.tryWorkspaceByLocator(U)&&A.some(le=>le(U))&&T.push(U),!(J>0&&!this.recursive)))for(let le of U.dependencies.values()){let ce=o.storedResolutions.get(le.descriptorHash);if(!ce)throw new Error("Assertion failed: The resolution should have been registered");let ue=o.storedPackages.get(ce);if(!ue)throw new Error("Assertion failed: The package should have been registered");N(ue,J+1)}};for(let U of b)N(U.anchoredPackage,0);return T},E,w;if(this.all&&this.recursive?(E=p(),w="the project"):this.all?(E=h(o.workspaces),w="any workspace"):(E=h([a]),w="this workspace"),u.size>1)throw new it(`Patterns ${pe.prettyList(r,u,pe.Type.CODE)} don't match any packages referenced by ${w}`);if(u.size>0)throw new it(`Pattern ${pe.prettyList(r,u,pe.Type.CODE)} doesn't match any packages referenced by ${w}`);E=qe.sortMap(E,b=>G.stringifyLocator(b));let D=await Lt.start({configuration:r,stdout:this.context.stdout,json:this.json},async b=>{for(let C of E){let T=C.version??"unknown",N=o.topLevelWorkspace.manifest.ensureDependencyMeta(G.makeDescriptor(C,T));N.unplugged=!0,b.reportInfo(0,`Will unpack ${G.prettyLocator(r,C)} to ${pe.pretty(r,Bv(C,{configuration:r}),pe.Type.PATH)}`),b.reportJson({locator:G.stringifyLocator(C),version:T})}await o.topLevelWorkspace.persistManifest(),this.json||b.reportSeparator()});return D.hasErrors()?D.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};var Vh=t=>({cjs:V.join(t.cwd,mr.pnpCjs),data:V.join(t.cwd,mr.pnpData),esmLoader:V.join(t.cwd,mr.pnpEsmLoader)}),M1e=t=>/\s/.test(t)?JSON.stringify(t):t;async function Pwt(t,e,r){let o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/,n=(e.NODE_OPTIONS??"").replace(o," ").replace(a," ").trim();if(t.configuration.get("nodeLinker")!=="pnp"){e.NODE_OPTIONS=n||void 0;return}let u=Vh(t),A=`--require ${M1e(Ae.fromPortablePath(u.cjs))}`;ae.existsSync(u.esmLoader)&&(A=`${A} --experimental-loader ${(0,O1e.pathToFileURL)(Ae.fromPortablePath(u.esmLoader)).href}`),ae.existsSync(u.cjs)&&(e.NODE_OPTIONS=n?`${A} ${n}`:A)}async function xwt(t,e){let r=Vh(t);e(r.cjs),e(r.data),e(r.esmLoader),e(t.configuration.get("pnpUnpluggedFolder"))}var bwt={hooks:{populateYarnPaths:xwt,setupScriptEnvironment:Pwt},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "pnpm", or "node-modules"',type:"STRING",default:"pnp"},winLinkType:{description:"Whether Yarn should use Windows Junctions or symlinks when creating links on Windows.",type:"STRING",values:["junctions","symlinks"],default:"junctions"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:"STRING",default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:"STRING",default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:"STRING",default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:"BOOLEAN",default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:"BOOLEAN",default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:"STRING",default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:"ABSOLUTE_PATH",default:"./.yarn/unplugged"}},linkers:[Yh],commands:[QC]},kwt=bwt;var Y1e=et(j1e());Gt();var zj=et(ve("crypto")),V1e=et(ve("fs")),K1e=1,xi="node_modules",$Q=".bin",J1e=".yarn-state.yml",Vwt=1e3,Xj=(o=>(o.CLASSIC="classic",o.HARDLINKS_LOCAL="hardlinks-local",o.HARDLINKS_GLOBAL="hardlinks-global",o))(Xj||{}),Dv=class{constructor(){this.installStateCache=new Map}getCustomDataKey(){return JSON.stringify({name:"NodeModulesLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the node-modules linker to be enabled");let o=r.project.tryWorkspaceByLocator(e);if(o)return o.cwd;let a=await qe.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await Jj(r.project,{unrollAliases:!0}));if(a===null)throw new it("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let n=a.locatorMap.get(G.stringifyLocator(e));if(!n){let p=new it(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw p.code="LOCATOR_NOT_INSTALLED",p}let u=n.locations.sort((p,h)=>p.split(V.sep).length-h.split(V.sep).length),A=V.join(r.project.configuration.startingCwd,xi);return u.find(p=>V.contains(A,p))||n.locations[0]}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=await qe.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await Jj(r.project,{unrollAliases:!0}));if(o===null)return null;let{locationRoot:a,segments:n}=eF(V.resolve(e),{skipPrefix:r.project.cwd}),u=o.locationTree.get(a);if(!u)return null;let A=u.locator;for(let p of n){if(u=u.children.get(p),!u)break;A=u.locator||A}return G.parseLocator(A)}makeInstaller(e){return new Kj(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="node-modules"}},Kj=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}attachCustomData(e){this.customData=e}async installPackage(e,r){let o=V.resolve(r.packageFs.getRealPath(),r.prefixPath),a=this.customData.store.get(e.locatorHash);if(typeof a>"u"&&(a=await Kwt(e,r),e.linkType==="HARD"&&this.customData.store.set(e.locatorHash,a)),!G.isPackageCompatible(e,this.opts.project.configuration.getSupportedArchitectures()))return{packageLocation:null,buildRequest:null};let n=new Map,u=new Set;n.has(G.stringifyIdent(e))||n.set(G.stringifyIdent(e),e.reference);let A=e;if(G.isVirtualLocator(e)){A=G.devirtualizeLocator(e);for(let E of e.peerDependencies.values())n.set(G.stringifyIdent(E),null),u.add(G.stringifyIdent(E))}let p={packageLocation:`${Ae.fromPortablePath(o)}/`,packageDependencies:n,packagePeers:u,linkType:e.linkType,discardFromLookup:r.discardFromLookup??!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:a,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:p});let h=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(A.locatorHash,h),{packageLocation:o,buildRequest:null}}async attachInternalDependencies(e,r){let o=this.localStore.get(e.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected information object to have been registered");for(let[a,n]of r){let u=G.areIdentsEqual(a,n)?n.reference:[G.stringifyIdent(n),n.reference];o.pnpNode.packageDependencies.set(G.stringifyIdent(a),u)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new qs({baseFs:new iA({maxOpenFiles:80,readOnlyArchives:!0})}),r=await Jj(this.opts.project),o=this.opts.project.configuration.get("nmMode");(r===null||o!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:o,mtimeMs:0});let a=new Map(this.opts.project.workspaces.map(D=>{let b=this.opts.project.configuration.get("nmHoistingLimits");try{b=qe.validateEnum(fv,D.manifest.installConfig?.hoistingLimits??b)}catch{let C=G.prettyWorkspace(this.opts.project.configuration,D);this.opts.report.reportWarning(57,`${C}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(fv).join(", ")}, using default: "${b}"`)}return[D.relativeCwd,b]})),n=new Map(this.opts.project.workspaces.map(D=>{let b=this.opts.project.configuration.get("nmSelfReferences");return b=D.manifest.installConfig?.selfReferences??b,[D.relativeCwd,b]})),u={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(D,b)=>Array.isArray(b)?{name:b[0],reference:b[1]}:{name:D,reference:b},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(D=>{let b=D.anchoredLocator;return{name:G.stringifyIdent(b),reference:b.reference}}),getPackageInformation:D=>{let b=D.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:G.makeLocator(G.parseIdent(D.name),D.reference),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the package reference to have been registered");return C.pnpNode},findPackageLocator:D=>{let b=this.opts.project.tryWorkspaceByCwd(Ae.toPortablePath(D));if(b!==null){let C=b.anchoredLocator;return{name:G.stringifyIdent(C),reference:C.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:D=>Ae.fromPortablePath(qs.resolveVirtual(Ae.toPortablePath(D)))},{tree:A,errors:p,preserveSymlinksRequired:h}=pv(u,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:a,project:this.opts.project,selfReferencesByCwd:n});if(!A){for(let{messageName:D,text:b}of p)this.opts.report.reportError(D,b);return}let E=vj(A);await e1t(r,E,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async D=>{let b=G.parseLocator(D),C=this.localStore.get(b.locatorHash);if(typeof C>"u")throw new Error("Assertion failed: Expected the slot to exist");return C.customPackageData.manifest}});let w=[];for(let[D,b]of E.entries()){if(Z1e(D))continue;let C=G.parseLocator(D),T=this.localStore.get(C.locatorHash);if(typeof T>"u")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(T.pkg))continue;let N=CA.extractBuildRequest(T.pkg,T.customPackageData,T.dependencyMeta,{configuration:this.opts.project.configuration});N&&w.push({buildLocations:b.locations,locator:C,buildRequest:N})}return h&&this.opts.report.reportWarning(72,`The application uses portals and that's why ${pe.pretty(this.opts.project.configuration,"--preserve-symlinks",pe.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:w}}};async function Kwt(t,e){let r=await _t.tryFind(e.prefixPath,{baseFs:e.packageFs})??new _t,o=new Set(["preinstall","install","postinstall"]);for(let a of r.scripts.keys())o.has(a)||r.scripts.delete(a);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{hasBindingGyp:CA.hasBindingGyp(e)}}}async function Jwt(t,e,r,o,{installChangedByUser:a}){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,n+=`# cause your node_modules installation to become invalidated. -`,n+=` -`,n+=`__metadata: -`,n+=` version: ${K1e} -`,n+=` nmMode: ${o.value} -`;let u=Array.from(e.keys()).sort(),A=G.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let E of u){let w=e.get(E);n+=` -`,n+=`${JSON.stringify(E)}: -`,n+=` locations: -`;for(let D of w.locations){let b=V.contains(t.cwd,D);if(b===null)throw new Error(`Assertion failed: Expected the path to be within the project (${D})`);n+=` - ${JSON.stringify(b)} -`}if(w.aliases.length>0){n+=` aliases: -`;for(let D of w.aliases)n+=` - ${JSON.stringify(D)} -`}if(E===A&&r.size>0){n+=` bin: -`;for(let[D,b]of r){let C=V.contains(t.cwd,D);if(C===null)throw new Error(`Assertion failed: Expected the path to be within the project (${D})`);n+=` ${JSON.stringify(C)}: -`;for(let[T,N]of b){let U=V.relative(V.join(D,xi),N);n+=` ${JSON.stringify(T)}: ${JSON.stringify(U)} -`}}}}let p=t.cwd,h=V.join(p,xi,J1e);a&&await ae.removePromise(h),await ae.changeFilePromise(h,n,{automaticNewlines:!0})}async function Jj(t,{unrollAliases:e=!1}={}){let r=t.cwd,o=V.join(r,xi,J1e),a;try{a=await ae.statPromise(o)}catch{}if(!a)return null;let n=Vi(await ae.readFilePromise(o,"utf8"));if(n.__metadata.version>K1e)return null;let u=n.__metadata.nmMode||"classic",A=new Map,p=new Map;delete n.__metadata;for(let[h,E]of Object.entries(n)){let w=E.locations.map(b=>V.join(r,b)),D=E.bin;if(D)for(let[b,C]of Object.entries(D)){let T=V.join(r,Ae.toPortablePath(b)),N=qe.getMapWithDefault(p,T);for(let[U,J]of Object.entries(C))N.set(U,Ae.toPortablePath([T,xi,J].join(V.sep)))}if(A.set(h,{target:Bt.dot,linkType:"HARD",locations:w,aliases:E.aliases||[]}),e&&E.aliases)for(let b of E.aliases){let{scope:C,name:T}=G.parseLocator(h),N=G.makeLocator(G.makeIdent(C,T),b),U=G.stringifyLocator(N);A.set(U,{target:Bt.dot,linkType:"HARD",locations:w,aliases:[]})}}return{locatorMap:A,binSymlinks:p,locationTree:z1e(A,{skipPrefix:t.cwd}),nmMode:u,mtimeMs:a.mtimeMs}}var RC=async(t,e)=>{if(t.split(V.sep).indexOf(xi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{let r;if(!e.innerLoop&&(r=await ae.lstatPromise(t),!r.isDirectory()&&!r.isSymbolicLink()||r.isSymbolicLink()&&!e.isWorkspaceDir)){await ae.unlinkPromise(t);return}let o=await ae.readdirPromise(t,{withFileTypes:!0});for(let n of o){let u=V.join(t,n.name);n.isDirectory()?(n.name!==xi||e&&e.innerLoop)&&await RC(u,{innerLoop:!0,contentsOnly:!1}):await ae.unlinkPromise(u)}let a=!e.innerLoop&&e.isWorkspaceDir&&r?.isSymbolicLink();!e.contentsOnly&&!a&&await ae.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},G1e=4,eF=(t,{skipPrefix:e})=>{let r=V.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let o=r.split(V.sep).filter(p=>p!==""),a=o.indexOf(xi),n=o.slice(0,a).join(V.sep),u=V.join(e,n),A=o.slice(a);return{locationRoot:u,segments:A}},z1e=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let o=()=>({children:new Map,linkType:"HARD"});for(let[a,n]of t.entries()){if(n.linkType==="SOFT"&&V.contains(e,n.target)!==null){let A=qe.getFactoryWithDefault(r,n.target,o);A.locator=a,A.linkType=n.linkType}for(let u of n.locations){let{locationRoot:A,segments:p}=eF(u,{skipPrefix:e}),h=qe.getFactoryWithDefault(r,A,o);for(let E=0;E{if(process.platform==="win32"&&r==="junctions"){let o;try{o=await ae.lstatPromise(t)}catch{}if(!o||o.isDirectory()){await ae.symlinkPromise(t,e,"junction");return}}await ae.symlinkPromise(V.relative(V.dirname(e),t),e)};async function X1e(t,e,r){let o=V.join(t,`${zj.default.randomBytes(16).toString("hex")}.tmp`);try{await ae.writeFilePromise(o,r);try{await ae.linkPromise(o,e)}catch{}}finally{await ae.unlinkPromise(o)}}async function zwt({srcPath:t,dstPath:e,entry:r,globalHardlinksStore:o,baseFs:a,nmMode:n}){if(r.kind==="file"){if(n.value==="hardlinks-global"&&o&&r.digest){let A=V.join(o,r.digest.substring(0,2),`${r.digest.substring(2)}.dat`),p;try{let h=await ae.statPromise(A);if(h&&(!r.mtimeMs||h.mtimeMs>r.mtimeMs||h.mtimeMs{await ae.mkdirPromise(t,{recursive:!0});let A=async(E=Bt.dot)=>{let w=V.join(e,E),D=await r.readdirPromise(w,{withFileTypes:!0}),b=new Map;for(let C of D){let T=V.join(E,C.name),N,U=V.join(w,C.name);if(C.isFile()){if(N={kind:"file",mode:(await r.lstatPromise(U)).mode},a.value==="hardlinks-global"){let J=await bn.checksumFile(U,{baseFs:r,algorithm:"sha1"});N.digest=J}}else if(C.isDirectory())N={kind:"directory"};else if(C.isSymbolicLink())N={kind:"symlink",symlinkTo:await r.readlinkPromise(U)};else throw new Error(`Unsupported file type (file: ${U}, mode: 0o${await r.statSync(U).mode.toString(8).padStart(6,"0")})`);if(b.set(T,N),C.isDirectory()&&T!==xi){let J=await A(T);for(let[te,le]of J)b.set(te,le)}}return b},p;if(a.value==="hardlinks-global"&&o&&u){let E=V.join(o,u.substring(0,2),`${u.substring(2)}.json`);try{p=new Map(Object.entries(JSON.parse(await ae.readFilePromise(E,"utf8"))))}catch{p=await A()}}else p=await A();let h=!1;for(let[E,w]of p){let D=V.join(e,E),b=V.join(t,E);if(w.kind==="directory")await ae.mkdirPromise(b,{recursive:!0});else if(w.kind==="file"){let C=w.mtimeMs;await zwt({srcPath:D,dstPath:b,entry:w,nmMode:a,baseFs:r,globalHardlinksStore:o}),w.mtimeMs!==C&&(h=!0)}else w.kind==="symlink"&&await Zj(V.resolve(V.dirname(b),w.symlinkTo),b,n)}if(a.value==="hardlinks-global"&&o&&h&&u){let E=V.join(o,u.substring(0,2),`${u.substring(2)}.json`);await ae.removePromise(E),await X1e(o,E,Buffer.from(JSON.stringify(Object.fromEntries(p))))}};function Zwt(t,e,r,o){let a=new Map,n=new Map,u=new Map,A=!1,p=(h,E,w,D,b)=>{let C=!0,T=V.join(h,E),N=new Set;if(E===xi||E.startsWith("@")){let J;try{J=ae.statSync(T)}catch{}C=!!J,J?J.mtimeMs>r?(A=!0,N=new Set(ae.readdirSync(T))):N=new Set(w.children.get(E).children.keys()):A=!0;let te=e.get(h);if(te){let le=V.join(h,xi,$Q),ce;try{ce=ae.statSync(le)}catch{}if(!ce)A=!0;else if(ce.mtimeMs>r){A=!0;let ue=new Set(ae.readdirSync(le)),Ie=new Map;n.set(h,Ie);for(let[he,De]of te)ue.has(he)&&Ie.set(he,De)}else n.set(h,te)}}else C=b.has(E);let U=w.children.get(E);if(C){let{linkType:J,locator:te}=U,le={children:new Map,linkType:J,locator:te};if(D.children.set(E,le),te){let ce=qe.getSetWithDefault(u,te);ce.add(T),u.set(te,ce)}for(let ce of U.children.keys())p(T,ce,U,le,N)}else U.locator&&o.storedBuildState.delete(G.parseLocator(U.locator).locatorHash)};for(let[h,E]of t){let{linkType:w,locator:D}=E,b={children:new Map,linkType:w,locator:D};if(a.set(h,b),D){let C=qe.getSetWithDefault(u,E.locator);C.add(h),u.set(E.locator,C)}E.children.has(xi)&&p(h,xi,E,b,new Set)}return{locationTree:a,binSymlinks:n,locatorLocations:u,installChangedByUser:A}}function Z1e(t){let e=G.parseDescriptor(t);return G.isVirtualDescriptor(e)&&(e=G.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function $wt(t,e,r,{loadManifest:o}){let a=new Map;for(let[A,{locations:p}]of t){let h=Z1e(A)?null:await o(A,p[0]),E=new Map;if(h)for(let[w,D]of h.bin){let b=V.join(p[0],D);D!==""&&ae.existsSync(b)&&E.set(w,D)}a.set(A,E)}let n=new Map,u=(A,p,h)=>{let E=new Map,w=V.contains(r,A);if(h.locator&&w!==null){let D=a.get(h.locator);for(let[b,C]of D){let T=V.join(A,Ae.toPortablePath(C));E.set(b,T)}for(let[b,C]of h.children){let T=V.join(A,b),N=u(T,T,C);N.size>0&&n.set(A,new Map([...n.get(A)||new Map,...N]))}}else for(let[D,b]of h.children){let C=u(V.join(A,D),p,b);for(let[T,N]of C)E.set(T,N)}return E};for(let[A,p]of e){let h=u(A,A,p);h.size>0&&n.set(A,new Map([...n.get(A)||new Map,...h]))}return n}var W1e=(t,e)=>{if(!t||!e)return t===e;let r=G.parseLocator(t);G.isVirtualLocator(r)&&(r=G.devirtualizeLocator(r));let o=G.parseLocator(e);return G.isVirtualLocator(o)&&(o=G.devirtualizeLocator(o)),G.areLocatorsEqual(r,o)};function $j(t){return V.join(t.get("globalFolder"),"store")}async function e1t(t,e,{baseFs:r,project:o,report:a,loadManifest:n,realLocatorChecksums:u}){let A=V.join(o.cwd,xi),{locationTree:p,binSymlinks:h,locatorLocations:E,installChangedByUser:w}=Zwt(t.locationTree,t.binSymlinks,t.mtimeMs,o),D=z1e(e,{skipPrefix:o.cwd}),b=[],C=async({srcDir:De,dstDir:Ee,linkType:g,globalHardlinksStore:me,nmMode:Ce,windowsLinkType:fe,packageChecksum:ie})=>{let Z=(async()=>{try{g==="SOFT"?(await ae.mkdirPromise(V.dirname(Ee),{recursive:!0}),await Zj(V.resolve(De),Ee,fe)):await Xwt(Ee,De,{baseFs:r,globalHardlinksStore:me,nmMode:Ce,windowsLinkType:fe,packageChecksum:ie})}catch(Se){throw Se.message=`While persisting ${De} -> ${Ee} ${Se.message}`,Se}finally{le.tick()}})().then(()=>b.splice(b.indexOf(Z),1));b.push(Z),b.length>G1e&&await Promise.race(b)},T=async(De,Ee,g)=>{let me=(async()=>{let Ce=async(fe,ie,Z)=>{try{Z.innerLoop||await ae.mkdirPromise(ie,{recursive:!0});let Se=await ae.readdirPromise(fe,{withFileTypes:!0});for(let Re of Se){if(!Z.innerLoop&&Re.name===$Q)continue;let ht=V.join(fe,Re.name),q=V.join(ie,Re.name);Re.isDirectory()?(Re.name!==xi||Z&&Z.innerLoop)&&(await ae.mkdirPromise(q,{recursive:!0}),await Ce(ht,q,{...Z,innerLoop:!0})):Ie.value==="hardlinks-local"||Ie.value==="hardlinks-global"?await ae.linkPromise(ht,q):await ae.copyFilePromise(ht,q,V1e.default.constants.COPYFILE_FICLONE)}}catch(Se){throw Z.innerLoop||(Se.message=`While cloning ${fe} -> ${ie} ${Se.message}`),Se}finally{Z.innerLoop||le.tick()}};await Ce(De,Ee,g)})().then(()=>b.splice(b.indexOf(me),1));b.push(me),b.length>G1e&&await Promise.race(b)},N=async(De,Ee,g)=>{if(g)for(let[me,Ce]of Ee.children){let fe=g.children.get(me);await N(V.join(De,me),Ce,fe)}else{Ee.children.has(xi)&&await RC(V.join(De,xi),{contentsOnly:!1});let me=V.basename(De)===xi&&p.has(V.join(V.dirname(De)));await RC(De,{contentsOnly:De===A,isWorkspaceDir:me})}};for(let[De,Ee]of p){let g=D.get(De);for(let[me,Ce]of Ee.children){if(me===".")continue;let fe=g&&g.children.get(me),ie=V.join(De,me);await N(ie,Ce,fe)}}let U=async(De,Ee,g)=>{if(g){W1e(Ee.locator,g.locator)||await RC(De,{contentsOnly:Ee.linkType==="HARD"});for(let[me,Ce]of Ee.children){let fe=g.children.get(me);await U(V.join(De,me),Ce,fe)}}else{Ee.children.has(xi)&&await RC(V.join(De,xi),{contentsOnly:!0});let me=V.basename(De)===xi&&D.has(V.join(V.dirname(De)));await RC(De,{contentsOnly:Ee.linkType==="HARD",isWorkspaceDir:me})}};for(let[De,Ee]of D){let g=p.get(De);for(let[me,Ce]of Ee.children){if(me===".")continue;let fe=g&&g.children.get(me);await U(V.join(De,me),Ce,fe)}}let J=new Map,te=[];for(let[De,Ee]of E)for(let g of Ee){let{locationRoot:me,segments:Ce}=eF(g,{skipPrefix:o.cwd}),fe=D.get(me),ie=me;if(fe){for(let Z of Ce)if(ie=V.join(ie,Z),fe=fe.children.get(Z),!fe)break;if(fe){let Z=W1e(fe.locator,De),Se=e.get(fe.locator),Re=Se.target,ht=ie,q=Se.linkType;if(Z)J.has(Re)||J.set(Re,ht);else if(Re!==ht){let nt=G.parseLocator(fe.locator);G.isVirtualLocator(nt)&&(nt=G.devirtualizeLocator(nt)),te.push({srcDir:Re,dstDir:ht,linkType:q,realLocatorHash:nt.locatorHash})}}}}for(let[De,{locations:Ee}]of e.entries())for(let g of Ee){let{locationRoot:me,segments:Ce}=eF(g,{skipPrefix:o.cwd}),fe=p.get(me),ie=D.get(me),Z=me,Se=e.get(De),Re=G.parseLocator(De);G.isVirtualLocator(Re)&&(Re=G.devirtualizeLocator(Re));let ht=Re.locatorHash,q=Se.target,nt=g;if(q===nt)continue;let Le=Se.linkType;for(let Te of Ce)ie=ie.children.get(Te);if(!fe)te.push({srcDir:q,dstDir:nt,linkType:Le,realLocatorHash:ht});else for(let Te of Ce)if(Z=V.join(Z,Te),fe=fe.children.get(Te),!fe){te.push({srcDir:q,dstDir:nt,linkType:Le,realLocatorHash:ht});break}}let le=Ws.progressViaCounter(te.length),ce=a.reportProgress(le),ue=o.configuration.get("nmMode"),Ie={value:ue},he=o.configuration.get("winLinkType");try{let De=Ie.value==="hardlinks-global"?`${$j(o.configuration)}/v1`:null;if(De&&!await ae.existsPromise(De)){await ae.mkdirpPromise(De);for(let g=0;g<256;g++)await ae.mkdirPromise(V.join(De,g.toString(16).padStart(2,"0")))}for(let g of te)(g.linkType==="SOFT"||!J.has(g.srcDir))&&(J.set(g.srcDir,g.dstDir),await C({...g,globalHardlinksStore:De,nmMode:Ie,windowsLinkType:he,packageChecksum:u.get(g.realLocatorHash)||null}));await Promise.all(b),b.length=0;for(let g of te){let me=J.get(g.srcDir);g.linkType!=="SOFT"&&g.dstDir!==me&&await T(me,g.dstDir,{nmMode:Ie})}await Promise.all(b),await ae.mkdirPromise(A,{recursive:!0});let Ee=await $wt(e,D,o.cwd,{loadManifest:n});await t1t(h,Ee,o.cwd,he),await Jwt(o,e,Ee,Ie,{installChangedByUser:w}),ue=="hardlinks-global"&&Ie.value=="hardlinks-local"&&a.reportWarningOnce(74,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{ce.stop()}}async function t1t(t,e,r,o){for(let a of t.keys()){if(V.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);if(!e.has(a)){let n=V.join(a,xi,$Q);await ae.removePromise(n)}}for(let[a,n]of e){if(V.contains(r,a)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${a}`);let u=V.join(a,xi,$Q),A=t.get(a)||new Map;await ae.mkdirPromise(u,{recursive:!0});for(let p of A.keys())n.has(p)||(await ae.removePromise(V.join(u,p)),process.platform==="win32"&&await ae.removePromise(V.join(u,`${p}.cmd`)));for(let[p,h]of n){let E=A.get(p),w=V.join(u,p);E!==h&&(process.platform==="win32"?await(0,Y1e.default)(Ae.fromPortablePath(h),Ae.fromPortablePath(w),{createPwshFile:!1}):(await ae.removePromise(w),await Zj(h,w,o),V.contains(r,await ae.realpathPromise(h))!==null&&await ae.chmodPromise(h,493)))}}}Ve();St();sA();var Sv=class extends Yh{constructor(){super(...arguments);this.mode="loose"}makeInstaller(r){return new eG(r)}},eG=class extends pd{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(r){let o=new qs({baseFs:new iA({maxOpenFiles:80,readOnlyArchives:!0})}),a=F1e(r,this.opts.project.cwd,o),{tree:n,errors:u}=pv(a,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:w,text:D}of u)this.opts.report.reportError(w,D);return}let A=new Map;r.fallbackPool=A;let p=(w,D)=>{let b=G.parseLocator(D.locator),C=G.stringifyIdent(b);C===w?A.set(w,b.reference):A.set(w,[C,b.reference])},h=V.join(this.opts.project.cwd,mr.nodeModules),E=n.get(h);if(!(typeof E>"u")){if("target"in E)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let w of E.dirList){let D=V.join(h,w),b=n.get(D);if(typeof b>"u")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in b)p(w,b);else for(let C of b.dirList){let T=V.join(D,C),N=n.get(T);if(typeof N>"u")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in N)p(`${w}/${C}`,N);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var r1t={hooks:{cleanGlobalArtifacts:async t=>{let e=$j(t);await ae.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevents packages to be hoisted past specific levels",type:"STRING",values:["workspaces","dependencies","none"],default:"none"},nmMode:{description:"Defines in which measure Yarn must use hardlinks and symlinks when generated `node_modules` directories.",type:"STRING",values:["classic","hardlinks-local","hardlinks-global"],default:"classic"},nmSelfReferences:{description:"Defines whether the linker should generate self-referencing symlinks for workspaces.",type:"BOOLEAN",default:!0}},linkers:[Dv,Sv]},n1t=r1t;var $G={};Vt($G,{NpmHttpFetcher:()=>bv,NpmRemapResolver:()=>kv,NpmSemverFetcher:()=>rp,NpmSemverResolver:()=>Qv,NpmTagResolver:()=>Fv,default:()=>yvt,npmConfigUtils:()=>si,npmHttpUtils:()=>en,npmPublishUtils:()=>KC});Ve();var o2e=et(ni());var Zn="npm:";var en={};Vt(en,{AuthType:()=>n2e,customPackageError:()=>hd,del:()=>g1t,get:()=>gd,getIdentUrl:()=>tF,getPackageMetadata:()=>NC,handleInvalidAuthenticationError:()=>Kh,post:()=>p1t,put:()=>h1t});Ve();Ve();St();var iG=et(Q2()),t2e=et(c8()),r2e=et(ni());var si={};Vt(si,{RegistryType:()=>$1e,getAuditRegistry:()=>i1t,getAuthConfiguration:()=>nG,getDefaultRegistry:()=>Pv,getPublishRegistry:()=>s1t,getRegistryConfiguration:()=>e2e,getScopeConfiguration:()=>rG,getScopeRegistry:()=>TC,normalizeRegistry:()=>uc});var $1e=(o=>(o.AUDIT_REGISTRY="npmAuditRegistry",o.FETCH_REGISTRY="npmRegistryServer",o.PUBLISH_REGISTRY="npmPublishRegistry",o))($1e||{});function uc(t){return t.replace(/\/$/,"")}function i1t({configuration:t}){return Pv({configuration:t,type:"npmAuditRegistry"})}function s1t(t,{configuration:e}){return t.publishConfig?.registry?uc(t.publishConfig.registry):t.name?TC(t.name.scope,{configuration:e,type:"npmPublishRegistry"}):Pv({configuration:e,type:"npmPublishRegistry"})}function TC(t,{configuration:e,type:r="npmRegistryServer"}){let o=rG(t,{configuration:e});if(o===null)return Pv({configuration:e,type:r});let a=o.get(r);return a===null?Pv({configuration:e,type:r}):uc(a)}function Pv({configuration:t,type:e="npmRegistryServer"}){let r=t.get(e);return uc(r!==null?r:t.get("npmRegistryServer"))}function e2e(t,{configuration:e}){let r=e.get("npmRegistries"),o=uc(t),a=r.get(o);if(typeof a<"u")return a;let n=r.get(o.replace(/^[a-z]+:/,""));return typeof n<"u"?n:null}function rG(t,{configuration:e}){if(t===null)return null;let o=e.get("npmScopes").get(t);return o||null}function nG(t,{configuration:e,ident:r}){let o=r&&rG(r.scope,{configuration:e});return o?.get("npmAuthIdent")||o?.get("npmAuthToken")?o:e2e(t,{configuration:e})||e}var n2e=(a=>(a[a.NO_AUTH=0]="NO_AUTH",a[a.BEST_EFFORT=1]="BEST_EFFORT",a[a.CONFIGURATION=2]="CONFIGURATION",a[a.ALWAYS_AUTH=3]="ALWAYS_AUTH",a))(n2e||{});async function Kh(t,{attemptedAs:e,registry:r,headers:o,configuration:a}){if(nF(t))throw new Jt(41,"Invalid OTP token");if(t.originalError?.name==="HTTPError"&&t.originalError?.response.statusCode===401)throw new Jt(41,`Invalid authentication (${typeof e!="string"?`as ${await m1t(r,o,{configuration:a})}`:`attempted as ${e}`})`)}function hd(t,e){let r=t.response?.statusCode;return r?r===404?"Package not found":r>=500&&r<600?`The registry appears to be down (using a ${pe.applyHyperlink(e,"local cache","https://yarnpkg.com/advanced/lexicon#local-cache")} might have protected you against such outages)`:null:null}function tF(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}var i2e=new Map,o1t=new Map;async function a1t(t){return await qe.getFactoryWithDefault(i2e,t,async()=>{let e=null;try{e=await ae.readJsonPromise(t)}catch{}return e})}async function l1t(t,e,{configuration:r,cached:o,registry:a,headers:n,version:u,...A}){return await qe.getFactoryWithDefault(o1t,t,async()=>await gd(tF(e),{...A,customErrorMessage:hd,configuration:r,registry:a,ident:e,headers:{...n,"If-None-Match":o?.etag,"If-Modified-Since":o?.lastModified},wrapNetworkRequest:async p=>async()=>{let h=await p();if(h.statusCode===304){if(o===null)throw new Error("Assertion failed: cachedMetadata should not be null");return{...h,body:o.metadata}}let E=c1t(JSON.parse(h.body.toString())),w={metadata:E,etag:h.headers.etag,lastModified:h.headers["last-modified"]};return i2e.set(t,Promise.resolve(w)),Promise.resolve().then(async()=>{let D=`${t}-${process.pid}.tmp`;await ae.mkdirPromise(V.dirname(D),{recursive:!0}),await ae.writeJsonPromise(D,w,{compact:!0}),await ae.renamePromise(D,t)}).catch(()=>{}),{...h,body:E}}}))}async function NC(t,{cache:e,project:r,registry:o,headers:a,version:n,...u}){let{configuration:A}=r;o=xv(A,{ident:t,registry:o});let p=A1t(A,o),h=V.join(p,`${G.slugifyIdent(t)}.json`),E=null;if(!r.lockfileNeedsRefresh&&(E=await a1t(h),E)){if(typeof n<"u"&&typeof E.metadata.versions[n]<"u")return E.metadata;if(A.get("enableOfflineMode")){let w=structuredClone(E.metadata),D=new Set;if(e){for(let C of Object.keys(w.versions)){let T=G.makeLocator(t,`npm:${C}`),N=e.getLocatorMirrorPath(T);(!N||!ae.existsSync(N))&&(delete w.versions[C],D.add(C))}let b=w["dist-tags"].latest;if(D.has(b)){let C=Object.keys(E.metadata.versions).sort(r2e.default.compare),T=C.indexOf(b);for(;D.has(C[T])&&T>=0;)T-=1;T>=0?w["dist-tags"].latest=C[T]:delete w["dist-tags"].latest}}return w}}return await l1t(h,t,{...u,configuration:A,cached:E,registry:o,headers:a,version:n})}var s2e=["name","dist.tarball","bin","scripts","os","cpu","libc","dependencies","dependenciesMeta","optionalDependencies","peerDependencies","peerDependenciesMeta","deprecated"];function c1t(t){return{"dist-tags":t["dist-tags"],versions:Object.fromEntries(Object.entries(t.versions).map(([e,r])=>[e,(0,t2e.default)(r,s2e)]))}}var u1t=bn.makeHash(...s2e).slice(0,6);function A1t(t,e){let r=f1t(t),o=new URL(e);return V.join(r,u1t,o.hostname)}function f1t(t){return V.join(t.get("globalFolder"),"metadata/npm")}async function gd(t,{configuration:e,headers:r,ident:o,authType:a,registry:n,...u}){n=xv(e,{ident:o,registry:n}),o&&o.scope&&typeof a>"u"&&(a=1);let A=await rF(n,{authType:a,configuration:e,ident:o});A&&(r={...r,authorization:A});try{return await on.get(t.charAt(0)==="/"?`${n}${t}`:t,{configuration:e,headers:r,...u})}catch(p){throw await Kh(p,{registry:n,configuration:e,headers:r}),p}}async function p1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=xv(o,{ident:n,registry:A});let E=await rF(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...LC(p)});try{return await on.post(A+t,e,{configuration:o,headers:a,...h})}catch(w){if(!nF(w)||p)throw await Kh(w,{attemptedAs:r,registry:A,configuration:o,headers:a}),w;p=await sG(w,{configuration:o});let D={...a,...LC(p)};try{return await on.post(`${A}${t}`,e,{configuration:o,headers:D,...h})}catch(b){throw await Kh(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function h1t(t,e,{attemptedAs:r,configuration:o,headers:a,ident:n,authType:u=3,registry:A,otp:p,...h}){A=xv(o,{ident:n,registry:A});let E=await rF(A,{authType:u,configuration:o,ident:n});E&&(a={...a,authorization:E}),p&&(a={...a,...LC(p)});try{return await on.put(A+t,e,{configuration:o,headers:a,...h})}catch(w){if(!nF(w))throw await Kh(w,{attemptedAs:r,registry:A,configuration:o,headers:a}),w;p=await sG(w,{configuration:o});let D={...a,...LC(p)};try{return await on.put(`${A}${t}`,e,{configuration:o,headers:D,...h})}catch(b){throw await Kh(b,{attemptedAs:r,registry:A,configuration:o,headers:a}),b}}}async function g1t(t,{attemptedAs:e,configuration:r,headers:o,ident:a,authType:n=3,registry:u,otp:A,...p}){u=xv(r,{ident:a,registry:u});let h=await rF(u,{authType:n,configuration:r,ident:a});h&&(o={...o,authorization:h}),A&&(o={...o,...LC(A)});try{return await on.del(u+t,{configuration:r,headers:o,...p})}catch(E){if(!nF(E)||A)throw await Kh(E,{attemptedAs:e,registry:u,configuration:r,headers:o}),E;A=await sG(E,{configuration:r});let w={...o,...LC(A)};try{return await on.del(`${u}${t}`,{configuration:r,headers:w,...p})}catch(D){throw await Kh(D,{attemptedAs:e,registry:u,configuration:r,headers:o}),D}}}function xv(t,{ident:e,registry:r}){if(typeof r>"u"&&e)return TC(e.scope,{configuration:t});if(typeof r!="string")throw new Error("Assertion failed: The registry should be a string");return uc(r)}async function rF(t,{authType:e=2,configuration:r,ident:o}){let a=nG(t,{configuration:r,ident:o}),n=d1t(a,e);if(!n)return null;let u=await r.reduceHook(A=>A.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:o});if(u)return u;if(a.get("npmAuthToken"))return`Bearer ${a.get("npmAuthToken")}`;if(a.get("npmAuthIdent")){let A=a.get("npmAuthIdent");return A.includes(":")?`Basic ${Buffer.from(A).toString("base64")}`:`Basic ${A}`}if(n&&e!==1)throw new Jt(33,"No authentication configured for request");return null}function d1t(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function m1t(t,e,{configuration:r}){if(typeof e>"u"||typeof e.authorization>"u")return"an anonymous user";try{return(await on.get(new URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username??"an unknown user"}catch{return"an unknown user"}}async function sG(t,{configuration:e}){let r=t.originalError?.response.headers["npm-notice"];if(r&&(await Lt.start({configuration:e,stdout:process.stdout,includeFooter:!1},async a=>{if(a.reportInfo(0,r.replace(/(https?:\/\/\S+)/g,pe.pretty(e,"$1",pe.Type.URL))),!process.env.YARN_IS_TEST_ENV){let n=r.match(/open (https?:\/\/\S+)/i);if(n&&Xi.openUrl){let{openNow:u}=await(0,iG.prompt)({type:"confirm",name:"openNow",message:"Do you want to try to open this url now?",required:!0,initial:!0,onCancel:()=>process.exit(130)});u&&(await Xi.openUrl(n[1])||(a.reportSeparator(),a.reportWarning(0,"We failed to automatically open the url; you'll have to open it yourself in your browser of choice.")))}}}),process.stdout.write(` -`)),process.env.YARN_IS_TEST_ENV)return process.env.YARN_INJECT_NPM_2FA_TOKEN||"";let{otp:o}=await(0,iG.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return process.stdout.write(` -`),o}function nF(t){if(t.originalError?.name!=="HTTPError")return!1;try{return(t.originalError?.response.headers["www-authenticate"].split(/,\s*/).map(r=>r.toLowerCase())).includes("otp")}catch{return!1}}function LC(t){return{"npm-otp":t}}var bv=class{supports(e,r){if(!e.reference.startsWith(Zn))return!1;let{selector:o,params:a}=G.parseRange(e.reference);return!(!o2e.default.valid(o)||a===null||typeof a.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let{params:o}=G.parseRange(e.reference);if(o===null||typeof o.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let a=await gd(o.__archiveUrl,{customErrorMessage:hd,configuration:r.project.configuration,ident:e});return await $i.convertToZip(a,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}};Ve();var kv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Zn)||!G.tryParseDescriptor(e.range.slice(Zn.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){let o=r.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Zn.length),!0));return r.resolver.getResolutionDependencies(o,r)}async getCandidates(e,r,o){let a=o.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Zn.length),!0));return await o.resolver.getCandidates(a,r,o)}async getSatisfying(e,r,o,a){let n=a.project.configuration.normalizeDependency(G.parseDescriptor(e.range.slice(Zn.length),!0));return a.resolver.getSatisfying(n,r,o,a)}resolve(e,r){throw new Error("Unreachable")}};Ve();Ve();var a2e=et(ni());var rp=class t{supports(e,r){if(!e.reference.startsWith(Zn))return!1;let o=new URL(e.reference);return!(!a2e.default.valid(o.pathname)||o.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),checksum:u}}async fetchFromNetwork(e,r){let o;try{o=await gd(t.getLocatorUrl(e),{customErrorMessage:hd,configuration:r.project.configuration,ident:e})}catch{o=await gd(t.getLocatorUrl(e).replace(/%2f/g,"/"),{customErrorMessage:hd,configuration:r.project.configuration,ident:e})}return await $i.convertToZip(o,{configuration:r.project.configuration,prefixPath:G.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:o}){let a=TC(e.scope,{configuration:o}),n=t.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),a=a.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===a+n||r===a+n.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=Ur.clean(e.reference.slice(Zn.length));if(r===null)throw new Jt(10,"The npm semver resolver got selected, but the version isn't semver");return`${tF(e)}/-/${e.name}-${r}.tgz`}};Ve();Ve();Ve();var oG=et(ni());var iF=G.makeIdent(null,"node-gyp"),y1t=/\b(node-gyp|prebuild-install)\b/,Qv=class{supportsDescriptor(e,r){return e.range.startsWith(Zn)?!!Ur.validRange(e.range.slice(Zn.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Zn))return!1;let{selector:o}=G.parseRange(e.reference);return!!oG.default.valid(o)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=Ur.validRange(e.range.slice(Zn.length));if(a===null)throw new Error(`Expected a valid range, got ${e.range.slice(Zn.length)}`);let n=await NC(e,{cache:o.fetchOptions?.cache,project:o.project,version:oG.default.valid(a.raw)?a.raw:void 0}),u=qe.mapAndFilter(Object.keys(n.versions),h=>{try{let E=new Ur.SemVer(h);if(a.test(E))return E}catch{}return qe.mapAndFilter.skip}),A=u.filter(h=>!n.versions[h.raw].deprecated),p=A.length>0?A:u;return p.sort((h,E)=>-h.compare(E)),p.map(h=>{let E=G.makeLocator(e,`${Zn}${h.raw}`),w=n.versions[h.raw].dist.tarball;return rp.isConventionalTarballUrl(E,w,{configuration:o.project.configuration})?E:G.bindLocator(E,{__archiveUrl:w})})}async getSatisfying(e,r,o,a){let n=Ur.validRange(e.range.slice(Zn.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Zn.length)}`);return{locators:qe.mapAndFilter(o,p=>{if(p.identHash!==e.identHash)return qe.mapAndFilter.skip;let h=G.tryParseRange(p.reference,{requireProtocol:Zn});if(!h)return qe.mapAndFilter.skip;let E=new Ur.SemVer(h.selector);return n.test(E)?{locator:p,version:E}:qe.mapAndFilter.skip}).sort((p,h)=>-p.version.compare(h.version)).map(({locator:p})=>p),sorted:!0}}async resolve(e,r){let{selector:o}=G.parseRange(e.reference),a=Ur.clean(o);if(a===null)throw new Jt(10,"The npm semver resolver got selected, but the version isn't semver");let n=await NC(e,{cache:r.fetchOptions?.cache,project:r.project,version:a});if(!Object.hasOwn(n,"versions"))throw new Jt(15,'Registry returned invalid data for - missing "versions" field');if(!Object.hasOwn(n.versions,a))throw new Jt(16,`Registry failed to return reference "${a}"`);let u=new _t;if(u.load(n.versions[a]),!u.dependencies.has(iF.identHash)&&!u.peerDependencies.has(iF.identHash)){for(let A of u.scripts.values())if(A.match(y1t)){u.dependencies.set(iF.identHash,G.makeDescriptor(iF,"latest"));break}}return{...e,version:a,languageName:"node",linkType:"HARD",conditions:u.getConditions(),dependencies:r.project.configuration.normalizeDependencyMap(u.dependencies),peerDependencies:u.peerDependencies,dependenciesMeta:u.dependenciesMeta,peerDependenciesMeta:u.peerDependenciesMeta,bin:u.bin}}};Ve();Ve();var l2e=et(ni());var Fv=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Zn)||!by.test(e.range.slice(Zn.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,o){return e}getResolutionDependencies(e,r){return{}}async getCandidates(e,r,o){let a=e.range.slice(Zn.length),n=await NC(e,{cache:o.fetchOptions?.cache,project:o.project});if(!Object.hasOwn(n,"dist-tags"))throw new Jt(15,'Registry returned invalid data - missing "dist-tags" field');let u=n["dist-tags"];if(!Object.hasOwn(u,a))throw new Jt(16,`Registry failed to return tag "${a}"`);let A=u[a],p=G.makeLocator(e,`${Zn}${A}`),h=n.versions[A].dist.tarball;return rp.isConventionalTarballUrl(p,h,{configuration:o.project.configuration})?[p]:[G.bindLocator(p,{__archiveUrl:h})]}async getSatisfying(e,r,o,a){let n=[];for(let u of o){if(u.identHash!==e.identHash)continue;let A=G.tryParseRange(u.reference,{requireProtocol:Zn});if(!(!A||!l2e.default.valid(A.selector))){if(A.params?.__archiveUrl){let p=G.makeRange({protocol:Zn,selector:A.selector,source:null,params:null}),[h]=await a.resolver.getCandidates(G.makeDescriptor(e,p),r,a);if(u.reference!==h.reference)continue}n.push(u)}}return{locators:n,sorted:!1}}async resolve(e,r){throw new Error("Unreachable")}};var KC={};Vt(KC,{getGitHead:()=>dvt,getPublishAccess:()=>XBe,getReadmeContent:()=>ZBe,makePublishBody:()=>gvt});Ve();Ve();St();var KG={};Vt(KG,{PackCommand:()=>VC,default:()=>XBt,packUtils:()=>BA});Ve();Ve();Ve();St();Gt();var BA={};Vt(BA,{genPackList:()=>PF,genPackStream:()=>VG,genPackageManifest:()=>UBe,hasPackScripts:()=>WG,prepareForPack:()=>YG});Ve();St();var GG=et(Xo()),OBe=et(RBe()),MBe=ve("zlib"),_Bt=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],HBt=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function WG(t){return!!(hn.hasWorkspaceScript(t,"prepack")||hn.hasWorkspaceScript(t,"postpack"))}async function YG(t,{report:e},r){await hn.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let o=V.join(t.cwd,_t.fileName);await ae.existsPromise(o)&&await t.manifest.loadFile(o,{baseFs:ae}),await r()}finally{await hn.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function VG(t,e){typeof e>"u"&&(e=await PF(t));let r=new Set;for(let n of t.manifest.publishConfig?.executableFiles??new Set)r.add(V.normalize(n));for(let n of t.manifest.bin.values())r.add(V.normalize(n));let o=OBe.default.pack();process.nextTick(async()=>{for(let n of e){let u=V.normalize(n),A=V.resolve(t.cwd,u),p=V.join("package",u),h=await ae.lstatPromise(A),E={name:p,mtime:new Date(Si.SAFE_TIME*1e3)},w=r.has(u)?493:420,D,b,C=new Promise((N,U)=>{D=N,b=U}),T=N=>{N?b(N):D()};if(h.isFile()){let N;u==="package.json"?N=Buffer.from(JSON.stringify(await UBe(t),null,2)):N=await ae.readFilePromise(A),o.entry({...E,mode:w,type:"file"},N,T)}else h.isSymbolicLink()?o.entry({...E,mode:w,type:"symlink",linkname:await ae.readlinkPromise(A)},T):T(new Error(`Unsupported file type ${h.mode} for ${Ae.fromPortablePath(u)}`));await C}o.finalize()});let a=(0,MBe.createGzip)();return o.pipe(a),a}async function UBe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function PF(t){let e=t.project,r=e.configuration,o={accept:[],reject:[]};for(let w of HBt)o.reject.push(w);for(let w of _Bt)o.accept.push(w);o.reject.push(r.get("rcFilename"));let a=w=>{if(w===null||!w.startsWith(`${t.cwd}/`))return;let D=V.relative(t.cwd,w),b=V.resolve(Bt.root,D);o.reject.push(b)};a(V.resolve(e.cwd,mr.lockfile)),a(r.get("cacheFolder")),a(r.get("globalFolder")),a(r.get("installStatePath")),a(r.get("virtualFolder")),a(r.get("yarnPath")),await r.triggerHook(w=>w.populateYarnPaths,e,w=>{a(w)});for(let w of e.workspaces){let D=V.relative(t.cwd,w.cwd);D!==""&&!D.match(/^(\.\.)?\//)&&o.reject.push(`/${D}`)}let n={accept:[],reject:[]},u=t.manifest.publishConfig?.main??t.manifest.main,A=t.manifest.publishConfig?.module??t.manifest.module,p=t.manifest.publishConfig?.browser??t.manifest.browser,h=t.manifest.publishConfig?.bin??t.manifest.bin;u!=null&&n.accept.push(V.resolve(Bt.root,u)),A!=null&&n.accept.push(V.resolve(Bt.root,A)),typeof p=="string"&&n.accept.push(V.resolve(Bt.root,p));for(let w of h.values())n.accept.push(V.resolve(Bt.root,w));if(p instanceof Map)for(let[w,D]of p.entries())n.accept.push(V.resolve(Bt.root,w)),typeof D=="string"&&n.accept.push(V.resolve(Bt.root,D));let E=t.manifest.files!==null;if(E){n.reject.push("/*");for(let w of t.manifest.files)_Be(n.accept,w,{cwd:Bt.root})}return await qBt(t.cwd,{hasExplicitFileList:E,globalList:o,ignoreList:n})}async function qBt(t,{hasExplicitFileList:e,globalList:r,ignoreList:o}){let a=[],n=new Gu(t),u=[[Bt.root,[o]]];for(;u.length>0;){let[A,p]=u.pop(),h=await n.lstatPromise(A);if(!LBe(A,{globalList:r,ignoreLists:h.isDirectory()?null:p}))if(h.isDirectory()){let E=await n.readdirPromise(A),w=!1,D=!1;if(!e||A!==Bt.root)for(let T of E)w=w||T===".gitignore",D=D||T===".npmignore";let b=D?await TBe(n,A,".npmignore"):w?await TBe(n,A,".gitignore"):null,C=b!==null?[b].concat(p):p;LBe(A,{globalList:r,ignoreLists:p})&&(C=[...p,{accept:[],reject:["**/*"]}]);for(let T of E)u.push([V.resolve(A,T),C])}else(h.isFile()||h.isSymbolicLink())&&a.push(V.relative(Bt.root,A))}return a.sort()}async function TBe(t,e,r){let o={accept:[],reject:[]},a=await t.readFilePromise(V.join(e,r),"utf8");for(let n of a.split(/\n/g))_Be(o.reject,n,{cwd:e});return o}function jBt(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=V.resolve(e,t)),r&&(t=`!${t}`),t}function _Be(t,e,{cwd:r}){let o=e.trim();o===""||o[0]==="#"||t.push(jBt(o,{cwd:r}))}function LBe(t,{globalList:e,ignoreLists:r}){let o=SF(t,e.accept);if(o!==0)return o===2;let a=SF(t,e.reject);if(a!==0)return a===1;if(r!==null)for(let n of r){let u=SF(t,n.accept);if(u!==0)return u===2;let A=SF(t,n.reject);if(A!==0)return A===1}return!1}function SF(t,e){let r=e,o=[];for(let a=0;a{await YG(a,{report:p},async()=>{p.reportJson({base:Ae.fromPortablePath(a.cwd)});let h=await PF(a);for(let E of h)p.reportInfo(null,Ae.fromPortablePath(E)),p.reportJson({location:Ae.fromPortablePath(E)});if(!this.dryRun){let E=await VG(a,h);await ae.mkdirPromise(V.dirname(u),{recursive:!0});let w=ae.createWriteStream(u);E.pipe(w),await new Promise(D=>{w.on("finish",D)})}}),this.dryRun||(p.reportInfo(0,`Package archive generated in ${pe.pretty(r,u,pe.Type.PATH)}`),p.reportJson({output:Ae.fromPortablePath(u)}))})).exitCode()}};function GBt(t,{workspace:e}){let r=t.replace("%s",WBt(e)).replace("%v",YBt(e));return Ae.toPortablePath(r)}function WBt(t){return t.manifest.name!==null?G.slugifyIdent(t.manifest.name):"package"}function YBt(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var VBt=["dependencies","devDependencies","peerDependencies"],KBt="workspace:",JBt=(t,e)=>{e.publishConfig&&(e.publishConfig.type&&(e.type=e.publishConfig.type),e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.imports&&(e.imports=e.publishConfig.imports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let o of VBt)for(let a of t.manifest.getForScope(o).values()){let n=r.tryWorkspaceByDescriptor(a),u=G.parseRange(a.range);if(u.protocol===KBt)if(n===null){if(r.tryWorkspaceByIdent(a)===null)throw new Jt(21,`${G.prettyDescriptor(r.configuration,a)}: No local workspace found for this range`)}else{let A;G.areDescriptorsEqual(a,n.anchoredDescriptor)||u.selector==="*"?A=n.manifest.version??"0.0.0":u.selector==="~"||u.selector==="^"?A=`${u.selector}${n.manifest.version??"0.0.0"}`:A=u.selector;let p=o==="dependencies"?G.makeDescriptor(a,"unknown"):null,h=p!==null&&t.manifest.ensureDependencyMeta(p).optional?"optionalDependencies":o;e[h][G.stringifyIdent(a)]=A}}},zBt={hooks:{beforeWorkspacePacking:JBt},commands:[VC]},XBt=zBt;var JBe=ve("crypto"),zBe=et(KBe());async function gvt(t,e,{access:r,tag:o,registry:a,gitHead:n}){let u=t.manifest.name,A=t.manifest.version,p=G.stringifyIdent(u),h=(0,JBe.createHash)("sha1").update(e).digest("hex"),E=zBe.default.fromData(e).toString(),w=r??XBe(t,u),D=await ZBe(t),b=await BA.genPackageManifest(t),C=`${p}-${A}.tgz`,T=new URL(`${uc(a)}/${p}/-/${C}`);return{_id:p,_attachments:{[C]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:p,access:w,"dist-tags":{[o]:A},versions:{[A]:{...b,_id:`${p}@${A}`,name:p,version:A,gitHead:n,dist:{shasum:h,integrity:E,tarball:T.toString()}}},readme:D}}async function dvt(t){try{let{stdout:e}=await Hr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}function XBe(t,e){let r=t.project.configuration;return t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?t.manifest.publishConfig.access:r.get("npmPublishAccess")!==null?r.get("npmPublishAccess"):e.scope?"restricted":"public"}async function ZBe(t){let e=Ae.toPortablePath(`${t.cwd}/README.md`),r=t.manifest.name,a=`# ${G.stringifyIdent(r)} -`;try{a=await ae.readFilePromise(e,"utf8")}catch(n){if(n.code==="ENOENT")return a;throw n}return a}var ZG={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"BOOLEAN",default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:"SECRET",default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:"SECRET",default:null}},$Be={npmAuditRegistry:{description:"Registry to query for audit reports",type:"STRING",default:null},npmPublishRegistry:{description:"Registry to push packages to",type:"STRING",default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:"STRING",default:"https://registry.yarnpkg.com"}},mvt={configuration:{...ZG,...$Be,npmScopes:{description:"Settings per package scope",type:"MAP",valueDefinition:{description:"",type:"SHAPE",properties:{...ZG,...$Be}}},npmRegistries:{description:"Settings per registry",type:"MAP",normalizeKeys:uc,valueDefinition:{description:"",type:"SHAPE",properties:{...ZG}}}},fetchers:[bv,rp],resolvers:[kv,Qv,Fv]},yvt=mvt;var l5={};Vt(l5,{NpmAuditCommand:()=>zC,NpmInfoCommand:()=>XC,NpmLoginCommand:()=>ZC,NpmLogoutCommand:()=>eI,NpmPublishCommand:()=>tI,NpmTagAddCommand:()=>nI,NpmTagListCommand:()=>rI,NpmTagRemoveCommand:()=>iI,NpmWhoamiCommand:()=>sI,default:()=>Dvt,npmAuditTypes:()=>Xv,npmAuditUtils:()=>xF});Ve();Ve();Gt();var i5=et(Xo());il();var Xv={};Vt(Xv,{Environment:()=>Jv,Severity:()=>zv});var Jv=(o=>(o.All="all",o.Production="production",o.Development="development",o))(Jv||{}),zv=(n=>(n.Info="info",n.Low="low",n.Moderate="moderate",n.High="high",n.Critical="critical",n))(zv||{});var xF={};Vt(xF,{allSeverities:()=>JC,getPackages:()=>n5,getReportTree:()=>t5,getSeverityInclusions:()=>e5,getTopLevelDependencies:()=>r5});Ve();var eve=et(ni());var JC=["info","low","moderate","high","critical"];function e5(t){if(typeof t>"u")return new Set(JC);let e=JC.indexOf(t),r=JC.slice(e);return new Set(r)}function t5(t){let e={},r={children:e};for(let[o,a]of qe.sortMap(Object.entries(t),n=>n[0]))for(let n of qe.sortMap(a,u=>`${u.id}`))e[`${o}/${n.id}`]={value:pe.tuple(pe.Type.IDENT,G.parseIdent(o)),children:{ID:typeof n.id<"u"&&{label:"ID",value:pe.tuple(pe.Type.ID,n.id)},Issue:{label:"Issue",value:pe.tuple(pe.Type.NO_HINT,n.title)},URL:typeof n.url<"u"&&{label:"URL",value:pe.tuple(pe.Type.URL,n.url)},Severity:{label:"Severity",value:pe.tuple(pe.Type.NO_HINT,n.severity)},"Vulnerable Versions":{label:"Vulnerable Versions",value:pe.tuple(pe.Type.RANGE,n.vulnerable_versions)},"Tree Versions":{label:"Tree Versions",children:[...n.versions].sort(eve.default.compare).map(u=>({value:pe.tuple(pe.Type.REFERENCE,u)}))},Dependents:{label:"Dependents",children:qe.sortMap(n.dependents,u=>G.stringifyLocator(u)).map(u=>({value:pe.tuple(pe.Type.LOCATOR,u)}))}}};return r}function r5(t,e,{all:r,environment:o}){let a=[],n=r?t.workspaces:[e],u=["all","production"].includes(o),A=["all","development"].includes(o);for(let p of n)for(let h of p.anchoredPackage.dependencies.values())(p.manifest.devDependencies.has(h.identHash)?!A:!u)||a.push({workspace:p,dependency:h});return a}function n5(t,e,{recursive:r}){let o=new Map,a=new Set,n=[],u=(A,p)=>{let h=t.storedResolutions.get(p.descriptorHash);if(typeof h>"u")throw new Error("Assertion failed: The resolution should have been registered");if(!a.has(h))a.add(h);else return;let E=t.storedPackages.get(h);if(typeof E>"u")throw new Error("Assertion failed: The package should have been registered");if(G.ensureDevirtualizedLocator(E).reference.startsWith("npm:")&&E.version!==null){let D=G.stringifyIdent(E),b=qe.getMapWithDefault(o,D);qe.getArrayWithDefault(b,E.version).push(A)}if(r)for(let D of E.dependencies.values())n.push([E,D])};for(let{workspace:A,dependency:p}of e)n.push([A.anchoredLocator,p]);for(;n.length>0;){let[A,p]=n.shift();u(A,p)}return o}var zC=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=de.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=de.String("--environment","all",{description:"Which environments to cover",validator:js(Jv)});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.noDeprecations=de.Boolean("--no-deprecations",!1,{description:"Don't warn about deprecated packages"});this.severity=de.String("--severity","info",{description:"Minimal severity requested for packages to be displayed",validator:js(zv)});this.excludes=de.Array("--exclude",[],{description:"Array of glob patterns of packages to exclude from audit"});this.ignores=de.Array("--ignore",[],{description:"Array of glob patterns of advisory ID's to ignore in the audit report"})}static{this.paths=[["npm","audit"]]}static{this.usage=ot.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${JC.map(r=>`\`${r}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - If certain packages produce false positives for a particular environment, the \`--exclude\` flag can be used to exclude any number of packages from the audit. This can also be set in the configuration file with the \`npmAuditExcludePackages\` option. - - If particular advisories are needed to be ignored, the \`--ignore\` flag can be used with Advisory ID's to ignore any number of advisories in the audit report. This can also be set in the configuration file with the \`npmAuditIgnoreAdvisories\` option. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why package\` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"],["Exclude certain packages","yarn npm audit --exclude package1 --exclude package2"],["Ignore specific advisories","yarn npm audit --ignore 1234567 --ignore 7654321"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=r5(o,a,{all:this.all,environment:this.environment}),u=n5(o,n,{recursive:this.recursive}),A=Array.from(new Set([...r.get("npmAuditExcludePackages"),...this.excludes])),p=Object.create(null);for(let[N,U]of u)A.some(J=>i5.default.isMatch(N,J))||(p[N]=[...U.keys()]);let h=si.getAuditRegistry({configuration:r}),E,w=await pA.start({configuration:r,stdout:this.context.stdout},async()=>{let N=en.post("/-/npm/v1/security/advisories/bulk",p,{authType:en.AuthType.BEST_EFFORT,configuration:r,jsonResponse:!0,registry:h}),U=this.noDeprecations?[]:await Promise.all(Array.from(Object.entries(p),async([te,le])=>{let ce=await en.getPackageMetadata(G.parseIdent(te),{project:o});return qe.mapAndFilter(le,ue=>{let{deprecated:Ie}=ce.versions[ue];return Ie?[te,ue,Ie]:qe.mapAndFilter.skip})})),J=await N;for(let[te,le,ce]of U.flat(1))Object.hasOwn(J,te)&&J[te].some(ue=>Ur.satisfiesWithPrereleases(le,ue.vulnerable_versions))||(J[te]??=[],J[te].push({id:`${te} (deprecation)`,title:ce.trim()||"This package has been deprecated.",severity:"moderate",vulnerable_versions:le}));E=J});if(w.hasErrors())return w.exitCode();let D=e5(this.severity),b=Array.from(new Set([...r.get("npmAuditIgnoreAdvisories"),...this.ignores])),C=Object.create(null);for(let[N,U]of Object.entries(E)){let J=U.filter(te=>!i5.default.isMatch(`${te.id}`,b)&&D.has(te.severity));J.length>0&&(C[N]=J.map(te=>{let le=u.get(N);if(typeof le>"u")throw new Error("Assertion failed: Expected the registry to only return packages that were requested");let ce=[...le.keys()].filter(Ie=>Ur.satisfiesWithPrereleases(Ie,te.vulnerable_versions)),ue=new Map;for(let Ie of ce)for(let he of le.get(Ie))ue.set(he.locatorHash,he);return{...te,versions:ce,dependents:[...ue.values()]}}))}let T=Object.keys(C).length>0;return T?(As.emitTree(t5(C),{configuration:r,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async N=>{N.reportInfo(1,"No audit suggestions")}),T?1:0)}};Ve();Ve();St();Gt();var s5=et(ni()),o5=ve("util"),XC=class extends ut{constructor(){super(...arguments);this.fields=de.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=de.Rest()}static{this.paths=[["npm","info"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command fetches information about a package from the npm registry and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range or to the corresponding tagged version. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package information.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react@16.12.0","yarn npm info react@16.12.0"],["Show all available information about react@next","yarn npm info react@next"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),a=typeof this.fields<"u"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],u=!1,A=await Lt.start({configuration:r,includeFooter:!1,json:this.json,stdout:this.context.stdout},async p=>{for(let h of this.packages){let E;if(h==="."){let le=o.topLevelWorkspace;if(!le.manifest.name)throw new it(`Missing ${pe.pretty(r,"name",pe.Type.CODE)} field in ${Ae.fromPortablePath(V.join(le.cwd,mr.manifest))}`);E=G.makeDescriptor(le.manifest.name,"unknown")}else E=G.parseDescriptor(h);let w=en.getIdentUrl(E),D=a5(await en.get(w,{configuration:r,ident:E,jsonResponse:!0,customErrorMessage:en.customPackageError})),b=Object.keys(D.versions).sort(s5.default.compareLoose),T=D["dist-tags"].latest||b[b.length-1],N=Ur.validRange(E.range);if(N){let le=s5.default.maxSatisfying(b,N);le!==null?T=le:(p.reportWarning(0,`Unmet range ${G.prettyRange(r,E.range)}; falling back to the latest version`),u=!0)}else Object.hasOwn(D["dist-tags"],E.range)?T=D["dist-tags"][E.range]:E.range!=="unknown"&&(p.reportWarning(0,`Unknown tag ${G.prettyRange(r,E.range)}; falling back to the latest version`),u=!0);let U=D.versions[T],J={...D,...U,version:T,versions:b},te;if(a!==null){te={};for(let le of a){let ce=J[le];if(typeof ce<"u")te[le]=ce;else{p.reportWarning(1,`The ${pe.pretty(r,le,pe.Type.CODE)} field doesn't exist inside ${G.prettyIdent(r,E)}'s information`),u=!0;continue}}}else this.json||(delete J.dist,delete J.readme,delete J.users),te=J;p.reportJson(te),this.json||n.push(te)}});o5.inspect.styles.name="cyan";for(let p of n)(p!==n[0]||u)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,o5.inspect)(p,{depth:1/0,colors:!0,compact:!1})} -`);return A.exitCode()}};function a5(t){if(Array.isArray(t)){let e=[];for(let r of t)r=a5(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let o=a5(t[r]);o&&(e[r]=o)}return e}else return t||null}Ve();Ve();Gt();var tve=et(Q2()),ZC=class extends ut{constructor(){super(...arguments);this.scope=de.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=de.Boolean("--publish",!1,{description:"Login to the publish registry"});this.alwaysAuth=de.Boolean("--always-auth",{description:"Set the npmAlwaysAuth configuration"})}static{this.paths=[["npm","login"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=await bF({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Lt.start({configuration:r,stdout:this.context.stdout,includeFooter:!1},async n=>{let u=await Ivt({configuration:r,registry:o,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),A=await Evt(o,u,r);return await Cvt(o,A,{alwaysAuth:this.alwaysAuth,scope:this.scope}),n.reportInfo(0,"Successfully logged in")})).exitCode()}};async function bF({scope:t,publish:e,configuration:r,cwd:o}){return t&&e?si.getScopeRegistry(t,{configuration:r,type:si.RegistryType.PUBLISH_REGISTRY}):t?si.getScopeRegistry(t,{configuration:r}):e?si.getPublishRegistry((await aE(r,o)).manifest,{configuration:r}):si.getDefaultRegistry({configuration:r})}async function Evt(t,e,r){let o=`/-/user/org.couchdb.user:${encodeURIComponent(e.name)}`,a={_id:`org.couchdb.user:${e.name}`,name:e.name,password:e.password,type:"user",roles:[],date:new Date().toISOString()},n={attemptedAs:e.name,configuration:r,registry:t,jsonResponse:!0,authType:en.AuthType.NO_AUTH};try{return(await en.put(o,a,n)).token}catch(E){if(!(E.originalError?.name==="HTTPError"&&E.originalError?.response.statusCode===409))throw E}let u={...n,authType:en.AuthType.NO_AUTH,headers:{authorization:`Basic ${Buffer.from(`${e.name}:${e.password}`).toString("base64")}`}},A=await en.get(o,u);for(let[E,w]of Object.entries(A))(!a[E]||E==="roles")&&(a[E]=w);let p=`${o}/-rev/${a._rev}`;return(await en.put(p,a,u)).token}async function Cvt(t,e,{alwaysAuth:r,scope:o}){let a=u=>A=>{let p=qe.isIndexableObject(A)?A:{},h=p[u],E=qe.isIndexableObject(h)?h:{};return{...p,[u]:{...E,...r!==void 0?{npmAlwaysAuth:r}:{},npmAuthToken:e}}},n=o?{npmScopes:a(o)}:{npmRegistries:a(t)};return await ze.updateHomeConfiguration(n)}async function Ivt({configuration:t,registry:e,report:r,stdin:o,stdout:a}){r.reportInfo(0,`Logging in to ${pe.pretty(t,e,pe.Type.URL)}`);let n=!1;if(e.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(r.reportInfo(0,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),r.reportSeparator(),t.env.YARN_IS_TEST_ENV)return{name:t.env.YARN_INJECT_NPM_USER||"",password:t.env.YARN_INJECT_NPM_PASSWORD||""};let u=await(0,tve.prompt)([{type:"input",name:"name",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:o,stdout:a}]);return r.reportSeparator(),u}Ve();Ve();Gt();var $C=new Set(["npmAuthIdent","npmAuthToken"]),eI=class extends ut{constructor(){super(...arguments);this.scope=de.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=de.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=de.Boolean("-A,--all",!1,{description:"Logout of all registries"})}static{this.paths=[["npm","logout"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o=async()=>{let n=await bF({configuration:r,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),u=await ze.find(this.context.cwd,this.context.plugins),A=G.makeIdent(this.scope??null,"pkg");return!si.getAuthConfiguration(n,{configuration:u,ident:A}).get("npmAuthToken")};return(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{if(this.all&&(await Bvt(),n.reportInfo(0,"Successfully logged out from everything")),this.scope){await rve("npmScopes",this.scope),await o()?n.reportInfo(0,`Successfully logged out from ${this.scope}`):n.reportWarning(0,"Scope authentication settings removed, but some other ones settings still apply to it");return}let u=await bF({configuration:r,cwd:this.context.cwd,publish:this.publish});await rve("npmRegistries",u),await o()?n.reportInfo(0,`Successfully logged out from ${u}`):n.reportWarning(0,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};function wvt(t,e){let r=t[e];if(!qe.isIndexableObject(r))return!1;let o=new Set(Object.keys(r));if([...$C].every(n=>!o.has(n)))return!1;for(let n of $C)o.delete(n);if(o.size===0)return t[e]=void 0,!0;let a={...r};for(let n of $C)delete a[n];return t[e]=a,!0}async function Bvt(){let t=e=>{let r=!1,o=qe.isIndexableObject(e)?{...e}:{};o.npmAuthToken&&(delete o.npmAuthToken,r=!0);for(let a of Object.keys(o))wvt(o,a)&&(r=!0);if(Object.keys(o).length!==0)return r?o:e};return await ze.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function rve(t,e){return await ze.updateHomeConfiguration({[t]:r=>{let o=qe.isIndexableObject(r)?r:{};if(!Object.hasOwn(o,e))return r;let a=o[e],n=qe.isIndexableObject(a)?a:{},u=new Set(Object.keys(n));if([...$C].every(p=>!u.has(p)))return r;for(let p of $C)u.delete(p);if(u.size===0)return Object.keys(o).length===1?void 0:{...o,[e]:void 0};let A={};for(let p of $C)A[p]=void 0;return{...o,[e]:{...n,...A}}}})}Ve();Gt();var tI=class extends ut{constructor(){super(...arguments);this.access=de.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=de.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=de.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"});this.otp=de.String("--otp",{description:"The OTP token to use with the command"})}static{this.paths=[["npm","publish"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overridden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);if(a.manifest.private)throw new it("Private workspaces cannot be published");if(a.manifest.name===null||a.manifest.version===null)throw new it("Workspaces must have valid names and versions to be published on an external registry");await o.restoreInstallState();let n=a.manifest.name,u=a.manifest.version,A=si.getPublishRegistry(a.manifest,{configuration:r});return(await Lt.start({configuration:r,stdout:this.context.stdout},async h=>{if(this.tolerateRepublish)try{let E=await en.get(en.getIdentUrl(n),{configuration:r,registry:A,ident:n,jsonResponse:!0});if(!Object.hasOwn(E,"versions"))throw new Jt(15,'Registry returned invalid data for - missing "versions" field');if(Object.hasOwn(E.versions,u)){h.reportWarning(0,`Registry already knows about version ${u}; skipping.`);return}}catch(E){if(E.originalError?.response?.statusCode!==404)throw E}await hn.maybeExecuteWorkspaceLifecycleScript(a,"prepublish",{report:h}),await BA.prepareForPack(a,{report:h},async()=>{let E=await BA.genPackList(a);for(let T of E)h.reportInfo(null,T);let w=await BA.genPackStream(a,E),D=await qe.bufferStream(w),b=await KC.getGitHead(a.cwd),C=await KC.makePublishBody(a,D,{access:this.access,tag:this.tag,registry:A,gitHead:b});await en.put(en.getIdentUrl(n),C,{configuration:r,registry:A,ident:n,otp:this.otp,jsonResponse:!0})}),h.reportInfo(0,"Package archive published")})).exitCode()}};Ve();Gt();var nve=et(ni());Ve();St();Gt();var rI=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=de.String({required:!1})}static{this.paths=[["npm","tag","list"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n;if(typeof this.package<"u")n=G.parseIdent(this.package);else{if(!a)throw new or(o.cwd,this.context.cwd);if(!a.manifest.name)throw new it(`Missing 'name' field in ${Ae.fromPortablePath(V.join(a.cwd,mr.manifest))}`);n=a.manifest.name}let u=await Zv(n,r),p={children:qe.sortMap(Object.entries(u),([h])=>h).map(([h,E])=>({value:pe.tuple(pe.Type.RESOLUTION,{descriptor:G.makeDescriptor(n,h),locator:G.makeLocator(n,E)})}))};return As.emitTree(p,{configuration:r,json:this.json,stdout:this.context.stdout})}};async function Zv(t,e){let r=`/-/package${en.getIdentUrl(t)}/dist-tags`;return en.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:en.customPackageError})}var nI=class extends ut{constructor(){super(...arguments);this.package=de.String();this.tag=de.String()}static{this.paths=[["npm","tag","add"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=G.parseDescriptor(this.package,!0),u=n.range;if(!nve.default.valid(u))throw new it(`The range ${pe.pretty(r,n.range,pe.Type.RANGE)} must be a valid semver version`);let A=si.getPublishRegistry(a.manifest,{configuration:r}),p=pe.pretty(r,n,pe.Type.IDENT),h=pe.pretty(r,u,pe.Type.RANGE),E=pe.pretty(r,this.tag,pe.Type.CODE);return(await Lt.start({configuration:r,stdout:this.context.stdout},async D=>{let b=await Zv(n,r);Object.hasOwn(b,this.tag)&&b[this.tag]===u&&D.reportWarning(0,`Tag ${E} is already set to version ${h}`);let C=`/-/package${en.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await en.put(C,u,{configuration:r,registry:A,ident:n,jsonRequest:!0,jsonResponse:!0}),D.reportInfo(0,`Tag ${E} added to version ${h} of package ${p}`)})).exitCode()}};Ve();Gt();var iI=class extends ut{constructor(){super(...arguments);this.package=de.String();this.tag=de.String()}static{this.paths=[["npm","tag","remove"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]})}async execute(){if(this.tag==="latest")throw new it("The 'latest' tag cannot be removed.");let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=G.parseIdent(this.package),u=si.getPublishRegistry(a.manifest,{configuration:r}),A=pe.pretty(r,this.tag,pe.Type.CODE),p=pe.pretty(r,n,pe.Type.IDENT),h=await Zv(n,r);if(!Object.hasOwn(h,this.tag))throw new it(`${A} is not a tag of package ${p}`);return(await Lt.start({configuration:r,stdout:this.context.stdout},async w=>{let D=`/-/package${en.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await en.del(D,{configuration:r,registry:u,ident:n,jsonResponse:!0}),w.reportInfo(0,`Tag ${A} removed from package ${p}`)})).exitCode()}};Ve();Ve();Gt();var sI=class extends ut{constructor(){super(...arguments);this.scope=de.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=de.Boolean("--publish",!1,{description:"Print username for the publish registry"})}static{this.paths=[["npm","whoami"]]}static{this.usage=ot.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),o;return this.scope&&this.publish?o=si.getScopeRegistry(this.scope,{configuration:r,type:si.RegistryType.PUBLISH_REGISTRY}):this.scope?o=si.getScopeRegistry(this.scope,{configuration:r}):this.publish?o=si.getPublishRegistry((await aE(r,this.context.cwd)).manifest,{configuration:r}):o=si.getDefaultRegistry({configuration:r}),(await Lt.start({configuration:r,stdout:this.context.stdout},async n=>{let u;try{u=await en.get("/-/whoami",{configuration:r,registry:o,authType:en.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?G.makeIdent(this.scope,""):void 0})}catch(A){if(A.response?.statusCode===401||A.response?.statusCode===403){n.reportError(41,"Authentication failed - your credentials may have expired");return}else throw A}n.reportInfo(0,u.username)})).exitCode()}};var vvt={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:"STRING",default:null},npmAuditExcludePackages:{description:"Array of glob patterns of packages to exclude from npm audit",type:"STRING",default:[],isArray:!0},npmAuditIgnoreAdvisories:{description:"Array of glob patterns of advisory IDs to exclude from npm audit",type:"STRING",default:[],isArray:!0}},commands:[zC,XC,ZC,eI,tI,nI,rI,iI,sI]},Dvt=vvt;var g5={};Vt(g5,{PatchCommand:()=>AI,PatchCommitCommand:()=>uI,PatchFetcher:()=>nD,PatchResolver:()=>iD,default:()=>jvt,patchUtils:()=>Id});Ve();Ve();St();sA();var Id={};Vt(Id,{applyPatchFile:()=>QF,diffFolders:()=>p5,ensureUnpatchedDescriptor:()=>c5,ensureUnpatchedLocator:()=>RF,extractPackageToDisk:()=>f5,extractPatchFlags:()=>uve,isParentRequired:()=>A5,isPatchDescriptor:()=>FF,isPatchLocator:()=>i0,loadPatchFiles:()=>rD,makeDescriptor:()=>TF,makeLocator:()=>u5,makePatchHash:()=>h5,parseDescriptor:()=>eD,parseLocator:()=>tD,parsePatchFile:()=>$v,unpatchDescriptor:()=>_vt,unpatchLocator:()=>Hvt});Ve();St();Ve();St();var Svt=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function oI(t){return V.relative(Bt.root,V.resolve(Bt.root,Ae.toPortablePath(t)))}function Pvt(t){let e=t.trim().match(Svt);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var xvt=420,bvt=493;var ive=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),kvt=t=>({header:Pvt(t),parts:[]}),Qvt={"@":"header","-":"deletion","+":"insertion"," ":"context","\\":"pragma",undefined:"context"};function Fvt(t){let e=[],r=ive(),o="parsing header",a=null,n=null;function u(){a&&(n&&(a.parts.push(n),n=null),r.hunks.push(a),a=null)}function A(){u(),e.push(r),r=ive()}for(let p=0;p0?"patch":"mode change",J=null;switch(U){case"rename":{if(!E||!w)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:o,fromPath:oI(E),toPath:oI(w)}),J=w}break;case"file deletion":{let te=a||C;if(!te)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:o,hunk:N&&N[0]||null,path:oI(te),mode:kF(p),hash:D})}break;case"file creation":{let te=n||T;if(!te)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:o,hunk:N&&N[0]||null,path:oI(te),mode:kF(h),hash:b})}break;case"patch":case"mode change":J=T||n;break;default:qe.assertNever(U);break}J&&u&&A&&u!==A&&e.push({type:"mode change",semverExclusivity:o,path:oI(J),oldMode:kF(u),newMode:kF(A)}),J&&N&&N.length&&e.push({type:"patch",semverExclusivity:o,path:oI(J),hunks:N,beforeHash:D,afterHash:b})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function kF(t){let e=parseInt(t,8)&511;if(e!==xvt&&e!==bvt)throw new Error(`Unexpected file mode string: ${t}`);return e}function $v(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),Rvt(Fvt(e))}function Tvt(t){let e=0,r=0;for(let{type:o,lines:a}of t.parts)switch(o){case"context":r+=a.length,e+=a.length;break;case"deletion":e+=a.length;break;case"insertion":r+=a.length;break;default:qe.assertNever(o);break}if(e!==t.header.original.length||r!==t.header.patched.length){let o=a=>a<0?a:`+${a}`;throw new Error(`hunk header integrity check failed (expected @@ ${o(t.header.original.length)} ${o(t.header.patched.length)} @@, got @@ ${o(e)} ${o(r)} @@)`)}}Ve();St();var aI=class extends Error{constructor(r,o){super(`Cannot apply hunk #${r+1}`);this.hunk=o}};async function lI(t,e,r){let o=await t.lstatPromise(e),a=await r();typeof a<"u"&&(e=a),await t.lutimesPromise(e,o.atime,o.mtime)}async function QF(t,{baseFs:e=new _n,dryRun:r=!1,version:o=null}={}){for(let a of t)if(!(a.semverExclusivity!==null&&o!==null&&!Ur.satisfiesWithPrereleases(o,a.semverExclusivity)))switch(a.type){case"file deletion":if(r){if(!e.existsSync(a.path))throw new Error(`Trying to delete a file that doesn't exist: ${a.path}`)}else await lI(e,V.dirname(a.path),async()=>{await e.unlinkPromise(a.path)});break;case"rename":if(r){if(!e.existsSync(a.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${a.fromPath}`)}else await lI(e,V.dirname(a.fromPath),async()=>{await lI(e,V.dirname(a.toPath),async()=>{await lI(e,a.fromPath,async()=>(await e.movePromise(a.fromPath,a.toPath),a.toPath))})});break;case"file creation":if(r){if(e.existsSync(a.path))throw new Error(`Trying to create a file that already exists: ${a.path}`)}else{let n=a.hunk?a.hunk.parts[0].lines.join(` -`)+(a.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(V.dirname(a.path),{chmod:493,utimes:[Si.SAFE_TIME,Si.SAFE_TIME]}),await e.writeFilePromise(a.path,n,{mode:a.mode}),await e.utimesPromise(a.path,Si.SAFE_TIME,Si.SAFE_TIME)}break;case"patch":await lI(e,a.path,async()=>{await Ovt(a,{baseFs:e,dryRun:r})});break;case"mode change":{let u=(await e.statPromise(a.path)).mode;if(sve(a.newMode)!==sve(u))continue;await lI(e,a.path,async()=>{await e.chmodPromise(a.path,a.newMode)})}break;default:qe.assertNever(a);break}}function sve(t){return(t&64)>0}function ove(t){return t.replace(/\s+$/,"")}function Nvt(t,e){return ove(t)===ove(e)}async function Ovt({hunks:t,path:e},{baseFs:r,dryRun:o=!1}){let a=await r.statSync(e).mode,u=(await r.readFileSync(e,"utf8")).split(/\n/),A=[],p=0,h=0;for(let w of t){let D=Math.max(h,w.header.patched.start+p),b=Math.max(0,D-h),C=Math.max(0,u.length-D-w.header.original.length),T=Math.max(b,C),N=0,U=0,J=null;for(;N<=T;){if(N<=b&&(U=D-N,J=ave(w,u,U),J!==null)){N=-N;break}if(N<=C&&(U=D+N,J=ave(w,u,U),J!==null))break;N+=1}if(J===null)throw new aI(t.indexOf(w),w);A.push(J),p+=N,h=U+w.header.original.length}if(o)return;let E=0;for(let w of A)for(let D of w)switch(D.type){case"splice":{let b=D.index+E;u.splice(b,D.numToDelete,...D.linesToInsert),E+=D.linesToInsert.length-D.numToDelete}break;case"pop":u.pop();break;case"push":u.push(D.line);break;default:qe.assertNever(D);break}await r.writeFilePromise(e,u.join(` -`),{mode:a})}function ave(t,e,r){let o=[];for(let a of t.parts)switch(a.type){case"context":case"deletion":{for(let n of a.lines){let u=e[r];if(u==null||!Nvt(u,n))return null;r+=1}a.type==="deletion"&&(o.push({type:"splice",index:r-a.lines.length,numToDelete:a.lines.length,linesToInsert:[]}),a.noNewlineAtEndOfFile&&o.push({type:"push",line:""}))}break;case"insertion":o.push({type:"splice",index:r,numToDelete:0,linesToInsert:a.lines}),a.noNewlineAtEndOfFile&&o.push({type:"pop"});break;default:qe.assertNever(a.type);break}return o}var Uvt=/^builtin<([^>]+)>$/;function cI(t,e){let{protocol:r,source:o,selector:a,params:n}=G.parseRange(t);if(r!=="patch:")throw new Error("Invalid patch range");if(o===null)throw new Error("Patch locators must explicitly define their source");let u=a?a.split(/&/).map(E=>Ae.toPortablePath(E)):[],A=n&&typeof n.locator=="string"?G.parseLocator(n.locator):null,p=n&&typeof n.version=="string"?n.version:null,h=e(o);return{parentLocator:A,sourceItem:h,patchPaths:u,sourceVersion:p}}function FF(t){return t.range.startsWith("patch:")}function i0(t){return t.reference.startsWith("patch:")}function eD(t){let{sourceItem:e,...r}=cI(t.range,G.parseDescriptor);return{...r,sourceDescriptor:e}}function tD(t){let{sourceItem:e,...r}=cI(t.reference,G.parseLocator);return{...r,sourceLocator:e}}function _vt(t){let{sourceItem:e}=cI(t.range,G.parseDescriptor);return e}function Hvt(t){let{sourceItem:e}=cI(t.reference,G.parseLocator);return e}function c5(t){if(!FF(t))return t;let{sourceItem:e}=cI(t.range,G.parseDescriptor);return e}function RF(t){if(!i0(t))return t;let{sourceItem:e}=cI(t.reference,G.parseLocator);return e}function lve({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:o,patchHash:a},n){let u=t!==null?{locator:G.stringifyLocator(t)}:{},A=typeof o<"u"?{version:o}:{},p=typeof a<"u"?{hash:a}:{};return G.makeRange({protocol:"patch:",source:n(e),selector:r.join("&"),params:{...A,...p,...u}})}function TF(t,{parentLocator:e,sourceDescriptor:r,patchPaths:o}){return G.makeDescriptor(t,lve({parentLocator:e,sourceItem:r,patchPaths:o},G.stringifyDescriptor))}function u5(t,{parentLocator:e,sourcePackage:r,patchPaths:o,patchHash:a}){return G.makeLocator(t,lve({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:o,patchHash:a},G.stringifyLocator))}function cve({onAbsolute:t,onRelative:e,onProject:r,onBuiltin:o},a){let n=a.lastIndexOf("!");n!==-1&&(a=a.slice(n+1));let u=a.match(Uvt);return u!==null?o(u[1]):a.startsWith("~/")?r(a.slice(2)):V.isAbsolute(a)?t(a):e(a)}function uve(t){let e=t.lastIndexOf("!");return{optional:(e!==-1?new Set(t.slice(0,e).split(/!/)):new Set).has("optional")}}function A5(t){return cve({onAbsolute:()=>!1,onRelative:()=>!0,onProject:()=>!1,onBuiltin:()=>!1},t)}async function rD(t,e,r){let o=t!==null?await r.fetcher.fetch(t,r):null,a=o&&o.localPath?{packageFs:new En(Bt.root),prefixPath:V.relative(Bt.root,o.localPath)}:o;o&&o!==a&&o.releaseFs&&o.releaseFs();let n=await qe.releaseAfterUseAsync(async()=>await Promise.all(e.map(async u=>{let A=uve(u),p=await cve({onAbsolute:async h=>await ae.readFilePromise(h,"utf8"),onRelative:async h=>{if(a===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await a.packageFs.readFilePromise(V.join(a.prefixPath,h),"utf8")},onProject:async h=>await ae.readFilePromise(V.join(r.project.cwd,h),"utf8"),onBuiltin:async h=>await r.project.configuration.firstHook(E=>E.getBuiltinPatch,r.project,h)},u);return{...A,source:p}})));for(let u of n)typeof u.source=="string"&&(u.source=u.source.replace(/\r\n?/g,` -`));return n}async function f5(t,{cache:e,project:r}){let o=r.storedPackages.get(t.locatorHash);if(typeof o>"u")throw new Error("Assertion failed: Expected the package to be registered");let a=RF(t),n=r.storedChecksums,u=new Ri,A=await ae.mktempPromise(),p=V.join(A,"source"),h=V.join(A,"user"),E=V.join(A,".yarn-patch.json"),w=r.configuration.makeFetcher(),D=[];try{let b,C;if(t.locatorHash===a.locatorHash){let T=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u});D.push(()=>T.releaseFs?.()),b=T,C=T}else b=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u}),D.push(()=>b.releaseFs?.()),C=await w.fetch(t,{cache:e,project:r,fetcher:w,checksums:n,report:u}),D.push(()=>C.releaseFs?.());await Promise.all([ae.copyPromise(p,b.prefixPath,{baseFs:b.packageFs}),ae.copyPromise(h,C.prefixPath,{baseFs:C.packageFs}),ae.writeJsonPromise(E,{locator:G.stringifyLocator(t),version:o.version})])}finally{for(let b of D)b()}return ae.detachTemp(A),h}async function p5(t,e){let r=Ae.fromPortablePath(t).replace(/\\/g,"/"),o=Ae.fromPortablePath(e).replace(/\\/g,"/"),{stdout:a,stderr:n}=await Hr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--no-renames","--text",r,o],{cwd:Ae.toPortablePath(process.cwd()),env:{...process.env,GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""}});if(n.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${n}`);let u=r.startsWith("/")?A=>A.slice(1):A=>A;return a.replace(new RegExp(`(a|b)(${qe.escapeRegExp(`/${u(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${qe.escapeRegExp(`/${u(o)}/`)}`,"g"),"$1/").replace(new RegExp(qe.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(qe.escapeRegExp(`${o}/`),"g"),"")}function h5(t,e){let r=[];for(let{source:o}of t){if(o===null)continue;let a=$v(o);for(let n of a){let{semverExclusivity:u,...A}=n;u!==null&&e!==null&&!Ur.satisfiesWithPrereleases(e,u)||r.push(JSON.stringify(A))}}return bn.makeHash(`${3}`,...r).slice(0,6)}Ve();function Ave(t,{configuration:e,report:r}){for(let o of t.parts)for(let a of o.lines)switch(o.type){case"context":r.reportInfo(null,` ${pe.pretty(e,a,"grey")}`);break;case"deletion":r.reportError(28,`- ${pe.pretty(e,a,pe.Type.REMOVED)}`);break;case"insertion":r.reportError(28,`+ ${pe.pretty(e,a,pe.Type.ADDED)}`);break;default:qe.assertNever(o.type)}}var nD=class{supports(e,r){return!!i0(e)}getLocalPath(e,r){return null}async fetch(e,r){let o=r.checksums.get(e.locatorHash)||null,[a,n,u]=await r.cache.fetchPackageFromCache(e,o,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${G.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),...r.cacheOptions});return{packageFs:a,releaseFs:n,prefixPath:G.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:u}}async patchPackage(e,r){let{parentLocator:o,sourceLocator:a,sourceVersion:n,patchPaths:u}=tD(e),A=await rD(o,u,r),p=await ae.mktempPromise(),h=V.join(p,"current.zip"),E=await r.fetcher.fetch(a,r),w=G.getIdentVendorPath(e),D=new Zi(h,{create:!0,level:r.project.configuration.get("compressionLevel")});await qe.releaseAfterUseAsync(async()=>{await D.copyPromise(w,E.prefixPath,{baseFs:E.packageFs,stableSort:!0})},E.releaseFs),D.saveAndClose();for(let{source:b,optional:C}of A){if(b===null)continue;let T=new Zi(h,{level:r.project.configuration.get("compressionLevel")}),N=new En(V.resolve(Bt.root,w),{baseFs:T});try{await QF($v(b),{baseFs:N,version:n})}catch(U){if(!(U instanceof aI))throw U;let J=r.project.configuration.get("enableInlineHunks"),te=!J&&!C?" (set enableInlineHunks for details)":"",le=`${G.prettyLocator(r.project.configuration,e)}: ${U.message}${te}`,ce=ue=>{J&&Ave(U.hunk,{configuration:r.project.configuration,report:ue})};if(T.discardAndClose(),C){r.report.reportWarningOnce(66,le,{reportExtra:ce});continue}else throw new Jt(66,le,ce)}T.saveAndClose()}return new Zi(h,{level:r.project.configuration.get("compressionLevel")})}};Ve();var iD=class{supportsDescriptor(e,r){return!!FF(e)}supportsLocator(e,r){return!!i0(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,o){let{patchPaths:a}=eD(e);return a.every(n=>!A5(n))?e:G.bindDescriptor(e,{locator:G.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:o}=eD(e);return{sourceDescriptor:r.project.configuration.normalizeDependency(o)}}async getCandidates(e,r,o){if(!o.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:a,patchPaths:n}=eD(e),u=await rD(a,n,o.fetchOptions),A=r.sourceDescriptor;if(typeof A>"u")throw new Error("Assertion failed: The dependency should have been resolved");let p=h5(u,A.version);return[u5(e,{parentLocator:a,sourcePackage:A,patchPaths:n,patchHash:p})]}async getSatisfying(e,r,o,a){let[n]=await this.getCandidates(e,r,a);return{locators:o.filter(u=>u.locatorHash===n.locatorHash),sorted:!1}}async resolve(e,r){let{sourceLocator:o}=tD(e);return{...await r.resolver.resolve(o,r),...e}}};Ve();St();Gt();var uI=class extends ut{constructor(){super(...arguments);this.save=de.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=de.String()}static{this.paths=[["patch-commit"]]}static{this.usage=ot.Usage({description:"generate a patch out of a directory",details:"\n By default, this will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n With the `-s,--save` option set, the patchfile won't be printed on stdout anymore and will instead be stored within a local file (by default kept within `.yarn/patches`, but configurable via the `patchFolder` setting). A `resolutions` entry will also be added to your top-level manifest, referencing the patched package via the `patch:` protocol.\n\n Note that only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=V.resolve(this.context.cwd,Ae.toPortablePath(this.patchFolder)),u=V.join(n,"../source"),A=V.join(n,"../.yarn-patch.json");if(!ae.existsSync(u))throw new it("The argument folder didn't get created by 'yarn patch'");let p=await p5(u,n),h=await ae.readJsonPromise(A),E=G.parseLocator(h.locator,!0);if(!o.storedPackages.has(E.locatorHash))throw new it("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(p);return}let w=r.get("patchFolder"),D=V.join(w,`${G.slugifyLocator(E)}.patch`);await ae.mkdirPromise(w,{recursive:!0}),await ae.writeFilePromise(D,p);let b=[],C=new Map;for(let T of o.storedPackages.values()){if(G.isVirtualLocator(T))continue;let N=T.dependencies.get(E.identHash);if(!N)continue;let U=G.ensureDevirtualizedDescriptor(N),J=c5(U),te=o.storedResolutions.get(J.descriptorHash);if(!te)throw new Error("Assertion failed: Expected the resolution to have been registered");if(!o.storedPackages.get(te))throw new Error("Assertion failed: Expected the package to have been registered");let ce=o.tryWorkspaceByLocator(T);if(ce)b.push(ce);else{let ue=o.originalPackages.get(T.locatorHash);if(!ue)throw new Error("Assertion failed: Expected the original package to have been registered");let Ie=ue.dependencies.get(N.identHash);if(!Ie)throw new Error("Assertion failed: Expected the original dependency to have been registered");C.set(Ie.descriptorHash,Ie)}}for(let T of b)for(let N of _t.hardDependencies){let U=T.manifest[N].get(E.identHash);if(!U)continue;let J=TF(U,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[V.join(mr.home,V.relative(o.cwd,D))]});T.manifest[N].set(U.identHash,J)}for(let T of C.values()){let N=TF(T,{parentLocator:null,sourceDescriptor:G.convertLocatorToDescriptor(E),patchPaths:[V.join(mr.home,V.relative(o.cwd,D))]});o.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:G.stringifyIdent(N),description:T.range}},reference:N.range})}await o.persist()}};Ve();St();Gt();var AI=class extends ut{constructor(){super(...arguments);this.update=de.Boolean("-u,--update",!1,{description:"Reapply local patches that already apply to this packages"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=de.String()}static{this.paths=[["patch"]]}static{this.usage=ot.Usage({description:"prepare a package for patching",details:"\n This command will cause a package to be extracted in a temporary directory intended to be editable at will.\n\n Once you're done with your changes, run `yarn patch-commit -s path` (with `path` being the temporary directory you received) to generate a patchfile and register it into your top-level manifest via the `patch:` protocol. Run `yarn patch-commit -h` for more details.\n\n Calling the command when you already have a patch won't import it by default (in other words, the default behavior is to reset existing patches). However, adding the `-u,--update` flag will import any current patch.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let u=G.parseLocator(this.package);if(u.reference==="unknown"){let A=qe.mapAndFilter([...o.storedPackages.values()],p=>p.identHash!==u.identHash?qe.mapAndFilter.skip:G.isVirtualLocator(p)?qe.mapAndFilter.skip:i0(p)!==this.update?qe.mapAndFilter.skip:p);if(A.length===0)throw new it("No package found in the project for the given locator");if(A.length>1)throw new it(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${A.map(p=>` -- ${G.prettyLocator(r,p)}`).join("")}`);u=A[0]}if(!o.storedPackages.has(u.locatorHash))throw new it("No package found in the project for the given locator");await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=RF(u),h=await f5(u,{cache:n,project:o});A.reportJson({locator:G.stringifyLocator(p),path:Ae.fromPortablePath(h)});let E=this.update?" along with its current modifications":"";A.reportInfo(0,`Package ${G.prettyLocator(r,p)} got extracted with success${E}!`),A.reportInfo(0,`You can now edit the following folder: ${pe.pretty(r,Ae.fromPortablePath(h),"magenta")}`),A.reportInfo(0,`Once you are done run ${pe.pretty(r,`yarn patch-commit -s ${process.platform==="win32"?'"':""}${Ae.fromPortablePath(h)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};var qvt={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:"BOOLEAN",default:!1},patchFolder:{description:"Folder where the patch files must be written",type:"ABSOLUTE_PATH",default:"./.yarn/patches"}},commands:[uI,AI],fetchers:[nD],resolvers:[iD]},jvt=qvt;var y5={};Vt(y5,{PnpmLinker:()=>sD,default:()=>Kvt});Ve();St();Gt();var sD=class{getCustomDataKey(){return JSON.stringify({name:"PnpmLinker",version:3})}supportsPackage(e,r){return this.isEnabled(r)}async findPackageLocation(e,r){if(!this.isEnabled(r))throw new Error("Assertion failed: Expected the pnpm linker to be enabled");let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=a.pathsByLocator.get(e.locatorHash);if(typeof n>"u")throw new it(`Couldn't find ${G.prettyLocator(r.project.configuration,e)} in the currently installed pnpm map - running an install might help`);return n.packageLocation}async findPackageLocator(e,r){if(!this.isEnabled(r))return null;let o=this.getCustomDataKey(),a=r.project.linkersCustomData.get(o);if(!a)throw new it(`The project in ${pe.pretty(r.project.configuration,`${r.project.cwd}/package.json`,pe.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(n){let p=a.locatorByPath.get(n[1]);if(p)return p}let u=e,A=e;do{A=u,u=V.dirname(A);let p=a.locatorByPath.get(A);if(p)return p}while(u!==A);return null}makeInstaller(e){return new d5(e)}isEnabled(e){return e.project.configuration.get("nodeLinker")==="pnpm"}},d5=class{constructor(e){this.opts=e;this.asyncActions=new qe.AsyncActions(10);this.customData={pathsByLocator:new Map,locatorByPath:new Map};this.indexFolderPromise=$D(ae,{indexPath:V.join(e.project.configuration.get("globalFolder"),"index")})}attachCustomData(e){}async installPackage(e,r,o){switch(e.linkType){case"SOFT":return this.installPackageSoft(e,r,o);case"HARD":return this.installPackageHard(e,r,o)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,o){let a=V.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.opts.project.tryWorkspaceByLocator(e)?V.join(a,mr.nodeModules):null;return this.customData.pathsByLocator.set(e.locatorHash,{packageLocation:a,dependenciesLocation:n}),{packageLocation:a,buildRequest:null}}async installPackageHard(e,r,o){let a=Gvt(e,{project:this.opts.project}),n=a.packageLocation;this.customData.locatorByPath.set(n,G.stringifyLocator(e)),this.customData.pathsByLocator.set(e.locatorHash,a),o.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await ae.mkdirPromise(n,{recursive:!0}),await ae.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1,linkStrategy:{type:"HardlinkFromIndex",indexPath:await this.indexFolderPromise,autoRepair:!0}})}));let A=G.isVirtualLocator(e)?G.devirtualizeLocator(e):e,p={manifest:await _t.tryFind(r.prefixPath,{baseFs:r.packageFs})??new _t,misc:{hasBindingGyp:CA.hasBindingGyp(r)}},h=this.opts.project.getDependencyMeta(A,e.version),E=CA.extractBuildRequest(e,p,h,{configuration:this.opts.project.configuration});return{packageLocation:n,buildRequest:E}}async attachInternalDependencies(e,r){if(this.opts.project.configuration.get("nodeLinker")!=="pnpm"||!fve(e,{project:this.opts.project}))return;let o=this.customData.pathsByLocator.get(e.locatorHash);if(typeof o>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(e)})`);let{dependenciesLocation:a}=o;a&&this.asyncActions.reduce(e.locatorHash,async n=>{await ae.mkdirPromise(a,{recursive:!0});let u=await Wvt(a),A=new Map(u),p=[n],h=(w,D)=>{let b=D;fve(D,{project:this.opts.project})||(this.opts.report.reportWarningOnce(0,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),b=G.devirtualizeLocator(D));let C=this.customData.pathsByLocator.get(b.locatorHash);if(typeof C>"u")throw new Error(`Assertion failed: Expected the package to have been registered (${G.stringifyLocator(D)})`);let T=G.stringifyIdent(w),N=V.join(a,T),U=V.relative(V.dirname(N),C.packageLocation),J=A.get(T);A.delete(T),p.push(Promise.resolve().then(async()=>{if(J){if(J.isSymbolicLink()&&await ae.readlinkPromise(N)===U)return;await ae.removePromise(N)}await ae.mkdirpPromise(V.dirname(N)),process.platform=="win32"&&this.opts.project.configuration.get("winLinkType")==="junctions"?await ae.symlinkPromise(C.packageLocation,N,"junction"):await ae.symlinkPromise(U,N)}))},E=!1;for(let[w,D]of r)w.identHash===e.identHash&&(E=!0),h(w,D);!E&&!this.opts.project.tryWorkspaceByLocator(e)&&h(G.convertLocatorToDescriptor(e),e),p.push(Yvt(a,A)),await Promise.all(p)})}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=hve(this.opts.project);if(this.opts.project.configuration.get("nodeLinker")!=="pnpm")await ae.removePromise(e);else{let r;try{r=new Set(await ae.readdirPromise(e))}catch{r=new Set}for(let{dependenciesLocation:o}of this.customData.pathsByLocator.values()){if(!o)continue;let a=V.contains(e,o);if(a===null)continue;let[n]=a.split(V.sep);r.delete(n)}await Promise.all([...r].map(async o=>{await ae.removePromise(V.join(e,o))}))}return await this.asyncActions.wait(),await m5(e),this.opts.project.configuration.get("nodeLinker")!=="node-modules"&&await m5(pve(this.opts.project)),{customData:this.customData}}};function pve(t){return V.join(t.cwd,mr.nodeModules)}function hve(t){return V.join(pve(t),".store")}function Gvt(t,{project:e}){let r=G.slugifyLocator(t),o=hve(e),a=V.join(o,r,"package"),n=V.join(o,r,mr.nodeModules);return{packageLocation:a,dependenciesLocation:n}}function fve(t,{project:e}){return!G.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Wvt(t){let e=new Map,r=[];try{r=await ae.readdirPromise(t,{withFileTypes:!0})}catch(o){if(o.code!=="ENOENT")throw o}try{for(let o of r)if(!o.name.startsWith("."))if(o.name.startsWith("@")){let a=await ae.readdirPromise(V.join(t,o.name),{withFileTypes:!0});if(a.length===0)e.set(o.name,o);else for(let n of a)e.set(`${o.name}/${n.name}`,n)}else e.set(o.name,o)}catch(o){if(o.code!=="ENOENT")throw o}return e}async function Yvt(t,e){let r=[],o=new Set;for(let a of e.keys()){r.push(ae.removePromise(V.join(t,a)));let n=G.tryParseIdent(a)?.scope;n&&o.add(`@${n}`)}return Promise.all(r).then(()=>Promise.all([...o].map(a=>m5(V.join(t,a)))))}async function m5(t){try{await ae.rmdirPromise(t)}catch(e){if(e.code!=="ENOENT"&&e.code!=="ENOTEMPTY")throw e}}var Vvt={linkers:[sD]},Kvt=Vvt;var D5={};Vt(D5,{StageCommand:()=>fI,default:()=>sDt,stageUtils:()=>NF});Ve();St();Gt();Ve();St();var NF={};Vt(NF,{ActionType:()=>E5,checkConsensus:()=>LF,expandDirectory:()=>w5,findConsensus:()=>B5,findVcsRoot:()=>C5,genCommitMessage:()=>v5,getCommitPrefix:()=>gve,isYarnFile:()=>I5});St();var E5=(n=>(n[n.CREATE=0]="CREATE",n[n.DELETE=1]="DELETE",n[n.ADD=2]="ADD",n[n.REMOVE=3]="REMOVE",n[n.MODIFY=4]="MODIFY",n))(E5||{});async function C5(t,{marker:e}){do if(!ae.existsSync(V.join(t,e)))t=V.dirname(t);else return t;while(t!=="/");return null}function I5(t,{roots:e,names:r}){if(r.has(V.basename(t)))return!0;do if(!e.has(t))t=V.dirname(t);else return!0;while(t!=="/");return!1}function w5(t){let e=[],r=[t];for(;r.length>0;){let o=r.pop(),a=ae.readdirSync(o);for(let n of a){let u=V.resolve(o,n);ae.lstatSync(u).isDirectory()?r.push(u):e.push(u)}}return e}function LF(t,e){let r=0,o=0;for(let a of t)a!=="wip"&&(e.test(a)?r+=1:o+=1);return r>=o}function B5(t){let e=LF(t,/^(\w\(\w+\):\s*)?\w+s/),r=LF(t,/^(\w\(\w+\):\s*)?[A-Z]/),o=LF(t,/^\w\(\w+\):/);return{useThirdPerson:e,useUpperCase:r,useComponent:o}}function gve(t){return t.useComponent?"chore(yarn): ":""}var Jvt=new Map([[0,"create"],[1,"delete"],[2,"add"],[3,"remove"],[4,"update"]]);function v5(t,e){let r=gve(t),o=[],a=e.slice().sort((n,u)=>n[0]-u[0]);for(;a.length>0;){let[n,u]=a.shift(),A=Jvt.get(n);t.useUpperCase&&o.length===0&&(A=`${A[0].toUpperCase()}${A.slice(1)}`),t.useThirdPerson&&(A+="s");let p=[u];for(;a.length>0&&a[0][0]===n;){let[,E]=a.shift();p.push(E)}p.sort();let h=p.shift();p.length===1?h+=" (and one other)":p.length>1&&(h+=` (and ${p.length} others)`),o.push(`${A} ${h}`)}return`${r}${o.join(", ")}`}var zvt="Commit generated via `yarn stage`",Xvt=11;async function dve(t){let{code:e,stdout:r}=await Hr.execvp("git",["log","-1","--pretty=format:%H"],{cwd:t});return e===0?r.trim():null}async function Zvt(t,e){let r=[],o=e.filter(h=>V.basename(h.path)==="package.json");for(let{action:h,path:E}of o){let w=V.relative(t,E);if(h===4){let D=await dve(t),{stdout:b}=await Hr.execvp("git",["show",`${D}:${w}`],{cwd:t,strict:!0}),C=await _t.fromText(b),T=await _t.fromFile(E),N=new Map([...T.dependencies,...T.devDependencies]),U=new Map([...C.dependencies,...C.devDependencies]);for(let[J,te]of U){let le=G.stringifyIdent(te),ce=N.get(J);ce?ce.range!==te.range&&r.push([4,`${le} to ${ce.range}`]):r.push([3,le])}for(let[J,te]of N)U.has(J)||r.push([2,G.stringifyIdent(te)])}else if(h===0){let D=await _t.fromFile(E);D.name?r.push([0,G.stringifyIdent(D.name)]):r.push([0,"a package"])}else if(h===1){let D=await dve(t),{stdout:b}=await Hr.execvp("git",["show",`${D}:${w}`],{cwd:t,strict:!0}),C=await _t.fromText(b);C.name?r.push([1,G.stringifyIdent(C.name)]):r.push([1,"a package"])}else throw new Error("Assertion failed: Unsupported action type")}let{code:a,stdout:n}=await Hr.execvp("git",["log",`-${Xvt}`,"--pretty=format:%s"],{cwd:t}),u=a===0?n.split(/\n/g).filter(h=>h!==""):[],A=B5(u);return v5(A,r)}var $vt={0:[" A ","?? "],4:[" M "],1:[" D "]},eDt={0:["A "],4:["M "],1:["D "]},mve={async findRoot(t){return await C5(t,{marker:".git"})},async filterChanges(t,e,r,o){let{stdout:a}=await Hr.execvp("git",["status","-s"],{cwd:t,strict:!0}),n=a.toString().split(/\n/g),u=o?.staged?eDt:$vt;return[].concat(...n.map(p=>{if(p==="")return[];let h=p.slice(0,3),E=V.resolve(t,p.slice(3));if(!o?.staged&&h==="?? "&&p.endsWith("/"))return w5(E).map(w=>({action:0,path:w}));{let D=[0,4,1].find(b=>u[b].includes(h));return D!==void 0?[{action:D,path:E}]:[]}})).filter(p=>I5(p.path,{roots:e,names:r}))},async genCommitMessage(t,e){return await Zvt(t,e)},async makeStage(t,e){let r=e.map(o=>Ae.fromPortablePath(o.path));await Hr.execvp("git",["add","--",...r],{cwd:t,strict:!0})},async makeCommit(t,e,r){let o=e.map(a=>Ae.fromPortablePath(a.path));await Hr.execvp("git",["add","-N","--",...o],{cwd:t,strict:!0}),await Hr.execvp("git",["commit","-m",`${r} - -${zvt} -`,"--",...o],{cwd:t,strict:!0})},async makeReset(t,e){let r=e.map(o=>Ae.fromPortablePath(o.path));await Hr.execvp("git",["reset","HEAD","--",...r],{cwd:t,strict:!0})}};var tDt=[mve],fI=class extends ut{constructor(){super(...arguments);this.commit=de.Boolean("-c,--commit",!1,{description:"Commit the staged files"});this.reset=de.Boolean("-r,--reset",!1,{description:"Remove all files from the staging area"});this.dryRun=de.Boolean("-n,--dry-run",!1,{description:"Print the commit message and the list of modified files without staging / committing"});this.update=de.Boolean("-u,--update",!1,{hidden:!0})}static{this.paths=[["stage"]]}static{this.usage=ot.Usage({description:"add all yarn files to your vcs",details:"\n This command will add to your staging area the files belonging to Yarn (typically any modified `package.json` and `.yarnrc.yml` files, but also linker-generated files, cache data, etc). It will take your ignore list into account, so the cache files won't be added if the cache is ignored in a `.gitignore` file (assuming you use Git).\n\n Running `--reset` will instead remove them from the staging area (the changes will still be there, but won't be committed until you stage them back).\n\n Since the staging area is a non-existent concept in Mercurial, Yarn will always create a new commit when running this command on Mercurial repositories. You can get this behavior when using Git by using the `--commit` flag which will directly create a commit.\n ",examples:[["Adds all modified project files to the staging area","yarn stage"],["Creates a new commit containing all modified project files","yarn stage --commit"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o}=await Qt.find(r,this.context.cwd),{driver:a,root:n}=await rDt(o.cwd),u=[r.get("cacheFolder"),r.get("globalFolder"),r.get("virtualFolder"),r.get("yarnPath")];await r.triggerHook(w=>w.populateYarnPaths,o,w=>{u.push(w)});let A=new Set;for(let w of u)for(let D of nDt(n,w))A.add(D);let p=new Set([r.get("rcFilename"),mr.lockfile,mr.manifest]),h=await a.filterChanges(n,A,p),E=await a.genCommitMessage(n,h);if(this.dryRun)if(this.commit)this.context.stdout.write(`${E} -`);else for(let w of h)this.context.stdout.write(`${Ae.fromPortablePath(w.path)} -`);else if(this.reset){let w=await a.filterChanges(n,A,p,{staged:!0});w.length===0?this.context.stdout.write("No staged changes found!"):await a.makeReset(n,w)}else h.length===0?this.context.stdout.write("No changes found!"):this.commit?await a.makeCommit(n,h,E):(await a.makeStage(n,h),this.context.stdout.write(E))}};async function rDt(t){let e=null,r=null;for(let o of tDt)if((r=await o.findRoot(t))!==null){e=o;break}if(e===null||r===null)throw new it("No stage driver has been found for your current project");return{driver:e,root:r}}function nDt(t,e){let r=[];if(e===null)return r;for(;;){(e===t||e.startsWith(`${t}/`))&&r.push(e);let o;try{o=ae.statSync(e)}catch{break}if(o.isSymbolicLink())e=V.resolve(V.dirname(e),ae.readlinkSync(e));else break}return r}var iDt={commands:[fI]},sDt=iDt;var S5={};Vt(S5,{default:()=>pDt});Ve();Ve();St();var Cve=et(ni());Ve();var yve=et(N6()),oDt="e8e1bd300d860104bb8c58453ffa1eb4",aDt="OFCNCOG2CU",Eve=async(t,e)=>{let r=G.stringifyIdent(t),a=lDt(e).initIndex("npm-search");try{return(await a.getObject(r,{attributesToRetrieve:["types"]})).types?.ts==="definitely-typed"}catch{return!1}},lDt=t=>(0,yve.default)(aDt,oDt,{requester:{async send(r){try{let o=await on.request(r.url,r.data||null,{configuration:t,headers:r.headers});return{content:o.body,isTimedOut:!1,status:o.statusCode}}catch(o){return{content:o.response.body,isTimedOut:!1,status:o.response.statusCode}}}}});var Ive=t=>t.scope?`${t.scope}__${t.name}`:`${t.name}`,cDt=async(t,e,r,o)=>{if(r.scope==="types")return;let{project:a}=t,{configuration:n}=a;if(!(n.get("tsEnableAutoTypes")??(ae.existsSync(V.join(t.cwd,"tsconfig.json"))||ae.existsSync(V.join(a.cwd,"tsconfig.json")))))return;let A=n.makeResolver(),p={project:a,resolver:A,report:new Ri};if(!await Eve(r,n))return;let E=Ive(r),w=G.parseRange(r.range).selector;if(!Ur.validRange(w)){let N=n.normalizeDependency(r),U=await A.getCandidates(N,{},p);w=G.parseRange(U[0].reference).selector}let D=Cve.default.coerce(w);if(D===null)return;let b=`${nu.Modifier.CARET}${D.major}`,C=G.makeDescriptor(G.makeIdent("types",E),b),T=qe.mapAndFind(a.workspaces,N=>{let U=N.manifest.dependencies.get(r.identHash)?.descriptorHash,J=N.manifest.devDependencies.get(r.identHash)?.descriptorHash;if(U!==r.descriptorHash&&J!==r.descriptorHash)return qe.mapAndFind.skip;let te=[];for(let le of _t.allDependencies){let ce=N.manifest[le].get(C.identHash);typeof ce>"u"||te.push([le,ce])}return te.length===0?qe.mapAndFind.skip:te});if(typeof T<"u")for(let[N,U]of T)t.manifest[N].set(U.identHash,U);else{try{let N=n.normalizeDependency(C);if((await A.getCandidates(N,{},p)).length===0)return}catch{return}t.manifest[nu.Target.DEVELOPMENT].set(C.identHash,C)}},uDt=async(t,e,r)=>{if(r.scope==="types")return;let{project:o}=t,{configuration:a}=o;if(!(a.get("tsEnableAutoTypes")??(ae.existsSync(V.join(t.cwd,"tsconfig.json"))||ae.existsSync(V.join(o.cwd,"tsconfig.json")))))return;let u=Ive(r),A=G.makeIdent("types",u);for(let p of _t.allDependencies)typeof t.manifest[p].get(A.identHash)>"u"||t.manifest[p].delete(A.identHash)},ADt=(t,e)=>{e.publishConfig&&e.publishConfig.typings&&(e.typings=e.publishConfig.typings),e.publishConfig&&e.publishConfig.types&&(e.types=e.publishConfig.types)},fDt={configuration:{tsEnableAutoTypes:{description:"Whether Yarn should auto-install @types/ dependencies on 'yarn add'",type:"BOOLEAN",isNullable:!0,default:null}},hooks:{afterWorkspaceDependencyAddition:cDt,afterWorkspaceDependencyRemoval:uDt,beforeWorkspacePacking:ADt}},pDt=fDt;var Q5={};Vt(Q5,{VersionApplyCommand:()=>mI,VersionCheckCommand:()=>yI,VersionCommand:()=>EI,default:()=>FDt,versionUtils:()=>dI});Ve();Ve();Gt();var dI={};Vt(dI,{Decision:()=>hI,applyPrerelease:()=>Pve,applyReleases:()=>k5,applyStrategy:()=>MF,clearVersionFiles:()=>P5,getUndecidedDependentWorkspaces:()=>aD,getUndecidedWorkspaces:()=>OF,openVersionFile:()=>gI,requireMoreDecisions:()=>bDt,resolveVersionFiles:()=>oD,suggestStrategy:()=>b5,updateVersionFiles:()=>x5,validateReleaseDecision:()=>pI});Ve();St();Ol();Gt();var Sve=et(Dve()),SA=et(ni()),xDt=/^(>=|[~^]|)(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/,hI=(u=>(u.UNDECIDED="undecided",u.DECLINE="decline",u.MAJOR="major",u.MINOR="minor",u.PATCH="patch",u.PRERELEASE="prerelease",u))(hI||{});function pI(t){let e=SA.default.valid(t);return e||qe.validateEnum((0,Sve.default)(hI,"UNDECIDED"),t)}async function oD(t,{prerelease:e=null}={}){let r=new Map,o=t.configuration.get("deferredVersionFolder");if(!ae.existsSync(o))return r;let a=await ae.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=V.join(o,n),A=await ae.readFilePromise(u,"utf8"),p=Vi(A);for(let[h,E]of Object.entries(p.releases||{})){if(E==="decline")continue;let w=G.parseIdent(h),D=t.tryWorkspaceByIdent(w);if(D===null)throw new Error(`Assertion failed: Expected a release definition file to only reference existing workspaces (${V.basename(u)} references ${h})`);if(D.manifest.version===null)throw new Error(`Assertion failed: Expected the workspace to have a version (${G.prettyLocator(t.configuration,D.anchoredLocator)})`);let b=D.manifest.raw.stableVersion??D.manifest.version,C=r.get(D),T=MF(b,pI(E));if(T===null)throw new Error(`Assertion failed: Expected ${b} to support being bumped via strategy ${E}`);let N=typeof C<"u"?SA.default.gt(T,C)?T:C:T;r.set(D,N)}}return e&&(r=new Map([...r].map(([n,u])=>[n,Pve(u,{current:n.manifest.version,prerelease:e})]))),r}async function P5(t){let e=t.configuration.get("deferredVersionFolder");ae.existsSync(e)&&await ae.removePromise(e)}async function x5(t,e){let r=new Set(e),o=t.configuration.get("deferredVersionFolder");if(!ae.existsSync(o))return;let a=await ae.readdirPromise(o);for(let n of a){if(!n.endsWith(".yml"))continue;let u=V.join(o,n),A=await ae.readFilePromise(u,"utf8"),p=Vi(A),h=p?.releases;if(h){for(let E of Object.keys(h)){let w=G.parseIdent(E),D=t.tryWorkspaceByIdent(w);(D===null||r.has(D))&&delete p.releases[E]}Object.keys(p.releases).length>0?await ae.changeFilePromise(u,Sa(new Sa.PreserveOrdering(p))):await ae.unlinkPromise(u)}}}async function gI(t,{allowEmpty:e=!1}={}){let r=t.configuration;if(r.projectCwd===null)throw new it("This command can only be run from within a Yarn project");let o=await ra.fetchRoot(r.projectCwd),a=o!==null?await ra.fetchBase(o,{baseRefs:r.get("changesetBaseRefs")}):null,n=o!==null?await ra.fetchChangedFiles(o,{base:a.hash,project:t}):[],u=r.get("deferredVersionFolder"),A=n.filter(b=>V.contains(u,b)!==null);if(A.length>1)throw new it(`Your current branch contains multiple versioning files; this isn't supported: -- ${A.map(b=>Ae.fromPortablePath(b)).join(` -- `)}`);let p=new Set(qe.mapAndFilter(n,b=>{let C=t.tryWorkspaceByFilePath(b);return C===null?qe.mapAndFilter.skip:C}));if(A.length===0&&p.size===0&&!e)return null;let h=A.length===1?A[0]:V.join(u,`${bn.makeHash(Math.random().toString()).slice(0,8)}.yml`),E=ae.existsSync(h)?await ae.readFilePromise(h,"utf8"):"{}",w=Vi(E),D=new Map;for(let b of w.declined||[]){let C=G.parseIdent(b),T=t.getWorkspaceByIdent(C);D.set(T,"decline")}for(let[b,C]of Object.entries(w.releases||{})){let T=G.parseIdent(b),N=t.getWorkspaceByIdent(T);D.set(N,pI(C))}return{project:t,root:o,baseHash:a!==null?a.hash:null,baseTitle:a!==null?a.title:null,changedFiles:new Set(n),changedWorkspaces:p,releaseRoots:new Set([...p].filter(b=>b.manifest.version!==null)),releases:D,async saveAll(){let b={},C=[],T=[];for(let N of t.workspaces){if(N.manifest.version===null)continue;let U=G.stringifyIdent(N.anchoredLocator),J=D.get(N);J==="decline"?C.push(U):typeof J<"u"?b[U]=pI(J):p.has(N)&&T.push(U)}await ae.mkdirPromise(V.dirname(h),{recursive:!0}),await ae.changeFilePromise(h,Sa(new Sa.PreserveOrdering({releases:Object.keys(b).length>0?b:void 0,declined:C.length>0?C:void 0,undecided:T.length>0?T:void 0})))}}}function bDt(t){return OF(t).size>0||aD(t).length>0}function OF(t){let e=new Set;for(let r of t.changedWorkspaces)r.manifest.version!==null&&(t.releases.has(r)||e.add(r));return e}function aD(t,{include:e=new Set}={}){let r=[],o=new Map(qe.mapAndFilter([...t.releases],([n,u])=>u==="decline"?qe.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n])),a=new Map(qe.mapAndFilter([...t.releases],([n,u])=>u!=="decline"?qe.mapAndFilter.skip:[n.anchoredLocator.locatorHash,n]));for(let n of t.project.workspaces)if(!(!e.has(n)&&(a.has(n.anchoredLocator.locatorHash)||o.has(n.anchoredLocator.locatorHash)))&&n.manifest.version!==null)for(let u of _t.hardDependencies)for(let A of n.manifest.getForScope(u).values()){let p=t.project.tryWorkspaceByDescriptor(A);p!==null&&o.has(p.anchoredLocator.locatorHash)&&r.push([n,p])}return r}function b5(t,e){let r=SA.default.clean(e);for(let o of Object.values(hI))if(o!=="undecided"&&o!=="decline"&&SA.default.inc(t,o)===r)return o;return null}function MF(t,e){if(SA.default.valid(e))return e;if(t===null)throw new it(`Cannot apply the release strategy "${e}" unless the workspace already has a valid version`);if(!SA.default.valid(t))throw new it(`Cannot apply the release strategy "${e}" on a non-semver version (${t})`);let r=SA.default.inc(t,e);if(r===null)throw new it(`Cannot apply the release strategy "${e}" on the specified version (${t})`);return r}function k5(t,e,{report:r}){let o=new Map;for(let a of t.workspaces)for(let n of _t.allDependencies)for(let u of a.manifest[n].values()){let A=t.tryWorkspaceByDescriptor(u);if(A===null||!e.has(A))continue;qe.getArrayWithDefault(o,A).push([a,n,u.identHash])}for(let[a,n]of e){let u=a.manifest.version;a.manifest.version=n,SA.default.prerelease(n)===null?delete a.manifest.raw.stableVersion:a.manifest.raw.stableVersion||(a.manifest.raw.stableVersion=u);let A=a.manifest.name!==null?G.stringifyIdent(a.manifest.name):null;r.reportInfo(0,`${G.prettyLocator(t.configuration,a.anchoredLocator)}: Bumped to ${n}`),r.reportJson({cwd:Ae.fromPortablePath(a.cwd),ident:A,oldVersion:u,newVersion:n});let p=o.get(a);if(!(typeof p>"u"))for(let[h,E,w]of p){let D=h.manifest[E].get(w);if(typeof D>"u")throw new Error("Assertion failed: The dependency should have existed");let b=D.range,C=!1;if(b.startsWith(ci.protocol)&&(b=b.slice(ci.protocol.length),C=!0,b===a.relativeCwd))continue;let T=b.match(xDt);if(!T){r.reportWarning(0,`Couldn't auto-upgrade range ${b} (in ${G.prettyLocator(t.configuration,h.anchoredLocator)})`);continue}let N=`${T[1]}${n}`;C&&(N=`${ci.protocol}${N}`);let U=G.makeDescriptor(D,N);h.manifest[E].set(w,U)}}}var kDt=new Map([["%n",{extract:t=>t.length>=1?[t[0],t.slice(1)]:null,generate:(t=0)=>`${t+1}`}]]);function Pve(t,{current:e,prerelease:r}){let o=new SA.default.SemVer(e),a=o.prerelease.slice(),n=[];o.prerelease=[],o.format()!==t&&(a.length=0);let u=!0,A=r.split(/\./g);for(let p of A){let h=kDt.get(p);if(typeof h>"u")n.push(p),a[0]===p?a.shift():u=!1;else{let E=u?h.extract(a):null;E!==null&&typeof E[0]=="number"?(n.push(h.generate(E[0])),a=E[1]):(n.push(h.generate()),u=!1)}}return o.prerelease&&(o.prerelease=[]),`${t}-${n.join(".")}`}var mI=class extends ut{constructor(){super(...arguments);this.all=de.Boolean("--all",!1,{description:"Apply the deferred version changes on all workspaces"});this.dryRun=de.Boolean("--dry-run",!1,{description:"Print the versions without actually generating the package archive"});this.prerelease=de.String("--prerelease",{description:"Add a prerelease identifier to new versions",tolerateBoolean:!0});this.recursive=de.Boolean("-R,--recursive",{description:"Release the transitive workspaces as well"});this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}static{this.paths=[["version","apply"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"apply all the deferred version bumps at once",details:` - This command will apply the deferred version changes and remove their definitions from the repository. - - Note that if \`--prerelease\` is set, the given prerelease identifier (by default \`rc.%n\`) will be used on all new versions and the version definitions will be kept as-is. - - By default only the current workspace will be bumped, but you can configure this behavior by using one of: - - - \`--recursive\` to also apply the version bump on its dependencies - - \`--all\` to apply the version bump on all packages in the repository - - Note that this command will also update the \`workspace:\` references across all your local workspaces, thus ensuring that they keep referring to the same workspaces even after the version bump. - `,examples:[["Apply the version change to the local workspace","yarn version apply"],["Apply the version change to all the workspaces in the local workspace","yarn version apply --all"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);if(!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState({restoreResolutions:!1});let u=await Lt.start({configuration:r,json:this.json,stdout:this.context.stdout},async A=>{let p=this.prerelease?typeof this.prerelease!="boolean"?this.prerelease:"rc.%n":null,h=await oD(o,{prerelease:p}),E=new Map;if(this.all)E=h;else{let w=this.recursive?a.getRecursiveWorkspaceDependencies():[a];for(let D of w){let b=h.get(D);typeof b<"u"&&E.set(D,b)}}if(E.size===0){let w=h.size>0?" Did you want to add --all?":"";A.reportWarning(0,`The current workspace doesn't seem to require a version bump.${w}`);return}k5(o,E,{report:A}),this.dryRun||(p||(this.all?await P5(o):await x5(o,[...E.keys()])),A.reportSeparator())});return this.dryRun||u.hasErrors()?u.exitCode():await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n})}};Ve();St();Gt();var UF=et(ni());var yI=class extends ut{constructor(){super(...arguments);this.interactive=de.Boolean("-i,--interactive",{description:"Open an interactive interface used to set version bumps"})}static{this.paths=[["version","check"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"check that all the relevant packages have been bumped",details:"\n **Warning:** This command currently requires Git.\n\n This command will check that all the packages covered by the files listed in argument have been properly bumped or declined to bump.\n\n In the case of a bump, the check will also cover transitive packages - meaning that should `Foo` be bumped, a package `Bar` depending on `Foo` will require a decision as to whether `Bar` will need to be bumped. This check doesn't cross packages that have declined to bump.\n\n In case no arguments are passed to the function, the list of modified files will be generated by comparing the HEAD against `master`.\n ",examples:[["Check whether the modified packages need a bump","yarn version check"]]})}async execute(){return this.interactive?await this.executeInteractive():await this.executeStandard()}async executeInteractive(){AC(this.context);let{Gem:r}=await Promise.resolve().then(()=>(UQ(),oj)),{ScrollableItems:o}=await Promise.resolve().then(()=>(jQ(),qQ)),{FocusRequest:a}=await Promise.resolve().then(()=>(lj(),Qwe)),{useListInput:n}=await Promise.resolve().then(()=>(HQ(),Fwe)),{renderForm:u}=await Promise.resolve().then(()=>(VQ(),YQ)),{Box:A,Text:p}=await Promise.resolve().then(()=>et(ac())),{default:h,useCallback:E,useState:w}=await Promise.resolve().then(()=>et(ln())),D=await ze.find(this.context.cwd,this.context.plugins),{project:b,workspace:C}=await Qt.find(D,this.context.cwd);if(!C)throw new or(b.cwd,this.context.cwd);await b.restoreInstallState();let T=await gI(b);if(T===null||T.releaseRoots.size===0)return 0;if(T.root===null)throw new it("This command can only be run on Git repositories");let N=()=>h.createElement(A,{flexDirection:"row",paddingBottom:1},h.createElement(A,{flexDirection:"column",width:60},h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select workspaces.")),h.createElement(A,null,h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},""),"/",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to select release strategies."))),h.createElement(A,{flexDirection:"column"},h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to save.")),h.createElement(A,{marginLeft:1},h.createElement(p,null,"Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to abort.")))),U=({workspace:Ie,active:he,decision:De,setDecision:Ee})=>{let g=Ie.manifest.raw.stableVersion??Ie.manifest.version;if(g===null)throw new Error(`Assertion failed: The version should have been set (${G.prettyLocator(D,Ie.anchoredLocator)})`);if(UF.default.prerelease(g)!==null)throw new Error(`Assertion failed: Prerelease identifiers shouldn't be found (${g})`);let me=["undecided","decline","patch","minor","major"];n(De,me,{active:he,minus:"left",plus:"right",set:Ee});let Ce=De==="undecided"?h.createElement(p,{color:"yellow"},g):De==="decline"?h.createElement(p,{color:"green"},g):h.createElement(p,null,h.createElement(p,{color:"magenta"},g)," \u2192 ",h.createElement(p,{color:"green"},UF.default.valid(De)?De:UF.default.inc(g,De)));return h.createElement(A,{flexDirection:"column"},h.createElement(A,null,h.createElement(p,null,G.prettyLocator(D,Ie.anchoredLocator)," - ",Ce)),h.createElement(A,null,me.map(fe=>h.createElement(A,{key:fe,paddingLeft:2},h.createElement(p,null,h.createElement(r,{active:fe===De})," ",fe)))))},J=Ie=>{let he=new Set(T.releaseRoots),De=new Map([...Ie].filter(([Ee])=>he.has(Ee)));for(;;){let Ee=aD({project:T.project,releases:De}),g=!1;if(Ee.length>0){for(let[me]of Ee)if(!he.has(me)){he.add(me),g=!0;let Ce=Ie.get(me);typeof Ce<"u"&&De.set(me,Ce)}}if(!g)break}return{relevantWorkspaces:he,relevantReleases:De}},te=()=>{let[Ie,he]=w(()=>new Map(T.releases)),De=E((Ee,g)=>{let me=new Map(Ie);g!=="undecided"?me.set(Ee,g):me.delete(Ee);let{relevantReleases:Ce}=J(me);he(Ce)},[Ie,he]);return[Ie,De]},le=({workspaces:Ie,releases:he})=>{let De=[];De.push(`${Ie.size} total`);let Ee=0,g=0;for(let me of Ie){let Ce=he.get(me);typeof Ce>"u"?g+=1:Ce!=="decline"&&(Ee+=1)}return De.push(`${Ee} release${Ee===1?"":"s"}`),De.push(`${g} remaining`),h.createElement(p,{color:"yellow"},De.join(", "))},ue=await u(({useSubmit:Ie})=>{let[he,De]=te();Ie(he);let{relevantWorkspaces:Ee}=J(he),g=new Set([...Ee].filter(ie=>!T.releaseRoots.has(ie))),[me,Ce]=w(0),fe=E(ie=>{switch(ie){case a.BEFORE:Ce(me-1);break;case a.AFTER:Ce(me+1);break}},[me,Ce]);return h.createElement(A,{flexDirection:"column"},h.createElement(N,null),h.createElement(A,null,h.createElement(p,{wrap:"wrap"},"The following files have been modified in your local checkout.")),h.createElement(A,{flexDirection:"column",marginTop:1,paddingLeft:2},[...T.changedFiles].map(ie=>h.createElement(A,{key:ie},h.createElement(p,null,h.createElement(p,{color:"grey"},Ae.fromPortablePath(T.root)),Ae.sep,Ae.relative(Ae.fromPortablePath(T.root),Ae.fromPortablePath(ie)))))),T.releaseRoots.size>0&&h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"Because of those files having been modified, the following workspaces may need to be released again (note that private workspaces are also shown here, because even though they won't be published, releasing them will allow us to flag their dependents for potential re-release):")),g.size>3?h.createElement(A,{marginTop:1},h.createElement(le,{workspaces:T.releaseRoots,releases:he})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:me%2===0,radius:1,size:2,onFocusRequest:fe},[...T.releaseRoots].map(ie=>h.createElement(U,{key:ie.cwd,workspace:ie,decision:he.get(ie)||"undecided",setDecision:Z=>De(ie,Z)}))))),g.size>0?h.createElement(h.Fragment,null,h.createElement(A,{marginTop:1},h.createElement(p,{wrap:"wrap"},"The following workspaces depend on other workspaces that have been marked for release, and thus may need to be released as well:")),h.createElement(A,null,h.createElement(p,null,"(Press ",h.createElement(p,{bold:!0,color:"cyanBright"},"")," to move the focus between the workspace groups.)")),g.size>5?h.createElement(A,{marginTop:1},h.createElement(le,{workspaces:g,releases:he})):null,h.createElement(A,{marginTop:1,flexDirection:"column"},h.createElement(o,{active:me%2===1,radius:2,size:2,onFocusRequest:fe},[...g].map(ie=>h.createElement(U,{key:ie.cwd,workspace:ie,decision:he.get(ie)||"undecided",setDecision:Z=>De(ie,Z)}))))):null)},{versionFile:T},{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});if(typeof ue>"u")return 1;T.releases.clear();for(let[Ie,he]of ue)T.releases.set(Ie,he);await T.saveAll()}async executeStandard(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);return await o.restoreInstallState(),(await Lt.start({configuration:r,stdout:this.context.stdout},async u=>{let A=await gI(o);if(A===null||A.releaseRoots.size===0)return;if(A.root===null)throw new it("This command can only be run on Git repositories");if(u.reportInfo(0,`Your PR was started right after ${pe.pretty(r,A.baseHash.slice(0,7),"yellow")} ${pe.pretty(r,A.baseTitle,"magenta")}`),A.changedFiles.size>0){u.reportInfo(0,"You have changed the following files since then:"),u.reportSeparator();for(let D of A.changedFiles)u.reportInfo(null,`${pe.pretty(r,Ae.fromPortablePath(A.root),"gray")}${Ae.sep}${Ae.relative(Ae.fromPortablePath(A.root),Ae.fromPortablePath(D))}`)}let p=!1,h=!1,E=OF(A);if(E.size>0){p||u.reportSeparator();for(let D of E)u.reportError(0,`${G.prettyLocator(r,D.anchoredLocator)} has been modified but doesn't have a release strategy attached`);p=!0}let w=aD(A);for(let[D,b]of w)h||u.reportSeparator(),u.reportError(0,`${G.prettyLocator(r,D.anchoredLocator)} doesn't have a release strategy attached, but depends on ${G.prettyWorkspace(r,b)} which is planned for release.`),h=!0;(p||h)&&(u.reportSeparator(),u.reportInfo(0,"This command detected that at least some workspaces have received modifications without explicit instructions as to how they had to be released (if needed)."),u.reportInfo(0,"To correct these errors, run `yarn version check --interactive` then follow the instructions."))})).exitCode()}};Ve();Gt();var _F=et(ni());var EI=class extends ut{constructor(){super(...arguments);this.deferred=de.Boolean("-d,--deferred",{description:"Prepare the version to be bumped during the next release cycle"});this.immediate=de.Boolean("-i,--immediate",{description:"Bump the version immediately"});this.strategy=de.String()}static{this.paths=[["version"]]}static{this.usage=ot.Usage({category:"Release-related commands",description:"apply a new version to the current package",details:"\n This command will bump the version number for the given package, following the specified strategy:\n\n - If `major`, the first number from the semver range will be increased (`X.0.0`).\n - If `minor`, the second number from the semver range will be increased (`0.X.0`).\n - If `patch`, the third number from the semver range will be increased (`0.0.X`).\n - If prefixed by `pre` (`premajor`, ...), a `-0` suffix will be set (`0.0.0-0`).\n - If `prerelease`, the suffix will be increased (`0.0.0-X`); the third number from the semver range will also be increased if there was no suffix in the previous version.\n - If `decline`, the nonce will be increased for `yarn version check` to pass without version bump.\n - If a valid semver range, it will be used as new version.\n - If unspecified, Yarn will ask you for guidance.\n\n For more information about the `--deferred` flag, consult our documentation (https://yarnpkg.com/features/release-workflow#deferred-versioning).\n ",examples:[["Immediately bump the version to the next major","yarn version major"],["Prepare the version to be bumped to the next major","yarn version major --deferred"]]})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!a)throw new or(o.cwd,this.context.cwd);let n=r.get("preferDeferredVersions");this.deferred&&(n=!0),this.immediate&&(n=!1);let u=_F.default.valid(this.strategy),A=this.strategy==="decline",p;if(u)if(a.manifest.version!==null){let E=b5(a.manifest.version,this.strategy);E!==null?p=E:p=this.strategy}else p=this.strategy;else{let E=a.manifest.version;if(!A){if(E===null)throw new it("Can't bump the version if there wasn't a version to begin with - use 0.0.0 as initial version then run the command again.");if(typeof E!="string"||!_F.default.valid(E))throw new it(`Can't bump the version (${E}) if it's not valid semver`)}p=pI(this.strategy)}if(!n){let w=(await oD(o)).get(a);if(typeof w<"u"&&p!=="decline"){let D=MF(a.manifest.version,p);if(_F.default.lt(D,w))throw new it(`Can't bump the version to one that would be lower than the current deferred one (${w})`)}}let h=await gI(o,{allowEmpty:!0});return h.releases.set(a,p),await h.saveAll(),n?0:await this.cli.run(["version","apply"])}};var QDt={configuration:{deferredVersionFolder:{description:"Folder where are stored the versioning files",type:"ABSOLUTE_PATH",default:"./.yarn/versions"},preferDeferredVersions:{description:"If true, running `yarn version` will assume the `--deferred` flag unless `--immediate` is set",type:"BOOLEAN",default:!1}},commands:[mI,yI,EI]},FDt=QDt;var F5={};Vt(F5,{WorkspacesFocusCommand:()=>CI,WorkspacesForeachCommand:()=>wI,default:()=>LDt});Ve();Ve();Gt();var CI=class extends ut{constructor(){super(...arguments);this.json=de.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.production=de.Boolean("--production",!1,{description:"Only install regular dependencies by omitting dev dependencies"});this.all=de.Boolean("-A,--all",!1,{description:"Install the entire project"});this.workspaces=de.Rest()}static{this.paths=[["workspaces","focus"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"install a single workspace and its dependencies",details:"\n This command will run an install as if the specified workspaces (and all other workspaces they depend on) were the only ones in the project. If no workspaces are explicitly listed, the active one will be assumed.\n\n Note that this command is only very moderately useful when using zero-installs, since the cache will contain all the packages anyway - meaning that the only difference between a full install and a focused install would just be a few extra lines in the `.pnp.cjs` file, at the cost of introducing an extra complexity.\n\n If the `-A,--all` flag is set, the entire project will be installed. Combine with `--production` to replicate the old `yarn install --production`.\n "})}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd),n=await Wr.find(r);await o.restoreInstallState({restoreResolutions:!1});let u;if(this.all)u=new Set(o.workspaces);else if(this.workspaces.length===0){if(!a)throw new or(o.cwd,this.context.cwd);u=new Set([a])}else u=new Set(this.workspaces.map(A=>o.getWorkspaceByIdent(G.parseIdent(A))));for(let A of u)for(let p of this.production?["dependencies"]:_t.hardDependencies)for(let h of A.manifest.getForScope(p).values()){let E=o.tryWorkspaceByDescriptor(h);E!==null&&u.add(E)}for(let A of o.workspaces)u.has(A)?this.production&&A.manifest.devDependencies.clear():(A.manifest.installConfig=A.manifest.installConfig||{},A.manifest.installConfig.selfReferences=!1,A.manifest.dependencies.clear(),A.manifest.devDependencies.clear(),A.manifest.peerDependencies.clear(),A.manifest.scripts.clear());return await o.installWithNewReport({json:this.json,stdout:this.context.stdout},{cache:n,persistProject:!1})}};Ve();Ve();Ve();Gt();var II=et(Xo()),bve=et(lg());il();var wI=class extends ut{constructor(){super(...arguments);this.from=de.Array("--from",{description:"An array of glob pattern idents or paths from which to base any recursion"});this.all=de.Boolean("-A,--all",{description:"Run the command on all workspaces of a project"});this.recursive=de.Boolean("-R,--recursive",{description:"Run the command on the current workspace and all of its recursive dependencies"});this.worktree=de.Boolean("-W,--worktree",{description:"Run the command on all workspaces of the current worktree"});this.verbose=de.Counter("-v,--verbose",{description:"Increase level of logging verbosity up to 2 times"});this.parallel=de.Boolean("-p,--parallel",!1,{description:"Run the commands in parallel"});this.interlaced=de.Boolean("-i,--interlaced",!1,{description:"Print the output of commands in real-time instead of buffering it"});this.jobs=de.String("-j,--jobs",{description:"The maximum number of parallel tasks that the execution will be limited to; or `unlimited`",validator:pL([js(["unlimited"]),vw(fL(),[gL(),hL(1)])])});this.topological=de.Boolean("-t,--topological",!1,{description:"Run the command after all workspaces it depends on (regular) have finished"});this.topologicalDev=de.Boolean("--topological-dev",!1,{description:"Run the command after all workspaces it depends on (regular + dev) have finished"});this.include=de.Array("--include",[],{description:"An array of glob pattern idents or paths; only matching workspaces will be traversed"});this.exclude=de.Array("--exclude",[],{description:"An array of glob pattern idents or paths; matching workspaces won't be traversed"});this.publicOnly=de.Boolean("--no-private",{description:"Avoid running the command on private workspaces"});this.since=de.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.dryRun=de.Boolean("-n,--dry-run",{description:"Print the commands that would be run, without actually running them"});this.commandName=de.String();this.args=de.Proxy()}static{this.paths=[["workspaces","foreach"]]}static{this.usage=ot.Usage({category:"Workspace-related commands",description:"run a command on all workspaces",details:"\n This command will run a given sub-command on current and all its descendant workspaces. Various flags can alter the exact behavior of the command:\n\n - If `-p,--parallel` is set, the commands will be ran in parallel; they'll by default be limited to a number of parallel tasks roughly equal to half your core number, but that can be overridden via `-j,--jobs`, or disabled by setting `-j unlimited`.\n\n - If `-p,--parallel` and `-i,--interlaced` are both set, Yarn will print the lines from the output as it receives them. If `-i,--interlaced` wasn't set, it would instead buffer the output from each process and print the resulting buffers only after their source processes have exited.\n\n - If `-t,--topological` is set, Yarn will only run the command after all workspaces that it depends on through the `dependencies` field have successfully finished executing. If `--topological-dev` is set, both the `dependencies` and `devDependencies` fields will be considered when figuring out the wait points.\n\n - If `-A,--all` is set, Yarn will run the command on all the workspaces of a project.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If `-W,--worktree` is set, Yarn will find workspaces to run the command on by looking at the current worktree.\n\n - If `--from` is set, Yarn will use the packages matching the 'from' glob as the starting point for any recursive search.\n\n - If `--since` is set, Yarn will only run the command on workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `--dry-run` is set, Yarn will explain what it would do without actually doing anything.\n\n - The command may apply to only some workspaces through the use of `--include` which acts as a whitelist. The `--exclude` flag will do the opposite and will be a list of packages that mustn't execute the script. Both flags accept glob patterns (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n The `-v,--verbose` flag can be passed up to twice: once to prefix output lines with the originating workspace's name, and again to include start/finish/timing log lines. Maximum verbosity is enabled by default in terminal environments.\n\n If the command is `run` and the script being run does not exist the child workspace will be skipped without error.\n ",examples:[["Publish all packages","yarn workspaces foreach -A npm publish --tolerate-republish"],["Run the build script on all descendant packages","yarn workspaces foreach -A run build"],["Run the build script on current and all descendant packages in parallel, building package dependencies first","yarn workspaces foreach -Apt run build"],["Run the build script on several packages and all their dependencies, building dependencies first","yarn workspaces foreach -Rpt --from '{workspace-a,workspace-b}' run build"]]})}static{this.schema=[Sw("all",Vu.Forbids,["from","recursive","since","worktree"],{missingIf:"undefined"}),dL(["all","recursive","since","worktree"],{missingIf:"undefined"})]}async execute(){let r=await ze.find(this.context.cwd,this.context.plugins),{project:o,workspace:a}=await Qt.find(r,this.context.cwd);if(!this.all&&!a)throw new or(o.cwd,this.context.cwd);await o.restoreInstallState();let n=this.cli.process([this.commandName,...this.args]),u=n.path.length===1&&n.path[0]==="run"&&typeof n.scriptName<"u"?n.scriptName:null;if(n.path.length===0)throw new it("Invalid subcommand name for iteration - use the 'run' keyword if you wish to execute a script");let A=Ee=>{this.dryRun&&this.context.stdout.write(`${Ee} -`)},p=()=>{let Ee=this.from.map(g=>II.default.matcher(g));return o.workspaces.filter(g=>{let me=G.stringifyIdent(g.anchoredLocator),Ce=g.relativeCwd;return Ee.some(fe=>fe(me)||fe(Ce))})},h=[];if(this.since?(A("Option --since is set; selecting the changed workspaces as root for workspace selection"),h=Array.from(await ra.fetchChangedWorkspaces({ref:this.since,project:o}))):this.from?(A("Option --from is set; selecting the specified workspaces"),h=[...p()]):this.worktree?(A("Option --worktree is set; selecting the current workspace"),h=[a]):this.recursive?(A("Option --recursive is set; selecting the current workspace"),h=[a]):this.all&&(A("Option --all is set; selecting all workspaces"),h=[...o.workspaces]),this.dryRun&&!this.all){for(let Ee of h)A(` -- ${Ee.relativeCwd} - ${G.prettyLocator(r,Ee.anchoredLocator)}`);h.length>0&&A("")}let E;if(this.recursive?this.since?(A("Option --recursive --since is set; recursively selecting all dependent workspaces"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceDependents()]).flat())):(A("Option --recursive is set; recursively selecting all transitive dependencies"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceDependencies()]).flat())):this.worktree?(A("Option --worktree is set; recursively selecting all nested workspaces"),E=new Set(h.map(Ee=>[...Ee.getRecursiveWorkspaceChildren()]).flat())):E=null,E!==null&&(h=[...new Set([...h,...E])],this.dryRun))for(let Ee of E)A(` -- ${Ee.relativeCwd} - ${G.prettyLocator(r,Ee.anchoredLocator)}`);let w=[],D=!1;if(u?.includes(":")){for(let Ee of o.workspaces)if(Ee.manifest.scripts.has(u)&&(D=!D,D===!1))break}for(let Ee of h){if(u&&!Ee.manifest.scripts.has(u)&&!D&&!(await hn.getWorkspaceAccessibleBinaries(Ee)).has(u)){A(`Excluding ${Ee.relativeCwd} because it doesn't have a "${u}" script`);continue}if(!(u===r.env.npm_lifecycle_event&&Ee.cwd===a.cwd)){if(this.include.length>0&&!II.default.isMatch(G.stringifyIdent(Ee.anchoredLocator),this.include)&&!II.default.isMatch(Ee.relativeCwd,this.include)){A(`Excluding ${Ee.relativeCwd} because it doesn't match the --include filter`);continue}if(this.exclude.length>0&&(II.default.isMatch(G.stringifyIdent(Ee.anchoredLocator),this.exclude)||II.default.isMatch(Ee.relativeCwd,this.exclude))){A(`Excluding ${Ee.relativeCwd} because it matches the --exclude filter`);continue}if(this.publicOnly&&Ee.manifest.private===!0){A(`Excluding ${Ee.relativeCwd} because it's a private workspace and --no-private was set`);continue}w.push(Ee)}}if(this.dryRun)return 0;let b=this.verbose??(this.context.stdout.isTTY?1/0:0),C=b>0,T=b>1,N=this.parallel?this.jobs==="unlimited"?1/0:Number(this.jobs)||Math.ceil(Xi.availableParallelism()/2):1,U=N===1?!1:this.parallel,J=U?this.interlaced:!0,te=(0,bve.default)(N),le=new Map,ce=new Set,ue=0,Ie=null,he=!1,De=await Lt.start({configuration:r,stdout:this.context.stdout,includePrefix:!1},async Ee=>{let g=async(me,{commandIndex:Ce})=>{if(he)return-1;!U&&T&&Ce>1&&Ee.reportSeparator();let fe=RDt(me,{configuration:r,label:C,commandIndex:Ce}),[ie,Z]=xve(Ee,{prefix:fe,interlaced:J}),[Se,Re]=xve(Ee,{prefix:fe,interlaced:J});try{T&&Ee.reportInfo(null,`${fe?`${fe} `:""}Process started`);let ht=Date.now(),q=await this.cli.run([this.commandName,...this.args],{cwd:me.cwd,stdout:ie,stderr:Se})||0;ie.end(),Se.end(),await Z,await Re;let nt=Date.now();if(T){let Le=r.get("enableTimers")?`, completed in ${pe.pretty(r,nt-ht,pe.Type.DURATION)}`:"";Ee.reportInfo(null,`${fe?`${fe} `:""}Process exited (exit code ${q})${Le}`)}return q===130&&(he=!0,Ie=q),q}catch(ht){throw ie.end(),Se.end(),await Z,await Re,ht}};for(let me of w)le.set(me.anchoredLocator.locatorHash,me);for(;le.size>0&&!Ee.hasErrors();){let me=[];for(let[Z,Se]of le){if(ce.has(Se.anchoredDescriptor.descriptorHash))continue;let Re=!0;if(this.topological||this.topologicalDev){let ht=this.topologicalDev?new Map([...Se.manifest.dependencies,...Se.manifest.devDependencies]):Se.manifest.dependencies;for(let q of ht.values()){let nt=o.tryWorkspaceByDescriptor(q);if(Re=nt===null||!le.has(nt.anchoredLocator.locatorHash),!Re)break}}if(Re&&(ce.add(Se.anchoredDescriptor.descriptorHash),me.push(te(async()=>{let ht=await g(Se,{commandIndex:++ue});return le.delete(Z),ce.delete(Se.anchoredDescriptor.descriptorHash),{workspace:Se,exitCode:ht}})),!U))break}if(me.length===0){let Z=Array.from(le.values()).map(Se=>G.prettyLocator(r,Se.anchoredLocator)).join(", ");Ee.reportError(3,`Dependency cycle detected (${Z})`);return}let Ce=await Promise.all(me);Ce.forEach(({workspace:Z,exitCode:Se})=>{Se!==0&&Ee.reportError(0,`The command failed in workspace ${G.prettyLocator(r,Z.anchoredLocator)} with exit code ${Se}`)});let ie=Ce.map(Z=>Z.exitCode).find(Z=>Z!==0);(this.topological||this.topologicalDev)&&typeof ie<"u"&&Ee.reportError(0,"The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph")}});return Ie!==null?Ie:De.exitCode()}};function xve(t,{prefix:e,interlaced:r}){let o=t.createStreamReporter(e),a=new qe.DefaultStream;a.pipe(o,{end:!1}),a.on("finish",()=>{o.end()});let n=new Promise(A=>{o.on("finish",()=>{A(a.active)})});if(r)return[a,n];let u=new qe.BufferStream;return u.pipe(a,{end:!1}),u.on("finish",()=>{a.end()}),[u,n]}function RDt(t,{configuration:e,commandIndex:r,label:o}){if(!o)return null;let n=`[${G.stringifyIdent(t.anchoredLocator)}]:`,u=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],A=u[r%u.length];return pe.pretty(e,n,A)}var TDt={commands:[CI,wI]},LDt=TDt;var lE=()=>({modules:new Map([["@yarnpkg/cli",P2],["@yarnpkg/core",S2],["@yarnpkg/fslib",Aw],["@yarnpkg/libzip",K1],["@yarnpkg/parsers",Ew],["@yarnpkg/shell",e2],["clipanion",Qw],["semver",NDt],["typanion",Yo],["@yarnpkg/plugin-essentials",MH],["@yarnpkg/plugin-compat",jH],["@yarnpkg/plugin-constraints",a6],["@yarnpkg/plugin-dlx",l6],["@yarnpkg/plugin-exec",A6],["@yarnpkg/plugin-file",p6],["@yarnpkg/plugin-git",OH],["@yarnpkg/plugin-github",d6],["@yarnpkg/plugin-http",m6],["@yarnpkg/plugin-init",y6],["@yarnpkg/plugin-interactive-tools",mj],["@yarnpkg/plugin-link",yj],["@yarnpkg/plugin-nm",tG],["@yarnpkg/plugin-npm",$G],["@yarnpkg/plugin-npm-cli",l5],["@yarnpkg/plugin-pack",KG],["@yarnpkg/plugin-patch",g5],["@yarnpkg/plugin-pnp",jj],["@yarnpkg/plugin-pnpm",y5],["@yarnpkg/plugin-stage",D5],["@yarnpkg/plugin-typescript",S5],["@yarnpkg/plugin-version",Q5],["@yarnpkg/plugin-workspace-tools",F5]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-constraints","@yarnpkg/plugin-dlx","@yarnpkg/plugin-exec","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-interactive-tools","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm","@yarnpkg/plugin-stage","@yarnpkg/plugin-typescript","@yarnpkg/plugin-version","@yarnpkg/plugin-workspace-tools"])});function Fve({cwd:t,pluginConfiguration:e}){let r=new Ko({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:nn??""});return Object.assign(r,{defaultContext:{...Ko.defaultContext,cwd:t,plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr}})}function ODt(t){if(qe.parseOptionalBoolean(process.env.YARN_IGNORE_NODE))return!0;let r=process.versions.node,o=">=18.12.0";if(Ur.satisfiesWithPrereleases(r,o))return!0;let a=new it(`This tool requires a Node version compatible with ${o} (got ${r}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);return Ko.defaultContext.stdout.write(t.error(a)),!1}async function Rve({selfPath:t,pluginConfiguration:e}){return await ze.find(Ae.toPortablePath(process.cwd()),e,{strict:!1,usePathCheck:t})}function MDt(t,e,{yarnPath:r}){if(!ae.existsSync(r))return t.error(new Error(`The "yarn-path" option has been set, but the specified location doesn't exist (${r}).`)),1;process.on("SIGINT",()=>{});let o={stdio:"inherit",env:{...process.env,YARN_IGNORE_PATH:"1"}};try{(0,kve.execFileSync)(process.execPath,[Ae.fromPortablePath(r),...e],o)}catch(a){return a.status??1}return 0}function UDt(t,e){let r=null,o=e;return e.length>=2&&e[0]==="--cwd"?(r=Ae.toPortablePath(e[1]),o=e.slice(2)):e.length>=1&&e[0].startsWith("--cwd=")?(r=Ae.toPortablePath(e[0].slice(6)),o=e.slice(1)):e[0]==="add"&&e[e.length-2]==="--cwd"&&(r=Ae.toPortablePath(e[e.length-1]),o=e.slice(0,e.length-2)),t.defaultContext.cwd=r!==null?V.resolve(r):V.cwd(),o}function _Dt(t,{configuration:e}){if(!e.get("enableTelemetry")||Qve.isCI||!process.stdout.isTTY)return;ze.telemetry=new sE(e,"puba9cdc10ec5790a2cf4969dd413a47270");let o=/^@yarnpkg\/plugin-(.*)$/;for(let a of e.plugins.keys())oE.has(a.match(o)?.[1]??"")&&ze.telemetry?.reportPluginName(a);t.binaryVersion&&ze.telemetry.reportVersion(t.binaryVersion)}function Tve(t,{configuration:e}){for(let r of e.plugins.values())for(let o of r.commands||[])t.register(o)}async function HDt(t,e,{selfPath:r,pluginConfiguration:o}){if(!ODt(t))return 1;let a=await Rve({selfPath:r,pluginConfiguration:o}),n=a.get("yarnPath"),u=a.get("ignorePath");if(n&&!u)return MDt(t,e,{yarnPath:n});delete process.env.YARN_IGNORE_PATH;let A=UDt(t,e);_Dt(t,{configuration:a}),Tve(t,{configuration:a});let p=t.process(A,t.defaultContext);return p.help||ze.telemetry?.reportCommandName(p.path.join(" ")),await t.run(p,t.defaultContext)}async function qhe({cwd:t=V.cwd(),pluginConfiguration:e=lE()}={}){let r=Fve({cwd:t,pluginConfiguration:e}),o=await Rve({pluginConfiguration:e,selfPath:null});return Tve(r,{configuration:o}),r}async function Nk(t,{cwd:e=V.cwd(),selfPath:r,pluginConfiguration:o}){let a=Fve({cwd:e,pluginConfiguration:o});function n(){Ko.defaultContext.stdout.write(`ERROR: Yarn is terminating due to an unexpected empty event loop. -Please report this issue at https://github.com/yarnpkg/berry/issues.`)}process.once("beforeExit",n);try{process.exitCode=42,process.exitCode=await HDt(a,t,{selfPath:r,pluginConfiguration:o})}catch(u){Ko.defaultContext.stdout.write(a.error(u)),process.exitCode=1}finally{process.off("beforeExit",n),await ae.rmtempPromise()}}Nk(process.argv.slice(2),{cwd:V.cwd(),selfPath:Ae.toPortablePath(Ae.resolve(process.argv[1])),pluginConfiguration:lE()});})(); -/** - @license - Copyright (c) 2015, Rebecca Turner - - Permission to use, copy, modify, and/or distribute this software for any - purpose with or without fee is hereby granted, provided that the above - copyright notice and this permission notice appear in all copies. - - THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR - OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - PERFORMANCE OF THIS SOFTWARE. - */ -/** - @license - Copyright Node.js contributors. 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 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. -*/ -/** - @license - The MIT License (MIT) - - Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) - - 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. -*/ -/** - @license - Copyright Joyent, Inc. and other Node contributors. - - 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. -*/ -/*! Bundled license information: - -is-number/index.js: - (*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - *) - -to-regex-range/index.js: - (*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - *) - -fill-range/index.js: - (*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - *) - -is-extglob/index.js: - (*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - *) - -is-glob/index.js: - (*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - *) - -queue-microtask/index.js: - (*! queue-microtask. MIT License. Feross Aboukhadijeh *) - -run-parallel/index.js: - (*! run-parallel. MIT License. Feross Aboukhadijeh *) - -git-url-parse/lib/index.js: - (*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - *) - -object-assign/index.js: - (* - object-assign - (c) Sindre Sorhus - @license MIT - *) - -react/cjs/react.production.min.js: - (** @license React v17.0.2 - * react.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - *) - -scheduler/cjs/scheduler.production.min.js: - (** @license React v0.20.2 - * scheduler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - *) - -react-reconciler/cjs/react-reconciler.production.min.js: - (** @license React v0.26.2 - * react-reconciler.production.min.js - * - * Copyright (c) Facebook, Inc. and its affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - *) - -is-windows/index.js: - (*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - *) -*/ diff --git a/interface/.yarnrc.yml b/interface/.yarnrc.yml deleted file mode 100644 index 75e7d7311..000000000 --- a/interface/.yarnrc.yml +++ /dev/null @@ -1,3 +0,0 @@ -nodeLinker: node-modules - -yarnPath: .yarn/releases/yarn-4.7.0.cjs diff --git a/interface/eslint.config.js b/interface/eslint.config.js index 4ccfc79ac..4eca2f5e5 100644 --- a/interface/eslint.config.js +++ b/interface/eslint.config.js @@ -10,8 +10,7 @@ export default tseslint.config( { languageOptions: { parserOptions: { - project: true, - tsconfigRootDir: import.meta.dirname + project: true } } }, diff --git a/interface/package.json b/interface/package.json index 768f03c74..7adf2ae70 100644 --- a/interface/package.json +++ b/interface/package.json @@ -1,6 +1,6 @@ { "name": "EMS-ESP", - "version": "3.7.2", + "version": "3.8.0", "description": "EMS-ESP WebUI", "homepage": "https://emsesp.org", "author": "proddy, emsesp.org", @@ -8,59 +8,64 @@ "private": true, "type": "module", "scripts": { + "preinstall": "npx only-allow pnpm", "dev": "vite dev", "build": "vite build", "preview": "vite preview", - "build-hosted": "typesafe-i18n --no-watch && vite build --mode hosted", - "preview-standalone": "typesafe-i18n --no-watch && vite build && concurrently -c \"auto\" \"yarn:mock-rest\" \"vite preview\"", - "mock-rest": "bun --watch ../mock-api/rest_server.ts", - "standalone": "concurrently -c \"auto\" \"typesafe-i18n\" \"yarn:mock-rest\" \"vite\"", + "build-hosted": "typesafe-i18n && vite build --mode hosted", + "mock-rest": "bun --watch ../mock-api/restServer.ts", + "preview-standalone": "typesafe-i18n --no-watch && vite build && concurrently -c \"auto\" \"pnpm:mock-rest\" \"vite preview\"", + "standalone": "concurrently -c \"auto\" \"typesafe-i18n\" \"pnpm:mock-rest\" \"vite dev\"", "typesafe-i18n": "typesafe-i18n --no-watch", - "webUI": "node progmem-generator.js", + "build_webUI": "typesafe-i18n --no-watch && vite build && node progmem-generator.js", "format": "prettier -l -w '**/*.{ts,tsx,js,css,json,md}'", - "lint": "eslint . --fix" + "lint": "eslint . --fix", + "standalone-devcontainer": "concurrently -c \"auto\" \"typesafe-i18n\" \"pnpm:mock-rest\" \"vite --host\"" }, "dependencies": { - "@alova/adapter-xhr": "2.1.1", + "@alova/adapter-xhr": "2.3.1", "@emotion/react": "^11.14.0", - "@emotion/styled": "^11.14.0", - "@mui/icons-material": "^6.4.8", - "@mui/material": "^6.4.8", - "@table-library/react-table-library": "4.1.12", - "alova": "3.2.10", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^7.3.6", + "@mui/material": "^7.3.6", + "@preact/compat": "^18.3.1", + "@table-library/react-table-library": "4.1.15", + "alova": "3.4.1", "async-validator": "^4.2.5", + "etag": "^1.8.1", + "formidable": "^3.5.4", "jwt-decode": "^4.0.0", - "mime-types": "^2.1.35", - "preact": "^10.26.4", - "react": "^19.0.0", - "react-dom": "^19.0.0", + "magic-string": "^0.30.21", + "mime-types": "^3.0.2", + "preact": "^10.28.1", + "react": "^19.2.3", + "react-dom": "^19.2.3", "react-icons": "^5.5.0", - "react-router": "^7.4.0", + "react-router": "^7.11.0", "react-toastify": "^11.0.5", "typesafe-i18n": "^5.26.2", - "typescript": "^5.8.2" + "typescript": "^5.9.3" }, "devDependencies": { - "@babel/core": "^7.26.10", - "@eslint/js": "^9.23.0", + "@babel/core": "^7.28.5", + "@eslint/js": "^9.39.2", "@preact/compat": "^18.3.1", - "@preact/preset-vite": "^2.10.1", - "@trivago/prettier-plugin-sort-imports": "^5.2.2", - "@types/formidable": "^3", - "@types/node": "^22.13.11", - "@types/react": "^19.0.12", - "@types/react-dom": "^19.0.4", - "concurrently": "^9.1.2", - "eslint": "^9.23.0", - "eslint-config-prettier": "^10.1.1", - "formidable": "^3.5.2", - "prettier": "^3.5.3", - "rollup-plugin-visualizer": "^5.14.0", - "terser": "^5.39.0", - "typescript-eslint": "8.27.0", - "vite": "^6.2.2", + "@preact/preset-vite": "^2.10.2", + "@trivago/prettier-plugin-sort-imports": "^6.0.0", + "@types/node": "^25.0.3", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "axe-core": "^4.11.0", + "concurrently": "^9.2.1", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "prettier": "^3.7.4", + "rollup-plugin-visualizer": "^6.0.5", + "terser": "^5.44.1", + "typescript-eslint": "^8.51.0", + "vite": "^7.3.0", "vite-plugin-imagemin": "^0.6.1", - "vite-tsconfig-paths": "^5.1.4" + "vite-tsconfig-paths": "^6.0.3" }, - "packageManager": "yarn@4.7.0" + "packageManager": "pnpm@10.27.0+sha512.72d699da16b1179c14ba9e64dc71c9a40988cbdc65c264cb0e489db7de917f20dcf4d64d8723625f2969ba52d4b7e2a1170682d9ac2a5dcaeaab732b7e16f04a" } diff --git a/interface/pnpm-workspace.yaml b/interface/pnpm-workspace.yaml new file mode 100644 index 000000000..1b81f607b --- /dev/null +++ b/interface/pnpm-workspace.yaml @@ -0,0 +1,8 @@ +onlyBuiltDependencies: + - cwebp-bin + - esbuild + - gifsicle + - jpegtran-bin + - mozjpeg + - optipng-bin + - pngquant-bin diff --git a/interface/progmem-generator.js b/interface/progmem-generator.js index 52ec26625..30fc00094 100644 --- a/interface/progmem-generator.js +++ b/interface/progmem-generator.js @@ -1,4 +1,4 @@ -import crypto from 'crypto'; +import etag from 'etag'; import { createWriteStream, existsSync, @@ -15,67 +15,80 @@ const INDENT = ' '; const outputPath = '../src/ESP32React/WWWData.h'; const sourcePath = './dist'; const bytesPerLine = 20; -var totalSize = 0; +let totalSize = 0; +let bundleStats = { + js: { count: 0, uncompressed: 0, compressed: 0 }, + css: { count: 0, uncompressed: 0, compressed: 0 }, + html: { count: 0, uncompressed: 0, compressed: 0 }, + svg: { count: 0, uncompressed: 0, compressed: 0 }, + other: { count: 0, uncompressed: 0, compressed: 0 } +}; -const generateWWWClass = () => - `typedef std::function RouteRegistrationHandler; -// Total size is ${totalSize} bytes +const generateWWWClass = + () => `typedef std::function RouteRegistrationHandler; +// Bundle Statistics: +// - Total compressed size: ${(totalSize / 1000).toFixed(1)} KB +// - Total uncompressed size: ${(Object.values(bundleStats).reduce((sum, stat) => sum + stat.uncompressed, 0) / 1000).toFixed(1)} KB +// - Compression ratio: ${(((Object.values(bundleStats).reduce((sum, stat) => sum + stat.uncompressed, 0) - totalSize) / Object.values(bundleStats).reduce((sum, stat) => sum + stat.uncompressed, 0)) * 100).toFixed(1)}% +// - Generated on: ${new Date().toISOString()} class WWWData { -${indent}public: -${indent.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) { -${fileInfo.map((file) => `${indent.repeat(3)}handler("${file.uri}", "${file.mimeType}", ${file.variable}, ${file.size}, "${file.hash}");`).join('\n')} -${indent.repeat(2)}} +${INDENT}public: +${INDENT.repeat(2)}static void registerRoutes(RouteRegistrationHandler handler) { +${fileInfo.map((f) => `${INDENT.repeat(3)}handler("${f.uri}", "${f.mimeType}", ${f.variable}, ${f.size}, ${f.hash});`).join('\n')} +${INDENT.repeat(2)}} }; `; -function getFilesSync(dir, files = []) { +const getFilesSync = (dir, files = []) => { readdirSync(dir, { withFileTypes: true }).forEach((entry) => { const entryPath = resolve(dir, entry.name); - if (entry.isDirectory()) { - getFilesSync(entryPath, files); - } else { - files.push(entryPath); - } + entry.isDirectory() ? getFilesSync(entryPath, files) : files.push(entryPath); }); return files; -} +}; -function cleanAndOpen(path) { - if (existsSync(path)) { - unlinkSync(path); - } +const cleanAndOpen = (path) => { + existsSync(path) && unlinkSync(path); return createWriteStream(path, { flags: 'w+' }); -} +}; + +const getFileType = (filePath) => { + const ext = filePath.split('.').pop().toLowerCase(); + if (ext === 'js') return 'js'; + if (ext === 'css') return 'css'; + if (ext === 'html') return 'html'; + if (ext === 'svg') return 'svg'; + return 'other'; +}; const writeFile = (relativeFilePath, buffer) => { - const variable = 'ESP_REACT_DATA_' + fileInfo.length; + const variable = `ESP_REACT_DATA_${fileInfo.length}`; const mimeType = mime.lookup(relativeFilePath); - var size = 0; - writeStream.write('const uint8_t ' + variable + '[] = {'); - // const zipBuffer = zlib.brotliCompressSync(buffer, { quality: 1 }); - const zipBuffer = zlib.gzipSync(buffer, { level: 9 }); + const fileType = getFileType(relativeFilePath); + let size = 0; + writeStream.write(`const uint8_t ${variable}[] = {`); - // create sha - const hashSum = crypto.createHash('sha256'); - hashSum.update(zipBuffer); - const hash = hashSum.digest('hex'); + const zipBuffer = zlib.gzipSync(buffer, { level: 9 }); + // const hash = crypto.createHash('sha256').update(zipBuffer).digest('hex'); + const hash = etag(zipBuffer); // use smaller md5 instead of sha256 zipBuffer.forEach((b) => { if (!(size % bytesPerLine)) { - writeStream.write('\n'); - writeStream.write(indent); + writeStream.write('\n' + INDENT); } - writeStream.write('0x' + ('00' + b.toString(16).toUpperCase()).slice(-2) + ','); + writeStream.write('0x' + b.toString(16).toUpperCase().padStart(2, '0') + ','); size++; }); - if (size % bytesPerLine) { - writeStream.write('\n'); - } - + size % bytesPerLine && writeStream.write('\n'); writeStream.write('};\n\n'); + // Update bundle statistics + bundleStats[fileType].count++; + bundleStats[fileType].uncompressed += buffer.length; + bundleStats[fileType].compressed += zipBuffer.length; + fileInfo.push({ uri: '/' + relativeFilePath.replace(sep, '/'), mimeType, @@ -84,32 +97,52 @@ const writeFile = (relativeFilePath, buffer) => { hash }); - // console.log(relativeFilePath + ' (size ' + size + ' bytes)'); totalSize += size; }; -// start -console.log('Generating ' + outputPath + ' from ' + sourcePath); -const includes = ARDUINO_INCLUDES; -const indent = INDENT; +console.log(`Generating ${outputPath} from ${sourcePath}`); const fileInfo = []; const writeStream = cleanAndOpen(resolve(outputPath)); -// includes -writeStream.write(includes); +writeStream.write(ARDUINO_INCLUDES); -// process static files const buildPath = resolve(sourcePath); for (const filePath of getFilesSync(buildPath)) { - const readStream = readFileSync(filePath); - const relativeFilePath = relative(buildPath, filePath); - writeFile(relativeFilePath, readStream); + writeFile(relative(buildPath, filePath), readFileSync(filePath)); } -// add class writeStream.write(generateWWWClass()); - -// end writeStream.end(); -console.log('Total size: ' + totalSize / 1000 + ' KB'); +// Calculate and display bundle statistics +const totalUncompressed = Object.values(bundleStats).reduce( + (sum, stat) => sum + stat.uncompressed, + 0 +); +const totalCompressed = Object.values(bundleStats).reduce( + (sum, stat) => sum + stat.compressed, + 0 +); +const compressionRatio = ( + ((totalUncompressed - totalCompressed) / totalUncompressed) * + 100 +).toFixed(1); + +console.log('\n📊 Bundle Size Analysis:'); +console.log('='.repeat(50)); +console.log(`Total compressed size: ${(totalSize / 1000).toFixed(1)} KB`); +console.log(`Total uncompressed size: ${(totalUncompressed / 1000).toFixed(1)} KB`); +console.log(`Compression ratio: ${compressionRatio}%`); +console.log('\n📁 File Type Breakdown:'); +Object.entries(bundleStats).forEach(([type, stats]) => { + if (stats.count > 0) { + const ratio = ( + ((stats.uncompressed - stats.compressed) / stats.uncompressed) * + 100 + ).toFixed(1); + console.log( + `${type.toUpperCase().padEnd(4)}: ${stats.count} files, ${(stats.uncompressed / 1000).toFixed(1)} KB → ${(stats.compressed / 1000).toFixed(1)} KB (${ratio}% compression)` + ); + } +}); +console.log('='.repeat(50)); diff --git a/interface/src/App.tsx b/interface/src/App.tsx index 7b4115c2c..c92e5f9cd 100644 --- a/interface/src/App.tsx +++ b/interface/src/App.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { memo, useCallback, useEffect, useState } from 'react'; import { ToastContainer, Zoom } from 'react-toastify'; import AppRouting from 'AppRouting'; @@ -8,7 +8,7 @@ import type { Locales } from 'i18n/i18n-types'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; import { detectLocale, navigatorDetector } from 'typesafe-i18n/detectors'; -const availableLocales = [ +const AVAILABLE_LOCALES = [ 'de', 'en', 'it', @@ -20,47 +20,56 @@ const availableLocales = [ 'sv', 'tr', 'cz' -]; +] as Locales[]; -const App = () => { +// Static toast configuration - no need to recreate on every render +const TOAST_CONTAINER_PROPS = { + position: 'bottom-left' as const, + autoClose: 3000, + hideProgressBar: false, + newestOnTop: false, + closeOnClick: true, + rtl: false, + pauseOnFocusLoss: true, + draggable: false, + pauseOnHover: false, + transition: Zoom, + closeButton: false, + theme: 'dark' as const, + toastStyle: { + border: '1px solid #177ac9', + width: 'fit-content' + } +}; + +const App = memo(() => { const [wasLoaded, setWasLoaded] = useState(false); const [locale, setLocale] = useState('en'); - useEffect(() => { - // determine locale, take from session if set other default to browser language - const browserLocale = detectLocale('en', availableLocales, navigatorDetector); + // Memoize locale initialization to prevent unnecessary re-runs + const initializeLocale = useCallback(async () => { + const browserLocale = detectLocale('en', AVAILABLE_LOCALES, navigatorDetector); const newLocale = (localStorage.getItem('lang') || browserLocale) as Locales; localStorage.setItem('lang', newLocale); setLocale(newLocale); - void loadLocaleAsync(newLocale).then(() => setWasLoaded(true)); + await loadLocaleAsync(newLocale); + setWasLoaded(true); }, []); + useEffect(() => { + void initializeLocale(); + }, [initializeLocale]); + if (!wasLoaded) return null; return ( - + ); -}; +}); export default App; diff --git a/interface/src/AppRouting.tsx b/interface/src/AppRouting.tsx index cf570a169..91c8f0945 100644 --- a/interface/src/AppRouting.tsx +++ b/interface/src/AppRouting.tsx @@ -1,60 +1,80 @@ -import { useContext, useEffect } from 'react'; +import { type FC, Suspense, lazy, memo, useContext, useEffect, useRef } from 'react'; import { Navigate, Route, Routes } from 'react-router'; import { toast } from 'react-toastify'; -import AuthenticatedRouting from 'AuthenticatedRouting'; -import SignIn from 'SignIn'; -import { RequireAuthenticated, RequireUnauthenticated } from 'components'; +import { + LoadingSpinner, + RequireAuthenticated, + RequireUnauthenticated +} from 'components'; import { Authentication, AuthenticationContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; +// Lazy load route components for better code splitting +const SignIn = lazy(() => import('SignIn')); +const AuthenticatedRouting = lazy(() => import('AuthenticatedRouting')); + interface SecurityRedirectProps { - message: string; - signOut?: boolean; + readonly message: string; + readonly signOut?: boolean; } -const RootRedirect = ({ message, signOut }: SecurityRedirectProps) => { - const authenticationContext = useContext(AuthenticationContext); - useEffect(() => { - signOut && authenticationContext.signOut(false); - toast.success(message); - }, [message, signOut, authenticationContext]); - return ; -}; +const RootRedirect: FC = memo( + ({ message, signOut = false }) => { + const { signOut: contextSignOut } = useContext(AuthenticationContext); + const hasShownToast = useRef(false); -const AppRouting = () => { + useEffect(() => { + // Prevent duplicate toasts on strict mode or re-renders + if (!hasShownToast.current) { + hasShownToast.current = true; + if (signOut) { + contextSignOut(false); + } + toast.success(message); + } + // Only run once on mount - using ref to track execution + }, []); + + return ; + } +); + +const AppRouting: FC = memo(() => { const { LL } = useI18nContext(); return ( - - } - /> - } - /> - - - - } - /> - - - - } - /> - + }> + + } + /> + } + /> + + + + } + /> + + + + } + /> + + ); -}; +}); export default AppRouting; diff --git a/interface/src/AuthenticatedRouting.tsx b/interface/src/AuthenticatedRouting.tsx index 9777ed50a..1be5b0f49 100644 --- a/interface/src/AuthenticatedRouting.tsx +++ b/interface/src/AuthenticatedRouting.tsx @@ -1,76 +1,88 @@ -import { useContext } from 'react'; +import { Suspense, lazy, memo, useContext } from 'react'; import { Navigate, Route, Routes } from 'react-router'; -import CustomEntities from 'app/main/CustomEntities'; -import Customizations from 'app/main/Customizations'; -import Dashboard from 'app/main/Dashboard'; -import Devices from 'app/main/Devices'; -import Help from 'app/main/Help'; -import Modules from 'app/main/Modules'; -import Scheduler from 'app/main/Scheduler'; -import Sensors from 'app/main/Sensors'; -import APSettings from 'app/settings/APSettings'; -import ApplicationSettings from 'app/settings/ApplicationSettings'; -import DownloadUpload from 'app/settings/DownloadUpload'; -import MqttSettings from 'app/settings/MqttSettings'; -import NTPSettings from 'app/settings/NTPSettings'; -import Settings from 'app/settings/Settings'; -import Network from 'app/settings/network/Network'; -import Security from 'app/settings/security/Security'; -import APStatus from 'app/status/APStatus'; -import Activity from 'app/status/Activity'; -import HardwareStatus from 'app/status/HardwareStatus'; -import MqttStatus from 'app/status/MqttStatus'; -import NTPStatus from 'app/status/NTPStatus'; -import NetworkStatus from 'app/status/NetworkStatus'; -import Status from 'app/status/Status'; -import SystemLog from 'app/status/SystemLog'; -import Version from 'app/status/Version'; -import { Layout } from 'components'; +import { Layout, LoadingSpinner } from 'components'; import { AuthenticatedContext } from 'contexts/authentication'; -const AuthenticatedRouting = () => { +// Lazy load all route components for better code splitting +const Dashboard = lazy(() => import('app/main/Dashboard')); +const Devices = lazy(() => import('app/main/Devices')); +const Sensors = lazy(() => import('app/main/Sensors')); +const Help = lazy(() => import('app/main/Help')); +const Customizations = lazy(() => import('app/main/Customizations')); +const Scheduler = lazy(() => import('app/main/Scheduler')); +const CustomEntities = lazy(() => import('app/main/CustomEntities')); +const Modules = lazy(() => import('app/main/Modules')); +const UserProfile = lazy(() => import('app/main/UserProfile')); + +const Status = lazy(() => import('app/status/Status')); +const HardwareStatus = lazy(() => import('app/status/HardwareStatus')); +const Activity = lazy(() => import('app/status/Activity')); +const SystemLog = lazy(() => import('app/status/SystemLog')); +const MqttStatus = lazy(() => import('app/status/MqttStatus')); +const NTPStatus = lazy(() => import('app/status/NTPStatus')); +const APStatus = lazy(() => import('app/status/APStatus')); +const NetworkStatus = lazy(() => import('app/status/NetworkStatus')); +const Version = lazy(() => import('app/status/Version')); + +const Settings = lazy(() => import('app/settings/Settings')); +const ApplicationSettings = lazy(() => import('app/settings/ApplicationSettings')); +const MqttSettings = lazy(() => import('app/settings/MqttSettings')); +const NTPSettings = lazy(() => import('app/settings/NTPSettings')); +const APSettings = lazy(() => import('app/settings/APSettings')); +const DownloadUpload = lazy(() => import('app/settings/DownloadUpload')); +const Network = lazy(() => import('app/settings/network/Network')); +const Security = lazy(() => import('app/settings/security/Security')); + +const AuthenticatedRouting = memo(() => { const { me } = useContext(AuthenticatedContext); return ( - - } /> - } /> - } /> - } /> - } /> - } /> + }> + + } /> + } /> + } /> + } /> + } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> - {me.admin && ( - <> - } /> - } /> - } /> - } /> - } /> - } /> - } /> + {me.admin && ( + <> + } /> + } + /> + } /> + } /> + } /> + } /> + } /> - } /> - } /> + } /> + } /> - } /> - } /> - } /> - - )} - + } /> + } /> + } /> + + )} + + } /> + + ); -}; +}); export default AuthenticatedRouting; diff --git a/interface/src/CustomTheme.tsx b/interface/src/CustomTheme.tsx index 579a8d597..7709210fd 100644 --- a/interface/src/CustomTheme.tsx +++ b/interface/src/CustomTheme.tsx @@ -1,6 +1,12 @@ +import { memo } from 'react'; import type { FC } from 'react'; -import { CssBaseline, ThemeProvider, responsiveFontSizes } from '@mui/material'; +import { + CssBaseline, + ThemeProvider, + responsiveFontSizes, + tooltipClasses +} from '@mui/material'; import { createTheme } from '@mui/material/styles'; import type { RequiredChildrenProps } from 'utils'; @@ -10,9 +16,9 @@ export const dialogStyle = { borderRadius: '8px', borderColor: '#565656', borderStyle: 'solid', - borderWidth: '1px' + borderWidth: '2px' } -}; +} as const; const theme = responsiveFontSizes( createTheme({ @@ -30,15 +36,45 @@ const theme = responsiveFontSizes( text: { disabled: '#eee' // white } + }, + components: { + MuiListItemText: { + styleOverrides: { + primary: { + fontSize: 14 + }, + secondary: { + color: '#9e9e9e' // grey[500] + } + } + }, + MuiTooltip: { + defaultProps: { + placement: 'top', + arrow: true + }, + styleOverrides: { + tooltip: { + padding: '4px 8px', + fontSize: 10, + color: 'rgba(0, 0, 0, 0.87)', + backgroundColor: '#4caf50', // MUI success.main default color + boxShadow: '0px 2px 8px rgba(0, 0, 0, 0.15)', + [`& .${tooltipClasses.arrow}`]: { + color: '#4caf50' + } + } + } + } } }) ); -const CustomTheme: FC = ({ children }) => ( +const CustomTheme: FC = memo(({ children }) => ( {children} -); +)); export default CustomTheme; diff --git a/interface/src/SignIn.tsx b/interface/src/SignIn.tsx index c547be43d..c113fff17 100644 --- a/interface/src/SignIn.tsx +++ b/interface/src/SignIn.tsx @@ -1,4 +1,4 @@ -import { useContext, useState } from 'react'; +import { memo, useCallback, useContext, useEffect, useMemo, useState } from 'react'; import { toast } from 'react-toastify'; import ForwardIcon from '@mui/icons-material/Forward'; @@ -19,7 +19,7 @@ import type { SignInRequest } from 'types'; import { onEnterCallback, updateValue } from 'utils'; import { SIGN_IN_REQUEST_VALIDATOR, validate } from 'validators'; -const SignIn = () => { +const SignIn = memo(() => { const authenticationContext = useContext(AuthenticationContext); const { LL } = useI18nContext(); @@ -42,9 +42,18 @@ const SignIn = () => { } }); - const updateLoginRequestValue = updateValue(setSignInRequest); + // Memoize callback to prevent recreation on every render + const updateLoginRequestValue = useMemo( + () => + updateValue((updater) => + setSignInRequest( + updater as unknown as (prevState: SignInRequest) => SignInRequest + ) + ), + [] + ); - const signIn = async () => { + const signIn = useCallback(async () => { await callSignIn(signInRequest).catch((event: Error) => { if (event.message === 'Unauthorized') { toast.warning(LL.INVALID_LOGIN()); @@ -53,9 +62,9 @@ const SignIn = () => { } setProcessing(false); }); - }; + }, [callSignIn, signInRequest, LL]); - const validateAndSignIn = async () => { + const validateAndSignIn = useCallback(async () => { setProcessing(true); SIGN_IN_REQUEST_VALIDATOR.messages({ required: LL.IS_REQUIRED('%s') @@ -67,9 +76,19 @@ const SignIn = () => { setFieldErrors(error as ValidateFieldsError); setProcessing(false); } - }; + }, [signInRequest, signIn, LL]); - const submitOnEnter = onEnterCallback(signIn); + // Memoize callback to prevent recreation on every render + const submitOnEnter = useMemo(() => onEnterCallback(signIn), [signIn]); + + // get rid of scrollbar + useEffect(() => { + const originalOverflow = document.body.style.overflow; + document.body.style.overflow = 'hidden'; + return () => { + document.body.style.overflow = originalOverflow; + }; + }, []); return ( { width: '100%' })} > - {PROJECT_NAME} - + + {PROJECT_NAME} + - - + { }} /> @@ -144,6 +166,6 @@ const SignIn = () => { ); -}; +}); export default SignIn; diff --git a/interface/src/api/app.ts b/interface/src/api/app.ts index a56f4db53..668e61904 100644 --- a/interface/src/api/app.ts +++ b/interface/src/api/app.ts @@ -20,19 +20,18 @@ import type { WriteTemperatureSensor } from '../app/main/types'; +const MSGPACK_CONFIG = { responseType: 'arraybuffer' as const }; + // Dashboard export const readDashboard = () => - alovaInstance.Get('/rest/dashboardData', { - responseType: 'arraybuffer' // uses msgpack - }); + alovaInstance.Get('/rest/dashboardData', MSGPACK_CONFIG); // Devices -export const readCoreData = () => alovaInstance.Get(`/rest/coreData`); +export const readCoreData = () => alovaInstance.Get('/rest/coreData'); export const readDeviceData = (id: number) => alovaInstance.Get('/rest/deviceData', { - // alovaInstance.Get(`/rest/deviceData/${id}`, { params: { id }, - responseType: 'arraybuffer' // uses msgpack + ...MSGPACK_CONFIG }); export const writeDeviceValue = (data: { id: number; c: string; v: unknown }) => alovaInstance.Post('/rest/writeDeviceValue', data); @@ -66,12 +65,13 @@ export const callAction = (action: Action) => // SettingsCustomization export const readDeviceEntities = (id: number) => - // alovaInstance.Get(`/rest/deviceEntities/${id}`, { - alovaInstance.Get(`/rest/deviceEntities`, { + alovaInstance.Get('/rest/deviceEntities', { params: { id }, - responseType: 'arraybuffer', + ...MSGPACK_CONFIG, + // @ts-expect-error - exactOptionalPropertyTypes compatibility issue transform(data) { - return (data as DeviceEntity[]).map((de: DeviceEntity) => ({ + const entities = data as DeviceEntity[]; + return entities.map((de) => ({ ...de, o_m: de.m, o_cn: de.cn, @@ -92,8 +92,10 @@ export const writeDeviceName = (data: { id: number; name: string }) => // SettingsScheduler export const readSchedule = () => alovaInstance.Get('/rest/schedule', { + // @ts-expect-error - exactOptionalPropertyTypes compatibility issue transform(data) { - return (data as Schedule).schedule.map((si: ScheduleItem) => ({ + const schedule = (data as Schedule).schedule; + return schedule.map((si) => ({ ...si, o_id: si.id, o_active: si.active, @@ -113,7 +115,8 @@ export const writeSchedule = (data: Schedule) => export const readModules = () => alovaInstance.Get('/rest/modules', { transform(data) { - return (data as Modules).modules.map((mi: ModuleItem) => ({ + const modules = (data as Modules).modules; + return modules.map((mi) => ({ ...mi, o_enabled: mi.enabled, o_license: mi.license @@ -129,8 +132,10 @@ export const writeModules = (data: { // CustomEntities export const readCustomEntities = () => alovaInstance.Get('/rest/customEntities', { + // @ts-expect-error - exactOptionalPropertyTypes compatibility issue transform(data) { - return (data as Entities).entities.map((ei: EntityItem) => ({ + const entities = (data as Entities).entities; + return entities.map((ei) => ({ ...ei, o_id: ei.id, o_ram: ei.ram, @@ -143,7 +148,8 @@ export const readCustomEntities = () => o_name: ei.name, o_writeable: ei.writeable, o_value: ei.value, - o_deleted: ei.deleted + o_deleted: ei.deleted, + o_hide: ei.hide })); } }); diff --git a/interface/src/api/endpoints.ts b/interface/src/api/endpoints.ts index 99940bb14..95d462689 100644 --- a/interface/src/api/endpoints.ts +++ b/interface/src/api/endpoints.ts @@ -4,55 +4,57 @@ import ReactHook from 'alova/react'; import { unpack } from './unpack'; -export const ACCESS_TOKEN = 'access_token'; +export const ACCESS_TOKEN = 'access_token' as const; + +// Cached token to avoid repeated localStorage access +let cachedToken: string | null = null; + +const getAccessToken = (): string | null => { + if (cachedToken === null) { + cachedToken = localStorage.getItem(ACCESS_TOKEN); + } + return cachedToken; +}; + +// Clear token cache when needed (e.g., on logout) +export const clearTokenCache = (): void => { + cachedToken = null; +}; + +const handleResponse = async (response: AlovaXHRResponse) => { + // Handle various HTTP status codes + if (response.status === 205) { + throw new Error('Reboot required'); + } + if (response.status === 400) { + throw new Error('Request Failed'); + } + if (response.status >= 400) { + throw new Error(response.statusText); + } + + const data = (await response.data) as ArrayBuffer; + + // Unpack MessagePack data if ArrayBuffer + if (data instanceof ArrayBuffer) { + return unpack(data) as ArrayBuffer; + } + + return data; +}; export const alovaInstance = createAlova({ statesHook: ReactHook, - // timeout: 3000, // 3 seconds before throwing a timeout error, default is 0 = none cacheFor: null, // disable cache - // cacheFor: { - // GET: { - // mode: 'memory', - // expire: 60 * 10 * 1000 // 60 seconds in cache - // } - // }, requestAdapter: xhrRequestAdapter(), beforeRequest(method) { - if (localStorage.getItem(ACCESS_TOKEN)) { - method.config.headers.Authorization = - 'Bearer ' + localStorage.getItem(ACCESS_TOKEN); + const token = getAccessToken(); + if (token) { + method.config.headers.Authorization = `Bearer ${token}`; } - // for simulating very slow networks - // return new Promise((resolve) => { - // const random = 3000 + Math.random() * 2000; - // setTimeout(resolve, Math.floor(random)); - // }); }, - responded: { - onSuccess: async (response: AlovaXHRResponse) => { - // if (response.status === 202) { - // throw new Error('Wait'); // wifi scan in progress - // } else - if (response.status === 205) { - throw new Error('Reboot required'); - } else if (response.status === 400) { - throw new Error('Request Failed'); - } else if (response.status >= 400) { - throw new Error(response.statusText); - } - const data: ArrayBuffer = (await response.data) as ArrayBuffer; - if (response.data instanceof ArrayBuffer) { - return unpack(data) as ArrayBuffer; - } - return data; - } - - // Interceptor for request failure. This interceptor will be entered when the request is wrong. - // http errors like 401 (unauthorized) are handled either in the methods or AuthenticatedRouting() - // onError: (error, method) => { - // alert(error.message); - // } + onSuccess: handleResponse } }); diff --git a/interface/src/api/network.ts b/interface/src/api/network.ts index 7f4ff203d..076772377 100644 --- a/interface/src/api/network.ts +++ b/interface/src/api/network.ts @@ -2,12 +2,14 @@ import type { NetworkSettingsType, NetworkStatusType, WiFiNetworkList } from 'ty import { alovaInstance } from './endpoints'; +const LIST_NETWORKS_TIMEOUT = 20000; // 20 seconds + export const readNetworkStatus = () => alovaInstance.Get('/rest/networkStatus'); export const scanNetworks = () => alovaInstance.Get('/rest/scanNetworks'); export const listNetworks = () => alovaInstance.Get('/rest/listNetworks', { - timeout: 20000 // 20 seconds + timeout: LIST_NETWORKS_TIMEOUT }); export const readNetworkSettings = () => alovaInstance.Get('/rest/networkSettings'); diff --git a/interface/src/api/ntp.ts b/interface/src/api/ntp.ts index 443d078b1..7af3566ba 100644 --- a/interface/src/api/ntp.ts +++ b/interface/src/api/ntp.ts @@ -6,7 +6,7 @@ export const readNTPStatus = () => alovaInstance.Get('/rest/ntpStatus'); export const readNTPSettings = () => - alovaInstance.Get('/rest/ntpSettings', {}); + alovaInstance.Get('/rest/ntpSettings'); export const updateNTPSettings = (data: NTPSettingsType) => alovaInstance.Post('/rest/ntpSettings', data); diff --git a/interface/src/api/system.ts b/interface/src/api/system.ts index 99162e20f..1b9d1a37a 100644 --- a/interface/src/api/system.ts +++ b/interface/src/api/system.ts @@ -8,7 +8,7 @@ export const readSystemStatus = () => // SystemLog export const readLogSettings = () => - alovaInstance.Get(`/rest/logSettings`); + alovaInstance.Get('/rest/logSettings'); export const updateLogSettings = (data: LogSettings) => alovaInstance.Post('/rest/logSettings', data); export const fetchLogES = () => alovaInstance.Get('/es/log'); @@ -30,16 +30,18 @@ export const getDevVersion = () => cacheFor: 60 * 10 * 1000, transform(response: { data: { name: string; published_at: string } }) { return { - name: response.data.name.split(/\s+/).splice(-1)[0].substring(1), + name: response.data.name.split(/\s+/).splice(-1)[0]?.substring(1) || '', published_at: response.data.published_at }; } }); +const UPLOAD_TIMEOUT = 60000; // 1 minute + export const uploadFile = (file: File) => { const formData = new FormData(); formData.append('file', file); return alovaInstance.Post('/rest/uploadFile', formData, { - timeout: 60000 // override timeout for uploading firmware - 1 minute + timeout: UPLOAD_TIMEOUT }); }; diff --git a/interface/src/api/unpack.ts b/interface/src/api/unpack.ts index 0f702c3a3..aa6a9cab3 100644 --- a/interface/src/api/unpack.ts +++ b/interface/src/api/unpack.ts @@ -1,40 +1,37 @@ -let decoder; +// @ts-nocheck - Optimized MessagePack unpacking library for EMS-ESP32 +let decoder, + src, + srcEnd, + position = 0, + strings = [], + stringPosition = 0, + currentUnpackr = {}, + currentStructures, + srcString, + srcStringStart = 0, + srcStringEnd = 0, + bundledStrings, + referenceMap, + dataView; +const EMPTY_ARRAY = [], + currentExtensions = []; +const defaultOptions = { useRecords: false, mapsAsObjects: true }; try { decoder = new TextDecoder(); } catch (error) {} -let src; -let srcEnd; -let position = 0; -const EMPTY_ARRAY = []; -let strings = EMPTY_ARRAY; -let stringPosition = 0; -let currentUnpackr = {}; -let currentStructures; -let srcString; -let srcStringStart = 0; -let srcStringEnd = 0; -let bundledStrings; -let referenceMap; -const currentExtensions = []; -let dataView; -const defaultOptions = { - useRecords: false, - mapsAsObjects: true -}; -export class C1Type {} -export const C1 = new C1Type(); +class C1Type {} +const C1 = new C1Type(); C1.name = 'MessagePack 0xC1'; -let sequentialMode = false; -let inlineObjectReadThreshold = 2; -let readStruct, onLoadedStructures, onSaveState; -// no-eval build +let sequentialMode = false, + inlineObjectReadThreshold = 2, + readStruct, + onLoadedStructures, + onSaveState; try { new Function(''); } catch (error) { - // if eval variants are not supported, do not create inline object readers ever inlineObjectReadThreshold = Infinity; } - export class Unpackr { constructor(options) { if (options) { @@ -50,19 +47,15 @@ export class Unpackr { if (options.structures) options.structures.sharedLength = options.structures.length; else if (options.getStructures) { - (options.structures = []).uninitialized = true; // this is what we use to denote an uninitialized structures + (options.structures = []).uninitialized = true; options.structures.sharedLength = 0; } - if (options.int64AsNumber) { - options.int64AsType = 'number'; - } + if (options.int64AsNumber) options.int64AsType = 'number'; } Object.assign(this, options); } - - unpack(source, options?: any) { + unpack(source, options?: { start?: number; end?: number; lazy?: boolean }) { if (src) { - // re-entrant execution, save the state and restore it after we do this unpack return saveState(() => { clearSource(); return this @@ -86,9 +79,6 @@ export class Unpackr { strings = EMPTY_ARRAY; bundledStrings = null; src = source; - // this provides cached access to the data view for a buffer if it is getting reused, which is a recommend - // technique for getting data from a database where it can be copied into an existing buffer instead of creating - // new ones try { dataView = source.dataView || @@ -191,10 +181,10 @@ export class Unpackr { return this.unpack(source, end); } } -export function getPosition() { +function getPosition() { return position; } -export function checkedRead(options: any) { +function checkedRead(options?: { lazy?: boolean }) { try { if (!currentUnpackr.trusted && !sequentialMode) { const sharedLength = currentStructures.sharedLength || 0; @@ -264,7 +254,7 @@ function restoreStructures() { currentStructures.restoreStructures = null; } -export function read() { +function read() { let token = src[position++]; if (token < 0xa0) { if (token < 0x80) { @@ -589,7 +579,7 @@ const createSecondByteReader = (firstId, read0) => return structure.read(); }; -export function loadStructures() { +function loadStructures() { const loadedStructures = saveState(() => { // save the state in case getStructures modifies our buffer src = null; @@ -605,9 +595,8 @@ var readFixedString = readStringJS; var readString8 = readStringJS; var readString16 = readStringJS; var readString32 = readStringJS; -export let isNativeAccelerationEnabled = false; - -export function setExtractor(extractStrings) { +let isNativeAccelerationEnabled = false; +function setExtractor(extractStrings) { isNativeAccelerationEnabled = true; readFixedString = readString(1); readString8 = readString(2); @@ -701,7 +690,7 @@ function readStringJS(length) { return result; } -export function readString(source, start, length) { +function readString(source, start, length) { const existingSrc = src; src = source; position = start; @@ -1065,7 +1054,7 @@ currentExtensions[0x70] = (data) => { currentExtensions[0x73] = () => new Set(read()); -export const typedArrays = [ +const typedArrays = [ 'Int8', 'Uint8', 'Uint8Clamped', @@ -1177,44 +1166,20 @@ function saveState(callback) { dataView = new DataView(src.buffer, src.byteOffset, src.byteLength); return value; } -export function clearSource() { +function clearSource() { src = null; referenceMap = null; currentStructures = null; } -export function addExtension(extension) { +function addExtension(extension) { if (extension.unpack) currentExtensions[extension.type] = extension.unpack; else currentExtensions[extension.type] = extension; } -export const mult10 = new Array(147); // this is a table matching binary exponents to the multiplier to determine significant digit rounding +const mult10 = new Array(147); for (let i = 0; i < 256; i++) { mult10[i] = +('1e' + Math.floor(45.15 - i * 0.30103)); } -export const Decoder = Unpackr; -var defaultUnpackr = new Unpackr({ useRecords: false }); +const defaultUnpackr = new Unpackr({ useRecords: false }); export const unpack = defaultUnpackr.unpack; -export const unpackMultiple = defaultUnpackr.unpackMultiple; -export const decode = defaultUnpackr.unpack; -export const FLOAT32_OPTIONS = { - NEVER: 0, - ALWAYS: 1, - DECIMAL_ROUND: 3, - DECIMAL_FIT: 4 -}; -const f32Array = new Float32Array(1); -const u8Array = new Uint8Array(f32Array.buffer, 0, 4); -export function roundFloat32(float32Number) { - f32Array[0] = float32Number; - const multiplier = mult10[((u8Array[3] & 0x7f) << 1) | (u8Array[2] >> 7)]; - return ( - ((multiplier * float32Number + (float32Number > 0 ? 0.5 : -0.5)) >> 0) / - multiplier - ); -} -export function setReadStruct(updatedReadStruct, loadedStructs, saveState) { - readStruct = updatedReadStruct; - onLoadedStructures = loadedStructs; - onSaveState = saveState; -} diff --git a/interface/src/app/main/CustomEntities.tsx b/interface/src/app/main/CustomEntities.tsx index 73e109827..a928d8181 100644 --- a/interface/src/app/main/CustomEntities.tsx +++ b/interface/src/app/main/CustomEntities.tsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { useBlocker } from 'react-router'; import { toast } from 'react-toastify'; @@ -35,6 +35,10 @@ import { DeviceValueTypeNames, DeviceValueUOM_s } from './types'; import type { Entities, EntityItem } from './types'; import { entityItemValidation } from './validators'; +const MIN_ID = -100; +const MAX_ID = 100; +const ICON_SIZE = 12; + const CustomEntities = () => { const { LL } = useI18nContext(); const [numChanges, setNumChanges] = useState(0); @@ -53,18 +57,20 @@ const CustomEntities = () => { initialData: [] }); - useInterval(() => { + const intervalCallback = useCallback(() => { if (!dialogOpen && !numChanges) { void fetchEntities(); } - }); + }, [dialogOpen, numChanges, fetchEntities]); + + useInterval(intervalCallback); const { send: writeEntities } = useRequest( (data: Entities) => writeCustomEntities(data), { immediate: false } ); - function hasEntityChanged(ei: EntityItem) { + const hasEntityChanged = useCallback((ei: EntityItem) => { return ( ei.id !== ei.o_id || ei.ram !== ei.o_ram || @@ -76,22 +82,25 @@ const CustomEntities = () => { ei.factor !== ei.o_factor || ei.value_type !== ei.o_value_type || ei.writeable !== ei.o_writeable || + ei.hide !== ei.o_hide || ei.deleted !== ei.o_deleted || (ei.value || '') !== (ei.o_value || '') ); - } + }, []); - const entity_theme = useTheme({ - Table: ` + const entity_theme = useMemo( + () => + useTheme({ + Table: ` --data-table-library_grid-template-columns: repeat(1, minmax(60px, 1fr)) minmax(80px, auto) 80px 80px 80px 120px; `, - BaseRow: ` + BaseRow: ` font-size: 14px; .td { height: 32px; } `, - BaseCell: ` + BaseCell: ` &:nth-of-type(1) { padding: 8px; } @@ -111,7 +120,7 @@ const CustomEntities = () => { text-align: center; } `, - HeaderRow: ` + HeaderRow: ` text-transform: uppercase; background-color: black; color: #90CAF9; @@ -120,7 +129,7 @@ const CustomEntities = () => { height: 36px; } `, - Row: ` + Row: ` background-color: #1e1e1e; position: relative; cursor: pointer; @@ -131,13 +140,15 @@ const CustomEntities = () => { background-color: #177ac9; } ` - }); + }), + [] + ); - const saveEntities = async () => { + const saveEntities = useCallback(async () => { await writeEntities({ entities: entities - .filter((ei) => !ei.deleted) - .map((condensed_ei) => ({ + .filter((ei: EntityItem) => !ei.deleted) + .map((condensed_ei: EntityItem) => ({ id: condensed_ei.id, ram: condensed_ei.ram, name: condensed_ei.name, @@ -147,6 +158,7 @@ const CustomEntities = () => { factor: condensed_ei.factor, uom: condensed_ei.uom, writeable: condensed_ei.writeable, + hide: condensed_ei.hide, value_type: condensed_ei.value_type, value: condensed_ei.value })) @@ -161,7 +173,7 @@ const CustomEntities = () => { await fetchEntities(); setNumChanges(0); }); - }; + }, [entities, writeEntities, LL, fetchEntities]); const editEntityItem = useCallback((ei: EntityItem) => { setCreating(false); @@ -169,36 +181,39 @@ const CustomEntities = () => { setDialogOpen(true); }, []); - const onDialogClose = () => { + const onDialogClose = useCallback(() => { setDialogOpen(false); - }; + }, []); - const onDialogCancel = async () => { + const onDialogCancel = useCallback(async () => { await fetchEntities().then(() => { setNumChanges(0); }); - }; + }, [fetchEntities]); - const onDialogSave = (updatedItem: EntityItem) => { - setDialogOpen(false); - void updateState(readCustomEntities(), (data: EntityItem[]) => { - const new_data = creating - ? [ - ...data.filter((ei) => creating || ei.o_id !== updatedItem.o_id), - updatedItem - ] - : data.map((ei) => - ei.id === updatedItem.id ? { ...ei, ...updatedItem } : ei - ); - setNumChanges(new_data.filter((ei) => hasEntityChanged(ei)).length); - return new_data; - }); - }; + const onDialogSave = useCallback( + (updatedItem: EntityItem) => { + setDialogOpen(false); + void updateState(readCustomEntities(), (data: EntityItem[]) => { + const new_data = creating + ? [ + ...data.filter((ei) => creating || ei.o_id !== updatedItem.o_id), + updatedItem + ] + : data.map((ei) => + ei.id === updatedItem.id ? { ...ei, ...updatedItem } : ei + ); + setNumChanges(new_data.filter((ei) => hasEntityChanged(ei)).length); + return new_data; + }); + }, + [creating, hasEntityChanged] + ); - const onDialogDup = (item: EntityItem) => { + const onDialogDup = useCallback((item: EntityItem) => { setCreating(true); setSelectedEntityItem({ - id: Math.floor(Math.random() * (Math.floor(200) - 100) + 100), + id: Math.floor(Math.random() * (MAX_ID - MIN_ID) + MIN_ID), name: item.name + '_', ram: item.ram, device_id: item.device_id, @@ -209,15 +224,16 @@ const CustomEntities = () => { value_type: item.value_type, writeable: item.writeable, deleted: false, + hide: item.hide, value: item.value }); setDialogOpen(true); - }; + }, []); - const addEntityItem = () => { + const addEntityItem = useCallback(() => { setCreating(true); setSelectedEntityItem({ - id: Math.floor(Math.random() * (Math.floor(200) - 100) + 100), + id: Math.floor(Math.random() * (MAX_ID - MIN_ID) + MIN_ID), name: '', ram: 0, device_id: '0', @@ -228,35 +244,44 @@ const CustomEntities = () => { value_type: 0, writeable: false, deleted: false, + hide: false, value: '' }); setDialogOpen(true); - }; + }, []); - function formatValue(value: unknown, uom: number) { + const formatValue = useCallback((value: unknown, uom: number) => { return value === undefined ? '' : typeof value === 'number' ? new Intl.NumberFormat().format(value) + - (uom === 0 ? '' : ' ' + DeviceValueUOM_s[uom]) - : (value as string) + (uom === 0 ? '' : ' ' + DeviceValueUOM_s[uom]); - } + (uom === 0 ? '' : ` ${DeviceValueUOM_s[uom]}`) + : `${value as string}${uom === 0 ? '' : ` ${DeviceValueUOM_s[uom]}`}`; + }, []); - function showHex(value: number, digit: number) { - return '0x' + value.toString(16).toUpperCase().padStart(digit, '0'); - } + const showHex = useCallback((value: number, digit: number) => { + return `0x${value.toString(16).toUpperCase().padStart(digit, '0')}`; + }, []); - const renderEntity = () => { + const filteredAndSortedEntities = useMemo( + () => + entities + ?.filter((ei: EntityItem) => !ei.deleted) + .sort((a: EntityItem, b: EntityItem) => a.name.localeCompare(b.name)) ?? [], + [entities] + ); + + const renderEntity = useCallback(() => { if (!entities) { - return ; + return ( + + ); } return ( !ei.deleted) - .sort((a, b) => a.name.localeCompare(b.name)) + nodes: filteredAndSortedEntities }} theme={entity_theme} layout={{ custom: true }} @@ -279,7 +304,10 @@ const CustomEntities = () => { {ei.name}  {ei.writeable && ( - + )} @@ -298,7 +326,17 @@ const CustomEntities = () => { )}
); - }; + }, [ + entities, + error, + fetchEntities, + entity_theme, + editEntityItem, + LL, + filteredAndSortedEntities, + showHex, + formatValue + ]); return ( @@ -321,7 +359,7 @@ const CustomEntities = () => { /> )} - + {numChanges > 0 && ( diff --git a/interface/src/app/main/CustomEntitiesDialog.tsx b/interface/src/app/main/CustomEntitiesDialog.tsx index 898ecc557..3041f0bba 100644 --- a/interface/src/app/main/CustomEntitiesDialog.tsx +++ b/interface/src/app/main/CustomEntitiesDialog.tsx @@ -1,8 +1,12 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import AddIcon from '@mui/icons-material/Add'; import CancelIcon from '@mui/icons-material/Cancel'; +import CommentsDisabledOutlinedIcon from '@mui/icons-material/CommentsDisabledOutlined'; import DoneIcon from '@mui/icons-material/Done'; +import EditOffOutlinedIcon from '@mui/icons-material/EditOffOutlined'; +import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; +import InsertCommentOutlinedIcon from '@mui/icons-material/InsertCommentOutlined'; import RemoveIcon from '@mui/icons-material/RemoveCircleOutline'; import { Box, @@ -12,7 +16,7 @@ import { DialogActions, DialogContent, DialogTitle, - Grid2 as Grid, + Grid, InputAdornment, MenuItem, TextField @@ -29,6 +33,19 @@ import { validate } from 'validators'; import { DeviceValueType, DeviceValueTypeNames, DeviceValueUOM_s } from './types'; import type { EntityItem } from './types'; +// Constant value type options for the dropdown +const VALUE_TYPE_OPTIONS = [ + DeviceValueType.BOOL, + DeviceValueType.INT8, + DeviceValueType.UINT8, + DeviceValueType.INT16, + DeviceValueType.UINT16, + DeviceValueType.UINT24, + DeviceValueType.TIME, + DeviceValueType.UINT32, + DeviceValueType.STRING +] as const; + interface CustomEntitiesDialogProps { open: boolean; creating: boolean; @@ -51,61 +68,97 @@ const CustomEntitiesDialog = ({ const { LL } = useI18nContext(); const [editItem, setEditItem] = useState(selectedItem); const [fieldErrors, setFieldErrors] = useState(); - const updateFormValue = updateValue(setEditItem); + const updateFormValue = useMemo( + () => + updateValue( + setEditItem as unknown as React.Dispatch< + React.SetStateAction> + > + ), + [] + ); useEffect(() => { if (open) { setFieldErrors(undefined); - setEditItem(selectedItem); - // convert to hex strings straight away + // Convert to hex strings - combined into single setEditItem call + const deviceIdHex = + typeof selectedItem.device_id === 'number' + ? selectedItem.device_id.toString(16).toUpperCase() + : selectedItem.device_id; + const typeIdHex = + typeof selectedItem.type_id === 'number' + ? selectedItem.type_id.toString(16).toUpperCase() + : selectedItem.type_id; + const factorValue = + selectedItem.value_type === DeviceValueType.BOOL && + typeof selectedItem.factor === 'number' + ? selectedItem.factor.toString(16).toUpperCase() + : selectedItem.factor; + setEditItem({ ...selectedItem, - device_id: selectedItem.device_id.toString(16).toUpperCase(), - type_id: selectedItem.type_id.toString(16).toUpperCase(), - factor: - selectedItem.value_type === DeviceValueType.BOOL - ? selectedItem.factor.toString(16).toUpperCase() - : selectedItem.factor + device_id: deviceIdHex, + type_id: typeIdHex, + factor: factorValue }); } }, [open, selectedItem]); - const handleClose = (_event, reason: 'backdropClick' | 'escapeKeyDown') => { - if (reason !== 'backdropClick') { - onClose(); - } - }; + const handleClose = useCallback( + (_event: React.SyntheticEvent, reason: 'backdropClick' | 'escapeKeyDown') => { + if (reason !== 'backdropClick') { + onClose(); + } + }, + [onClose] + ); - const save = async () => { + const save = useCallback(async () => { try { setFieldErrors(undefined); await validate(validator, editItem); - if (typeof editItem.device_id === 'string') { - editItem.device_id = parseInt(editItem.device_id, 16); + + // Create a copy to avoid mutating the state directly + const processedItem: EntityItem = { ...editItem }; + + if (typeof processedItem.device_id === 'string') { + processedItem.device_id = Number.parseInt(processedItem.device_id, 16); } - if (typeof editItem.type_id === 'string') { - editItem.type_id = parseInt(editItem.type_id, 16); + if (typeof processedItem.type_id === 'string') { + processedItem.type_id = Number.parseInt(processedItem.type_id, 16); } if ( - editItem.value_type === DeviceValueType.BOOL && - typeof editItem.factor === 'string' + processedItem.value_type === DeviceValueType.BOOL && + typeof processedItem.factor === 'string' ) { - editItem.factor = parseInt(editItem.factor, 16); + processedItem.factor = Number.parseInt(processedItem.factor, 16); } - onSave(editItem); + onSave(processedItem); } catch (error) { setFieldErrors(error as ValidateFieldsError); } - }; + }, [validator, editItem, onSave]); - const remove = () => { - editItem.deleted = true; - onSave(editItem); - }; + const remove = useCallback(() => { + const itemWithDeleted = { ...editItem, deleted: true }; + onSave(itemWithDeleted); + }, [editItem, onSave]); - const dup = () => { + const dup = useCallback(() => { onDup(editItem); - }; + }, [editItem, onDup]); + + // Memoize UOM menu items to avoid recreating on every render + const uomMenuItems = useMemo( + () => + DeviceValueUOM_s.map((val, i) => ( + + {val} + + )), + [] + ); return ( @@ -113,13 +166,10 @@ const CustomEntitiesDialog = ({ {creating ? LL.ADD(1) + ' ' + LL.NEW(1) : LL.EDIT()} {LL.ENTITY()} - - - + + } + checkedIcon={} + checked={editItem.hide} + onChange={updateFormValue} + name="hide" + /> + } + label="API/MQTT" + /> + - {DeviceValueUOM_s.map((val, i) => ( - - {val} - - ))} + {uomMenuItems} )} {editItem.ram === 0 && ( <> - + } + checkedIcon={} checked={editItem.writeable} onChange={updateFormValue} name="writeable" @@ -191,7 +253,7 @@ const CustomEntitiesDialog = ({ - - {DeviceValueTypeNames[DeviceValueType.BOOL]} - - - {DeviceValueTypeNames[DeviceValueType.INT8]} - - - {DeviceValueTypeNames[DeviceValueType.UINT8]} - - - {DeviceValueTypeNames[DeviceValueType.INT16]} - - - {DeviceValueTypeNames[DeviceValueType.UINT16]} - - - {DeviceValueTypeNames[DeviceValueType.UINT24]} - - - {DeviceValueTypeNames[DeviceValueType.TIME]} - - - {DeviceValueTypeNames[DeviceValueType.UINT32]} - - - {DeviceValueTypeNames[DeviceValueType.STRING]} - + {VALUE_TYPE_OPTIONS.map((valueType) => ( + + {DeviceValueTypeNames[valueType]} + + ))} @@ -310,11 +350,7 @@ const CustomEntitiesDialog = ({ onChange={updateFormValue} select > - {DeviceValueUOM_s.map((val, i) => ( - - {val} - - ))} + {uomMenuItems} @@ -323,7 +359,7 @@ const CustomEntitiesDialog = ({ editItem.device_id !== '0' && ( { + const maskHex = de.m.toString(16).padStart(2, '0'); + const hasCustomizations = !!(de.cn || de.mi || de.ma); + const customizations = [ + de.cn || '', + de.mi ? `>${de.mi}` : '', + de.ma ? `<${de.ma}` : '' + ] + .filter(Boolean) + .join(''); + + return `${maskHex}${de.id}${hasCustomizations ? `|${customizations}` : ''}`; +}; const Customizations = () => { const { LL } = useI18nContext(); @@ -125,13 +142,22 @@ const Customizations = () => { const setOriginalSettings = (data: DeviceEntity[]) => { setDeviceEntities( - data.map((de) => ({ - ...de, - o_m: de.m, - o_cn: de.cn, - o_mi: de.mi, - o_ma: de.ma - })) + data.map((de) => { + const result: DeviceEntity = { + ...de, + o_m: de.m + }; + if (de.cn !== undefined) { + result.o_cn = de.cn; + } + if (de.mi !== undefined) { + result.o_mi = de.mi; + } + if (de.ma !== undefined) { + result.o_ma = de.ma; + } + return result; + }) ); }; @@ -144,17 +170,19 @@ const Customizations = () => { ); }; - const entities_theme = useTheme({ - Table: ` + const entities_theme = useMemo( + () => + useTheme({ + Table: ` --data-table-library_grid-template-columns: 156px repeat(1, minmax(80px, 1fr)) 45px minmax(45px, auto) minmax(120px, auto); `, - BaseRow: ` + BaseRow: ` font-size: 14px; .td { height: 32px; } `, - BaseCell: ` + BaseCell: ` &:nth-of-type(3) { text-align: right; } @@ -165,7 +193,7 @@ const Customizations = () => { text-align: right; } `, - HeaderRow: ` + HeaderRow: ` text-transform: uppercase; background-color: black; color: #90CAF9; @@ -177,7 +205,7 @@ const Customizations = () => { text-align: center; } `, - Row: ` + Row: ` background-color: #1e1e1e; position: relative; cursor: pointer; @@ -193,7 +221,7 @@ const Customizations = () => { background-color: #177ac9; } `, - Cell: ` + Cell: ` &:nth-of-type(2) { padding: 8px; } @@ -207,7 +235,9 @@ const Customizations = () => { padding-right: 8px; } ` - }); + }), + [] + ); function hasEntityChanged(de: DeviceEntity) { return ( @@ -220,19 +250,8 @@ const Customizations = () => { useEffect(() => { if (deviceEntities.length) { - setNumChanges( - deviceEntities - .filter((de) => hasEntityChanged(de)) - .map( - (new_de) => - new_de.m.toString(16).padStart(2, '0') + - new_de.id + - (new_de.cn || new_de.mi || new_de.ma ? '|' : '') + - (new_de.cn ? new_de.cn : '') + - (new_de.mi ? '>' + new_de.mi : '') + - (new_de.ma ? '<' + new_de.ma : '') - ).length - ); + const changedEntities = deviceEntities.filter((de) => hasEntityChanged(de)); + setNumChanges(changedEntities.length); } }, [deviceEntities]); @@ -244,8 +263,11 @@ const Customizations = () => { setSelectedDevice(-1); setSelectedDeviceTypeNameURL(''); } else { - setSelectedDeviceTypeNameURL(devices.devices[index].url || ''); - setSelectedDeviceName(devices.devices[index].n); + const device = devices.devices[index]; + if (device) { + setSelectedDeviceTypeNameURL(device.url || ''); + setSelectedDeviceName(device.n); + } setNumChanges(0); setRestartNeeded(false); } @@ -263,18 +285,26 @@ const Customizations = () => { return value as string; } - const formatName = (de: DeviceEntity, withShortname: boolean) => - (de.n && de.n[0] === '!' - ? de.t - ? LL.COMMAND(1) + ': ' + de.t + ' ' + de.n.slice(1) - : LL.COMMAND(1) + ': ' + de.n.slice(1) - : de.cn && de.cn !== '' - ? de.t - ? de.t + ' ' + de.cn - : de.cn - : de.t - ? de.t + ' ' + de.n - : de.n) + (withShortname ? ' ' + de.id : ''); + const isCommand = useCallback((de: DeviceEntity) => { + return de.n && de.n[0] === '!'; + }, []); + + const formatName = useCallback( + (de: DeviceEntity, withShortname: boolean) => { + let name: string; + if (isCommand(de)) { + name = de.t + ? `${LL.COMMAND(1)}: ${de.t} ${de.n?.slice(1)}` + : `${LL.COMMAND(1)}: ${de.n?.slice(1)}`; + } else if (de.cn && de.cn !== '') { + name = de.t ? `${de.t} ${de.cn}` : de.cn; + } else { + name = de.t ? `${de.t} ${de.n}` : de.n || ''; + } + return withShortname ? `${name} ${de.id}` : name; + }, + [LL] + ); const getMaskNumber = (newMask: string[]) => { let new_mask = 0; @@ -304,34 +334,33 @@ const Customizations = () => { return new_masks; }; - const filter_entity = (de: DeviceEntity) => - (de.m & selectedFilters || !selectedFilters) && - formatName(de, true).includes(search); + const filter_entity = useCallback( + (de: DeviceEntity) => + (de.m & selectedFilters || !selectedFilters) && + formatName(de, true).toLowerCase().includes(search.toLowerCase()), + [selectedFilters, search, formatName] + ); - const maskDisabled = (set: boolean) => { - setDeviceEntities( - deviceEntities.map(function (de) { - if (filter_entity(de)) { - return { - ...de, - m: set - ? de.m | - (DeviceEntityMask.DV_API_MQTT_EXCLUDE | - DeviceEntityMask.DV_WEB_EXCLUDE) - : de.m & - ~( - DeviceEntityMask.DV_API_MQTT_EXCLUDE | - DeviceEntityMask.DV_WEB_EXCLUDE - ) - }; - } else { + const maskDisabled = useCallback( + (set: boolean) => { + setDeviceEntities((prev) => + prev.map((de) => { + if (filter_entity(de)) { + const excludeMask = + DeviceEntityMask.DV_API_MQTT_EXCLUDE | DeviceEntityMask.DV_WEB_EXCLUDE; + return { + ...de, + m: set ? de.m | excludeMask : de.m & ~excludeMask + }; + } return de; - } - }) - ); - }; + }) + ); + }, + [filter_entity] + ); - const resetCustomization = async () => { + const resetCustomization = useCallback(async () => { try { await sendResetCustomizations(); toast.info(LL.CUSTOMIZATIONS_RESTART()); @@ -339,25 +368,30 @@ const Customizations = () => { toast.error((error as Error).message); } finally { setConfirmReset(false); + setRestarting(true); } - }; + }, [sendResetCustomizations, LL]); const onDialogClose = () => { setDialogOpen(false); }; - const updateDeviceEntity = (updatedItem: DeviceEntity) => { + const updateDeviceEntity = useCallback((updatedItem: DeviceEntity) => { setDeviceEntities( - deviceEntities?.map((de) => - de.id === updatedItem.id ? { ...de, ...updatedItem } : de - ) + (prev) => + prev?.map((de) => + de.id === updatedItem.id ? { ...de, ...updatedItem } : de + ) ?? [] ); - }; + }, []); - const onDialogSave = (updatedItem: DeviceEntity) => { - setDialogOpen(false); - updateDeviceEntity(updatedItem); - }; + const onDialogSave = useCallback( + (updatedItem: DeviceEntity) => { + setDialogOpen(false); + updateDeviceEntity(updatedItem); + }, + [updateDeviceEntity] + ); const editDeviceEntity = useCallback((de: DeviceEntity) => { if (de.n === undefined || (de.n && de.n[0] === '!')) { @@ -372,54 +406,54 @@ const Customizations = () => { setDialogOpen(true); }, []); - const saveCustomization = async () => { - if (devices && deviceEntities && selectedDevice !== -1) { - const masked_entities = deviceEntities - .filter((de: DeviceEntity) => hasEntityChanged(de)) - .map( - (new_de) => - new_de.m.toString(16).padStart(2, '0') + - new_de.id + - (new_de.cn || new_de.mi || new_de.ma ? '|' : '') + - (new_de.cn ? new_de.cn : '') + - (new_de.mi ? '>' + new_de.mi : '') + - (new_de.ma ? '<' + new_de.ma : '') - ); + const saveCustomization = useCallback(async () => { + if (!devices || !deviceEntities || selectedDevice === -1) { + return; + } - // check size in bytes to match buffer in CPP, which is 2048 - const bytes = new TextEncoder().encode(JSON.stringify(masked_entities)).length; - if (bytes > 2000) { - toast.warning(LL.CUSTOMIZATIONS_FULL()); - return; - } + const masked_entities = deviceEntities + .filter((de: DeviceEntity) => hasEntityChanged(de)) + .map((new_de) => createMaskedEntityId(new_de)); - await sendCustomizationEntities({ - id: selectedDevice, - entity_ids: masked_entities - }).catch((error: Error) => { + // check size in bytes to match buffer in CPP, which is 2048 + const bytes = new TextEncoder().encode(JSON.stringify(masked_entities)).length; + if (bytes > MAX_BUFFER_SIZE) { + toast.warning(LL.CUSTOMIZATIONS_FULL()); + return; + } + + await sendCustomizationEntities({ + id: selectedDevice, + entity_ids: masked_entities + }) + .then(() => { + toast.success(LL.CUSTOMIZATIONS_SAVED()); + }) + .catch((error: Error) => { if (error.message === 'Reboot required') { setRestartNeeded(true); } else { toast.error(error.message); } + }) + .finally(() => { + setOriginalSettings(deviceEntities); }); - setOriginalSettings(deviceEntities); - } - }; + }, [devices, deviceEntities, selectedDevice, sendCustomizationEntities, LL]); - const renameDevice = async () => { + const renameDevice = useCallback(async () => { await sendDeviceName({ id: selectedDevice, name: selectedDeviceName }) .then(() => { toast.success(LL.UPDATED_OF(LL.NAME(1))); }) .catch(() => { - toast.error(LL.UPDATE_OF(LL.NAME(1)) + ' ' + LL.FAILED(1)); + toast.error(`${LL.UPDATE_OF(LL.NAME(1))} ${LL.FAILED(1)}`); }) .finally(async () => { setRename(false); await fetchCoreData(); }); - }; + }, [selectedDevice, selectedDeviceName, sendDeviceName, LL, fetchCoreData]); const renderDeviceList = () => ( <> @@ -482,25 +516,38 @@ const Customizations = () => { ) : ( - + <> + + + ))} ); - const renderDeviceData = () => { - const shown_data = deviceEntities.filter((de) => filter_entity(de)); + const filteredEntities = useMemo( + () => deviceEntities.filter((de) => filter_entity(de)), + [deviceEntities, filter_entity] + ); + const renderDeviceData = () => { return ( <> - + ={LL.CUSTOMIZATIONS_HELP_2()}    ={LL.CUSTOMIZATIONS_HELP_3()} @@ -526,6 +573,7 @@ const Customizations = () => { size="small" variant="outlined" placeholder={LL.SEARCH()} + aria-label={LL.SEARCH()} onChange={(event) => { setSearch(event.target.value); }} @@ -545,7 +593,7 @@ const Customizations = () => { size="small" color="secondary" value={getMaskString(selectedFilters)} - onChange={(event, mask: string[]) => { + onChange={(_, mask: string[]) => { setSelectedFilters(getMaskNumber(mask)); }} > @@ -594,13 +642,13 @@ const Customizations = () => { - {LL.SHOWING()} {shown_data.length}/{deviceEntities.length} + {LL.SHOWING()} {filteredEntities.length}/{deviceEntities.length}  {LL.ENTITIES(deviceEntities.length)} @@ -622,14 +670,27 @@ const Customizations = () => { - {formatName(de, false)} ( - - {de.id} - - ) + {formatName(de, false)} ( + + {de.id} + + ) + {!(de.m & DeviceEntityMask.DV_READONLY) && formatValue(de.mi)} @@ -654,7 +715,7 @@ const Customizations = () => { open={confirmReset} onClose={() => setConfirmReset(false)} > - {LL.RESET(1)} + {LL.REMOVE_ALL()} {LL.CUSTOMIZATIONS_RESET()} @@ -682,8 +743,9 @@ const Customizations = () => { {devices && renderDeviceList()} {selectedDevice !== -1 && !rename && renderDeviceData()} {restartNeeded ? ( - + @@ -716,18 +782,6 @@ const Customizations = () => { )} - {!rename && ( - - - - )} )} {renderResetDialog()} diff --git a/interface/src/app/main/CustomizationsDialog.tsx b/interface/src/app/main/CustomizationsDialog.tsx index 60488cbde..d989ef08c 100644 --- a/interface/src/app/main/CustomizationsDialog.tsx +++ b/interface/src/app/main/CustomizationsDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { memo, useCallback, useEffect, useMemo, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import CloseIcon from '@mui/icons-material/Close'; @@ -10,7 +10,7 @@ import { DialogActions, DialogContent, DialogTitle, - Grid2 as Grid, + Grid, TextField, Typography } from '@mui/material'; @@ -30,6 +30,23 @@ interface SettingsCustomizationsDialogProps { selectedItem: DeviceEntity; } +interface LabelValueProps { + label: string; + value: React.ReactNode; +} + +const LabelValue = memo(({ label, value }: LabelValueProps) => ( + + + {label}:  + + {value} + +)); +LabelValue.displayName = 'LabelValue'; + +const ICON_SIZE = 16; + const CustomizationsDialog = ({ open, onClose, @@ -40,12 +57,23 @@ const CustomizationsDialog = ({ const [editItem, setEditItem] = useState(selectedItem); const [error, setError] = useState(false); - const updateFormValue = updateValue(setEditItem); + const updateFormValue = useMemo( + () => + updateValue( + setEditItem as unknown as React.Dispatch< + React.SetStateAction> + > + ), + [] + ); - const isWriteableNumber = - typeof editItem.v === 'number' && - editItem.w && - !(editItem.m & DeviceEntityMask.DV_READONLY); + const isWriteableNumber = useMemo( + () => + typeof editItem.v === 'number' && + editItem.w && + !(editItem.m & DeviceEntityMask.DV_READONLY), + [editItem.v, editItem.w, editItem.m] + ); useEffect(() => { if (open) { @@ -54,63 +82,59 @@ const CustomizationsDialog = ({ } }, [open, selectedItem]); - const handleClose = (_event, reason: 'backdropClick' | 'escapeKeyDown') => { - if (reason !== 'backdropClick') { - onClose(); - } - }; + const handleClose = useCallback( + (_event: React.SyntheticEvent, reason: 'backdropClick' | 'escapeKeyDown') => { + if (reason !== 'backdropClick') { + onClose(); + } + }, + [onClose] + ); - const save = () => { + const save = useCallback(() => { if ( isWriteableNumber && editItem.mi && editItem.ma && - editItem.mi > editItem?.ma + editItem.mi > editItem.ma ) { setError(true); } else { onSave(editItem); } - }; + }, [isWriteableNumber, editItem, onSave]); - const updateDeviceEntity = (updatedItem: DeviceEntity) => { - setEditItem({ ...editItem, m: updatedItem.m }); - }; + const updateDeviceEntity = useCallback((updatedItem: DeviceEntity) => { + setEditItem((prev) => ({ ...prev, m: updatedItem.m })); + }, []); + + const dialogTitle = useMemo(() => `${LL.EDIT()} ${LL.ENTITY()}`, [LL]); + + const writeableIcon = useMemo( + () => + editItem.w ? ( + + ) : ( + + ), + [editItem.w] + ); return ( - {LL.EDIT() + ' ' + LL.ENTITY()} + {dialogTitle} - - - {LL.ID_OF(LL.ENTITY())}:  - - {editItem.id} - - - - - {LL.DEFAULT(1) + ' ' + LL.ENTITY_NAME(1)}:  - - {editItem.n} - - - - - {LL.WRITEABLE()}:  - - - {editItem.w ? ( - - ) : ( - - )} - - + + + + )} + {error && ( Error: Check min and max values )} +
- {(tableList: DashboardItem[]) => ( - - {tableList.map((di: DashboardItem) => ( - editDashboardValue(di)} - > - {di.id > 99 ? ( - <> - {showName(di)} - - - {formatValue(LL, di.dv?.v, di.dv?.u)} - - + {(tableList: DashboardItem[]) => ( + + {tableList.map((di: DashboardItem) => ( + editDashboardValue(di)} + > + {di.id > 99 ? ( + <> + {showName(di)} + + + {formatValue(LL, di.dv?.v, di.dv?.u)} + + - - {me.admin && - di.dv?.c && - !hasMask( - di.dv.id, - DeviceEntityMask.DV_READONLY - ) && ( - editDashboardValue(di)} - > - - - )} - - - ) : ( - <> - {showName(di)} - - - - )} - - ))} - - )} -
- -
- + + {me.admin && + di.dv?.c && + !hasMask(di.dv.id, DeviceEntityMask.DV_READONLY) && ( + editDashboardValue(di)} + > + + + )} + + + ) : ( + <> + {showName(di)} + + + + )} + + ))} + + )} + + +
+ ) : ( + + + no data + + + + + )} ); @@ -375,6 +419,6 @@ const Dashboard = () => { )}
); -}; +}); export default Dashboard; diff --git a/interface/src/app/main/DeviceIcon.tsx b/interface/src/app/main/DeviceIcon.tsx index b216cbacb..112d8e328 100644 --- a/interface/src/app/main/DeviceIcon.tsx +++ b/interface/src/app/main/DeviceIcon.tsx @@ -1,13 +1,14 @@ +import { memo } from 'react'; import { AiOutlineAlert, AiOutlineControl, AiOutlineGateway } from 'react-icons/ai'; import { CgSmartHomeBoiler } from 'react-icons/cg'; import { FaSolarPanel } from 'react-icons/fa'; import { GiHeatHaze, GiTap } from 'react-icons/gi'; -import { MdPlaylistAdd } from 'react-icons/md'; -import { MdMoreTime } from 'react-icons/md'; import { + MdMoreTime, MdOutlineDevices, MdOutlinePool, MdOutlineSensors, + MdPlaylistAdd, MdThermostatAuto } from 'react-icons/md'; import { PiFan, PiGauge } from 'react-icons/pi'; @@ -18,9 +19,10 @@ import type { SvgIconProps } from '@mui/material'; import { DeviceType } from './types'; -const deviceIconLookup: { - [key in DeviceType]: React.ComponentType | undefined; -} = { +const deviceIconLookup: Record< + DeviceType, + React.ComponentType | null +> = { [DeviceType.TEMPERATURESENSOR]: TiThermometer, [DeviceType.ANALOGSENSOR]: PiGauge, [DeviceType.BOILER]: CgSmartHomeBoiler, @@ -39,15 +41,19 @@ const deviceIconLookup: { [DeviceType.POOL]: MdOutlinePool, [DeviceType.CUSTOM]: MdPlaylistAdd, [DeviceType.UNKNOWN]: MdOutlineSensors, - [DeviceType.SYSTEM]: undefined, + [DeviceType.SYSTEM]: null, [DeviceType.SCHEDULER]: MdMoreTime, [DeviceType.GENERIC]: MdOutlineSensors, [DeviceType.VENTILATION]: PiFan }; -const DeviceIcon = ({ type_id }: { type_id: DeviceType }) => { +interface DeviceIconProps { + type_id: DeviceType; +} + +const DeviceIcon = memo(({ type_id }: DeviceIconProps) => { const Icon = deviceIconLookup[type_id]; return Icon ? : null; -}; +}); export default DeviceIcon; diff --git a/interface/src/app/main/Devices.tsx b/interface/src/app/main/Devices.tsx index 991f3ee3f..f96adfb89 100644 --- a/interface/src/app/main/Devices.tsx +++ b/interface/src/app/main/Devices.tsx @@ -1,8 +1,10 @@ import { + memo, useCallback, useContext, useEffect, useLayoutEffect, + useMemo, useState } from 'react'; import { IconContext } from 'react-icons'; @@ -31,7 +33,7 @@ import { DialogActions, DialogContent, DialogTitle, - Grid2 as Grid, + Grid, IconButton, InputAdornment, List, @@ -75,7 +77,7 @@ import { DeviceEntityMask, DeviceType, DeviceValueUOM_s } from './types'; import type { Device, DeviceValue } from './types'; import { deviceValueItemValidation } from './validators'; -const Devices = () => { +const Devices = memo(() => { const { LL } = useI18nContext(); const { me } = useContext(AuthenticatedContext); @@ -91,7 +93,7 @@ const Devices = () => { useLayoutTitle(LL.DEVICES()); - const { data: coreData, send: sendCoreData } = useRequest(() => readCoreData(), { + const { data: coreData, send: sendCoreData } = useRequest(readCoreData, { initialData: { connected: true, devices: [] @@ -116,36 +118,36 @@ const Devices = () => { ); useLayoutEffect(() => { - function updateSize() { - setSize([window.innerWidth, window.innerHeight]); - } + let raf = 0; + const updateSize = () => { + cancelAnimationFrame(raf); + raf = requestAnimationFrame(() => { + setSize([window.innerWidth, window.innerHeight]); + }); + }; window.addEventListener('resize', updateSize); updateSize(); - return () => window.removeEventListener('resize', updateSize); + return () => { + window.removeEventListener('resize', updateSize); + cancelAnimationFrame(raf); + }; }, []); - const leftOffset = () => { + const leftOffset = useCallback(() => { const devicesWindow = document.getElementById('devices-window'); - if (!devicesWindow) { - return 0; - } - - const clientRect = devicesWindow.getBoundingClientRect(); - const left = clientRect.left; - const right = clientRect.right; - - if (!left || !right) { - return 0; - } - + if (!devicesWindow) return 0; + const { left, right } = devicesWindow.getBoundingClientRect(); + if (!left || !right) return 0; return left + (right - left < 400 ? 0 : 200); - }; + }, []); - const common_theme = useTheme({ - BaseRow: ` + const common_theme = useMemo( + () => + useTheme({ + BaseRow: ` font-size: 14px; `, - HeaderRow: ` + HeaderRow: ` text-transform: uppercase; background-color: black; color: #90CAF9; @@ -153,7 +155,7 @@ const Devices = () => { border-bottom: 1px solid #565656; } `, - Row: ` + Row: ` cursor: pointer; background-color: #1E1E1E; .td { @@ -163,30 +165,47 @@ const Devices = () => { background-color: #177ac9; } ` - }); + }), + [] + ); - const device_theme = useTheme([ - common_theme, - { - Table: ` + const device_theme = useMemo( + () => + useTheme([ + common_theme, + { + BaseRow: ` + font-size: 15px; + .td { + height: 28px; + } + `, + Table: ` --data-table-library_grid-template-columns: repeat(1, minmax(0, 1fr)) 130px; `, - HeaderRow: ` + HeaderRow: ` .th { padding: 8px; `, - Row: ` - font-weight: bold; + Row: ` + &:nth-of-type(odd) .td { + background-color: #303030; + }, &:hover .td { background-color: #177ac9; + }, ` - } - ]); + } + ]), + [common_theme] + ); - const data_theme = useTheme([ - common_theme, - { - Table: ` + const data_theme = useMemo( + () => + useTheme([ + common_theme, + { + Table: ` --data-table-library_grid-template-columns: minmax(200px, auto) minmax(150px, auto) 40px; height: auto; max-height: 100%; @@ -195,12 +214,12 @@ const Devices = () => { display:none; } `, - BaseRow: ` + BaseRow: ` .td { height: 32px; } `, - BaseCell: ` + BaseCell: ` &:nth-of-type(1) { border-left: 1px solid #177ac9; }, @@ -211,12 +230,12 @@ const Devices = () => { border-right: 1px solid #177ac9; } `, - HeaderRow: ` + HeaderRow: ` .th { border-top: 1px solid #565656; } `, - Row: ` + Row: ` &:nth-of-type(odd) .td { background-color: #303030; }, @@ -224,8 +243,10 @@ const Devices = () => { background-color: #177ac9; } ` - } - ]); + } + ]), + [common_theme] + ); const getSortIcon = (state: State, sortKey: unknown) => { if (state.sortKey === sortKey && state.reverse) { @@ -238,7 +259,7 @@ const Devices = () => { }; const dv_sort = useSort( - { nodes: deviceData.nodes }, + { nodes: [...deviceData.nodes] }, {}, { sortIcon: { @@ -268,7 +289,7 @@ const Devices = () => { } const device_select = useRowSelect( - { nodes: coreData.devices }, + { nodes: [...coreData.devices] }, { onChange: onSelectChange } @@ -324,18 +345,23 @@ const Devices = () => { return sc; }; - const hasMask = (id: string, mask: number) => - (parseInt(id.slice(0, 2), 16) & mask) === mask; + const hasMask = useCallback( + (id: string, mask: number) => (parseInt(id.slice(0, 2), 16) & mask) === mask, + [] + ); const handleDownloadCsv = () => { const deviceIndex = coreData.devices.findIndex( - (d) => d.id === device_select.state.id + (d: Device) => d.id === device_select.state.id ); if (deviceIndex === -1) { return; } - const filename = - coreData.devices[deviceIndex].tn + '_' + coreData.devices[deviceIndex].n; + const selectedDevice = coreData.devices[deviceIndex]; + if (!selectedDevice) { + return; + } + const filename = selectedDevice.tn + '_' + selectedDevice.n; const columns = [ { @@ -350,7 +376,7 @@ const Devices = () => { { accessor: (dv: DeviceValue) => dv.u !== undefined && DeviceValueUOM_s[dv.u] - ? DeviceValueUOM_s[dv.u].replace(/[^a-zA-Z0-9]/g, '') + ? DeviceValueUOM_s[dv.u]?.replace(/[^a-zA-Z0-9]/g, '') : '', name: 'UoM' }, @@ -373,7 +399,9 @@ const Devices = () => { ]; const data = onlyFav - ? deviceData.nodes.filter((dv) => hasMask(dv.id, DeviceEntityMask.DV_FAVORITE)) + ? deviceData.nodes.filter((dv: DeviceValue) => + hasMask(dv.id, DeviceEntityMask.DV_FAVORITE) + ) : deviceData.nodes; const csvData = data.reduce( @@ -433,10 +461,14 @@ const Devices = () => { const renderDeviceDetails = () => { if (showDeviceInfo) { const deviceIndex = coreData.devices.findIndex( - (d) => d.id === device_select.state.id + (d: Device) => d.id === device_select.state.id ); if (deviceIndex === -1) { - return; + return null; + } + const deviceDetails = coreData.devices[deviceIndex]; + if (!deviceDetails) { + return null; } return ( @@ -449,47 +481,35 @@ const Devices = () => { - + - + - {coreData.devices[deviceIndex].t !== DeviceType.CUSTOM && ( + {deviceDetails.t !== DeviceType.CUSTOM && ( <> - + @@ -508,59 +528,60 @@ const Devices = () => { ); } + return null; }; const renderCoreData = () => ( <> - - {!coreData.connected && ( - - )} - - {coreData.connected && ( - + ) : ( + + - {(tableList: Device[]) => ( - <> -
- - {LL.DESCRIPTION()} - {LL.TYPE(0)} - -
- - {tableList.length === 0 && ( - - )} - {tableList.map((device: Device) => ( - - - -    - {device.n} - -   ({device.e}) - - - {device.tn} - - ))} - - - )} -
- )} -
+ + {(tableList: Device[]) => ( + <> +
+ + {LL.DESCRIPTION()} + {LL.TYPE(0)} + +
+ + {tableList.length === 0 && ( + + )} + {tableList.map((device: Device) => ( + + + +    + {device.n} + +   ({device.e}) + + + {device.tn} + + ))} + + + )} +
+ +
+ )} ); @@ -576,64 +597,77 @@ const Devices = () => { return; } - const showDeviceValue = (dv: DeviceValue) => { + const showDeviceValue = useCallback((dv: DeviceValue) => { setSelectedDeviceValue(dv); setDeviceValueDialogOpen(true); - }; + }, []); - const renderNameCell = (dv: DeviceValue) => ( - <> - {dv.id.slice(2)}  - {hasMask(dv.id, DeviceEntityMask.DV_FAVORITE) && ( - - )} - {hasMask(dv.id, DeviceEntityMask.DV_READONLY) && ( - - )} - {hasMask(dv.id, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( - - )} - + const renderNameCell = useCallback( + (dv: DeviceValue) => ( + <> + {dv.id.slice(2)}  + {hasMask(dv.id, DeviceEntityMask.DV_FAVORITE) && ( + + )} + {hasMask(dv.id, DeviceEntityMask.DV_READONLY) && ( + + )} + {hasMask(dv.id, DeviceEntityMask.DV_API_MQTT_EXCLUDE) && ( + + )} + + ), + [hasMask] ); - const shown_data = onlyFav - ? deviceData.nodes.filter( - (dv) => + const shown_data = useMemo(() => { + if (onlyFav) { + return deviceData.nodes.filter( + (dv: DeviceValue) => hasMask(dv.id, DeviceEntityMask.DV_FAVORITE) && - dv.id.slice(2).includes(search) - ) - : deviceData.nodes.filter((dv) => dv.id.slice(2).includes(search)); + dv.id.slice(2).toLowerCase().includes(search.toLowerCase()) + ); + } + return deviceData.nodes.filter((dv: DeviceValue) => + dv.id.slice(2).toLowerCase().includes(search.toLowerCase()) + ); + }, [deviceData.nodes, onlyFav, search]); const deviceIndex = coreData.devices.findIndex( - (d) => d.id === device_select.state.id + (d: Device) => d.id === device_select.state.id ); if (deviceIndex === -1) { return; } + const deviceInfo = coreData.devices[deviceIndex]; + if (!deviceInfo) { + return; + } + const [, height] = size; return ( leftOffset(), + left: leftOffset, right: 0, bottom: 0, top: 64, zIndex: 'modal', - maxHeight: () => size[1] - 126, + maxHeight: () => (height || 0) - 126, border: '1px solid #177ac9' }} > - {coreData.devices[deviceIndex].n} ( - {coreData.devices[deviceIndex].tn}) + {deviceInfo.n} ( + {deviceInfo.tn}) - + @@ -645,6 +679,7 @@ const Devices = () => { variant="outlined" sx={{ width: '22ch' }} placeholder={LL.SEARCH()} + aria-label={LL.SEARCH()} onChange={(event) => { setSearch(event.target.value); }} @@ -659,19 +694,22 @@ const Devices = () => { }} /> - setShowDeviceInfo(true)}> + setShowDeviceInfo(true)} + aria-label={LL.DEVICE_DETAILS()} + > {me.admin && ( - + )} - + @@ -699,14 +737,14 @@ const Devices = () => { ' ' + shown_data.length + '/' + - coreData.devices[deviceIndex].e + + deviceInfo.e + ' ' + LL.ENTITIES(shown_data.length)} { )} ); -}; +}); export default Devices; diff --git a/interface/src/app/main/DevicesDialog.tsx b/interface/src/app/main/DevicesDialog.tsx index 21789a33d..372926e9f 100644 --- a/interface/src/app/main/DevicesDialog.tsx +++ b/interface/src/app/main/DevicesDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; @@ -11,7 +11,7 @@ import { DialogContent, DialogTitle, FormHelperText, - Grid2 as Grid, + Grid, InputAdornment, MenuItem, TextField, @@ -52,7 +52,7 @@ const DevicesDialog = ({ const [editItem, setEditItem] = useState(selectedItem); const [fieldErrors, setFieldErrors] = useState(); - const updateFormValue = updateValue(setEditItem); + const updateFormValue = useMemo(() => updateValue(setEditItem), [setEditItem]); useEffect(() => { if (open) { @@ -61,11 +61,7 @@ const DevicesDialog = ({ } }, [open, selectedItem]); - const close = () => { - onClose(); - }; - - const save = async () => { + const save = useCallback(async () => { try { setFieldErrors(undefined); await validate(validator, editItem); @@ -73,46 +69,66 @@ const DevicesDialog = ({ } catch (error) { setFieldErrors(error as ValidateFieldsError); } - }; + }, [validator, editItem, onSave]); - const setUom = (uom?: DeviceValueUOM) => { - if (uom === undefined) { - return; - } - switch (uom) { - case DeviceValueUOM.HOURS: - return LL.HOURS(); - case DeviceValueUOM.MINUTES: - return LL.MINUTES(); - case DeviceValueUOM.SECONDS: - return LL.SECONDS(); - default: - return DeviceValueUOM_s[uom]; - } - }; + const setUom = useCallback( + (uom?: DeviceValueUOM) => { + if (uom === undefined) { + return; + } + switch (uom) { + case DeviceValueUOM.HOURS: + return LL.HOURS(); + case DeviceValueUOM.MINUTES: + return LL.MINUTES(); + case DeviceValueUOM.SECONDS: + return LL.SECONDS(); + default: + return DeviceValueUOM_s[uom]; + } + }, + [LL] + ); - const showHelperText = (dv: DeviceValue) => - dv.h ? ( - dv.h - ) : dv.l ? ( - dv.l.join(' | ') - ) : dv.m !== undefined && dv.x !== undefined ? ( - <> - {dv.m} → {dv.x} - - ) : undefined; + const showHelperText = useCallback((dv: DeviceValue) => { + if (dv.h) return dv.h; + if (dv.l) return dv.l.join(' | '); + if (dv.m !== undefined && dv.x !== undefined) { + return ( + <> + {dv.m} → {dv.x} + + ); + } + return undefined; + }, []); + + const isCommand = useMemo( + () => selectedItem.v === '' && selectedItem.c, + [selectedItem.v, selectedItem.c] + ); + + const dialogTitle = useMemo(() => { + if (isCommand) return LL.RUN_COMMAND(); + return writeable ? LL.CHANGE_VALUE() : LL.VALUE(0); + }, [isCommand, writeable, LL]); + + const buttonLabel = useMemo(() => { + return isCommand ? LL.EXECUTE() : LL.UPDATE(); + }, [isCommand, LL]); + + const helperText = useMemo( + () => showHelperText(editItem), + [editItem, showHelperText] + ); + + const valueLabel = LL.VALUE(0); return ( - - - {selectedItem.v === '' && selectedItem.c - ? LL.RUN_COMMAND() - : writeable - ? LL.CHANGE_VALUE() - : LL.VALUE(0)} - + + {dialogTitle} - + {editItem.id.slice(2)} @@ -120,8 +136,8 @@ const DevicesDialog = ({ {editItem.l ? ( ) : editItem.s || editItem.u !== DeviceValueUOM.NONE ? ( ) : ( )} - {writeable && ( + {writeable && helperText && ( - {showHelperText(editItem)} + {helperText} )} @@ -191,7 +207,7 @@ const DevicesDialog = ({ {progress && ( ) : ( - )} diff --git a/interface/src/app/main/EntityMaskToggle.tsx b/interface/src/app/main/EntityMaskToggle.tsx index 66232d286..d2304d6f1 100644 --- a/interface/src/app/main/EntityMaskToggle.tsx +++ b/interface/src/app/main/EntityMaskToggle.tsx @@ -1,3 +1,5 @@ +import { useCallback, useMemo } from 'react'; + import { ToggleButton, ToggleButtonGroup } from '@mui/material'; import OptionIcon from './OptionIcon'; @@ -9,92 +11,132 @@ interface EntityMaskToggleProps { de: DeviceEntity; } -const EntityMaskToggle = ({ onUpdate, de }: EntityMaskToggleProps) => { - const getMaskNumber = (newMask: string[]) => { - let new_mask = 0; - for (const entry of newMask) { - new_mask |= Number(entry); - } - return new_mask; - }; +// Available mask values +const MASK_VALUES = [ + DeviceEntityMask.DV_WEB_EXCLUDE, // 1 + DeviceEntityMask.DV_API_MQTT_EXCLUDE, // 2 + DeviceEntityMask.DV_READONLY, // 4 + DeviceEntityMask.DV_FAVORITE, // 8 + DeviceEntityMask.DV_DELETED // 128 +]; - const getMaskString = (m: number) => { - const new_masks: string[] = []; - if ((m & 1) === 1) { - new_masks.push('1'); - } - if ((m & 2) === 2) { - new_masks.push('2'); - } - if ((m & 4) === 4) { - new_masks.push('4'); - } - if ((m & 8) === 8) { - new_masks.push('8'); - } - if ((m & 128) === 128) { - new_masks.push('128'); - } - return new_masks; - }; +/** + * Converts an array of mask strings to a bitmask number + */ +const getMaskNumber = (newMask: string[]): number => { + return newMask.reduce((mask, entry) => mask | Number(entry), 0); +}; + +/** + * Converts a bitmask number to an array of mask strings + */ +const getMaskString = (mask: number): string[] => { + return MASK_VALUES.filter((value) => (mask & value) === value).map((value) => + String(value) + ); +}; + +/** + * Checks if a specific mask bit is set + */ +const hasMask = (mask: number, flag: number): boolean => (mask & flag) === flag; + +const EntityMaskToggle = ({ onUpdate, de }: EntityMaskToggleProps) => { + const handleChange = useCallback( + (_event: unknown, mask: string[]) => { + // Convert selected masks to a number + const newMask = getMaskNumber(mask); + const updatedDe = { ...de }; + + // Apply business logic for mask interactions + // If entity has no name and is set to readonly, also exclude from web + if (updatedDe.n === '' && hasMask(newMask, DeviceEntityMask.DV_READONLY)) { + updatedDe.m = newMask | DeviceEntityMask.DV_WEB_EXCLUDE; + } else { + updatedDe.m = newMask; + } + + // If excluded from web, cannot be favorite + if (hasMask(updatedDe.m, DeviceEntityMask.DV_WEB_EXCLUDE)) { + updatedDe.m = updatedDe.m & ~DeviceEntityMask.DV_FAVORITE; + } + + onUpdate(updatedDe); + }, + [de, onUpdate] + ); + + // Memoize mask string value + const maskStringValue = useMemo(() => getMaskString(de.m), [de.m]); + + // Memoize disabled states + const isFavoriteDisabled = useMemo( + () => + hasMask(de.m, DeviceEntityMask.DV_WEB_EXCLUDE | DeviceEntityMask.DV_DELETED) || + de.n === undefined, + [de.m, de.n] + ); + + const isReadonlyDisabled = useMemo( + () => + !de.w || + hasMask(de.m, DeviceEntityMask.DV_WEB_EXCLUDE | DeviceEntityMask.DV_FAVORITE), + [de.w, de.m] + ); + + const isApiMqttExcludeDisabled = useMemo( + () => de.n === '' || hasMask(de.m, DeviceEntityMask.DV_DELETED), + [de.n, de.m] + ); + + const isWebExcludeDisabled = useMemo( + () => de.n === undefined || hasMask(de.m, DeviceEntityMask.DV_DELETED), + [de.n, de.m] + ); + + // Memoize mask flag checks + const isFavoriteSet = useMemo( + () => hasMask(de.m, DeviceEntityMask.DV_FAVORITE), + [de.m] + ); + const isReadonlySet = useMemo( + () => hasMask(de.m, DeviceEntityMask.DV_READONLY), + [de.m] + ); + const isApiMqttExcludeSet = useMemo( + () => hasMask(de.m, DeviceEntityMask.DV_API_MQTT_EXCLUDE), + [de.m] + ); + const isWebExcludeSet = useMemo( + () => hasMask(de.m, DeviceEntityMask.DV_WEB_EXCLUDE), + [de.m] + ); + const isDeletedSet = useMemo( + () => hasMask(de.m, DeviceEntityMask.DV_DELETED), + [de.m] + ); return ( { - de.m = getMaskNumber(mask); - if (de.n === '' && de.m & DeviceEntityMask.DV_READONLY) { - de.m = de.m | DeviceEntityMask.DV_WEB_EXCLUDE; - } - if (de.m & DeviceEntityMask.DV_WEB_EXCLUDE) { - de.m = de.m & ~DeviceEntityMask.DV_FAVORITE; - } - onUpdate(de); - }} + value={maskStringValue} + onChange={handleChange} > - - + + - = 3}> - + + - - + + - - + + - + ); diff --git a/interface/src/app/main/Help.tsx b/interface/src/app/main/Help.tsx index 355fb195d..320b55ba0 100644 --- a/interface/src/app/main/Help.tsx +++ b/interface/src/app/main/Help.tsx @@ -1,4 +1,5 @@ -import { useContext, useState } from 'react'; +import { memo, useCallback, useContext, useMemo, useState } from 'react'; +import type { ReactElement } from 'react'; import { toast } from 'react-toastify'; import CommentIcon from '@mui/icons-material/CommentTwoTone'; @@ -19,6 +20,7 @@ import { Stack, Typography } from '@mui/material'; +import type { SxProps, Theme } from '@mui/material/styles'; import { useRequest } from 'alova/client'; import { SectionContent, useLayoutTitle } from 'components'; @@ -29,25 +31,61 @@ import { saveFile } from 'utils'; import { API, callAction } from '../../api/app'; import type { APIcall } from './types'; -const Help = () => { +interface HelpLink { + href: string; + icon: ReactElement; + label: () => string; +} + +interface CustomSupport { + img_url: string | null; + html: string | null; +} + +const DEFAULT_IMAGE_URL = 'https://emsesp.org/_media/images/installer.jpeg'; + +const SUPPORT_BOX_STYLES: SxProps = { + borderRadius: 3, + border: '1px solid lightblue', + justifyContent: 'space-evenly', + alignItems: 'center' +}; + +const IMAGE_STYLES: SxProps = { + maxHeight: { xs: 100, md: 250 } +}; + +const AVATAR_STYLES: SxProps = { + bgcolor: '#72caf9' +}; + +const HelpComponent = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.HELP()); const { me } = useContext(AuthenticatedContext); - const [customSupportIMG, setCustomSupportIMG] = useState(null); - const [customSupportHTML, setCustomSupportHTML] = useState(null); - const [notFound, setNotFound] = useState(false); + const [customSupport, setCustomSupport] = useState({ + img_url: null, + html: null + }); + const [imgError, setImgError] = useState(false); - useRequest(() => callAction({ action: 'getCustomSupport' })).onSuccess((event) => { - if (event && event.data && Object.keys(event.data).length !== 0) { - const data = event.data.Support; - if (data.img_url) { - setCustomSupportIMG(data.img_url); - } - if (data.html) { - setCustomSupportHTML(data.html.join('
')); - } + // Memoize the request method to prevent re-creation on every render + const getCustomSupportMethod = useMemo( + () => callAction({ action: 'getCustomSupport' }), + [] + ); + + useRequest(getCustomSupportMethod).onSuccess((event) => { + if (event?.data && Object.keys(event.data).length !== 0) { + const { Support } = event.data as { + Support: { img_url?: string; html?: string[] }; + }; + setCustomSupport({ + img_url: Support.img_url || null, + html: Support.html?.join('
') || null + }); } }); @@ -59,93 +97,91 @@ const Help = () => { toast.info(LL.DOWNLOAD_SUCCESSFUL()); }) .onError((error) => { - toast.error(error.message); + toast.error(String(error.error?.message || 'An error occurred')); }); + // Optimize API call memoization + const apiCall = useMemo(() => ({ device: 'system', cmd: 'info', id: 0 }), []); + + const handleDownloadSystemInfo = useCallback(() => { + void sendAPI(apiCall); + }, [sendAPI, apiCall]); + + const handleImageError = useCallback(() => { + setImgError(true); + }, []); + + // Memoize help links to prevent recreation on every render + const helpLinks: HelpLink[] = useMemo( + () => [ + { + href: 'https://emsesp.org', + icon: , + label: () => LL.HELP_INFORMATION_1() + }, + { + href: 'https://discord.gg/3J3GgnzpyT', + icon: , + label: () => LL.HELP_INFORMATION_2() + }, + { + href: 'https://github.com/emsesp/EMS-ESP32/issues/new/choose', + icon: , + label: () => LL.HELP_INFORMATION_3() + } + ], + [LL] + ); + + const isAdmin = useMemo(() => me?.admin ?? false, [me?.admin]); + + // Memoize image source computation + const imageSrc = useMemo( + () => + imgError || !customSupport.img_url ? DEFAULT_IMAGE_URL : customSupport.img_url, + [imgError, customSupport.img_url] + ); + return ( - {customSupportHTML && ( + {customSupport.html && ( } - sx={{ - borderRadius: 3, - border: '2px solid grey', - justifyContent: 'space-evenly', - alignItems: 'center' - }} + sx={SUPPORT_BOX_STYLES} > -
+
setNotFound(true)} - src={ - notFound - ? '' - : customSupportIMG || - 'https://docs.emsesp.org/_media/images/installer.jpeg' - } + sx={IMAGE_STYLES} + onError={handleImageError} + src={imageSrc} /> )} - {me.admin && ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + {isAdmin && ( + + {helpLinks.map(({ href, icon, label }) => ( + + + + {icon} + + + + + ))} )} @@ -157,7 +193,7 @@ const Help = () => { startIcon={} variant="outlined" color="primary" - onClick={() => sendAPI({ device: 'system', cmd: 'info', id: 0 })} + onClick={handleDownloadSystemInfo} > {LL.SUPPORT_INFORMATION(0)} @@ -173,11 +209,14 @@ const Help = () => { href="https://emsesp.org" color="primary" > - {'emsesp.org'} + emsesp.org ); }; +// Memoize the component to prevent unnecessary re-renders +const Help = memo(HelpComponent); + export default Help; diff --git a/interface/src/app/main/Modules.tsx b/interface/src/app/main/Modules.tsx index c5fa4ad88..35d191fdd 100644 --- a/interface/src/app/main/Modules.tsx +++ b/interface/src/app/main/Modules.tsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { memo, useCallback, useMemo, useState } from 'react'; import { useBlocker } from 'react-router'; import { toast } from 'react-toastify'; @@ -31,6 +31,19 @@ import { readModules, writeModules } from '../../api/app'; import ModulesDialog from './ModulesDialog'; import type { ModuleItem } from './types'; +const PENDING_COLOR = 'red'; +const ACTIVATED_COLOR = '#00FF7F'; + +const hasModulesChanged = (mi: ModuleItem): boolean => + mi.enabled !== mi.o_enabled || mi.license !== mi.o_license; + +const ColorStatus = memo(({ status }: { status: number }) => { + if (status === 1) { + return
Pending Activation
; + } + return
Activated
; +}); + const Modules = () => { const { LL } = useI18nContext(); const [numChanges, setNumChanges] = useState(0); @@ -56,105 +69,111 @@ const Modules = () => { } ); - const modules_theme = useTheme({ - Table: ` - --data-table-library_grid-template-columns: 48px 180px 120px 100px repeat(1, minmax(160px, 1fr)) 180px; - `, - BaseRow: ` - font-size: 14px; - .td { - height: 32px; - } - `, - BaseCell: ` - &:nth-of-type(1) { - text-align: center; - } - `, - HeaderRow: ` - text-transform: uppercase; - background-color: black; - color: #90CAF9; - .th { - border-bottom: 1px solid #565656; - height: 36px; - } - `, - Row: ` - background-color: #1e1e1e; - position: relative; - cursor: pointer; - .td { - border-top: 1px solid #565656; - border-bottom: 1px solid #565656; - } - &:hover .td { - border-top: 1px solid #177ac9; - border-bottom: 1px solid #177ac9; - } - &:nth-of-type(odd) .td { - background-color: #303030; - } - ` - }); + const modules_theme = useTheme( + useMemo( + () => ({ + Table: ` + --data-table-library_grid-template-columns: 48px 180px 120px 100px repeat(1, minmax(160px, 1fr)) 180px; + `, + BaseRow: ` + font-size: 14px; + .td { + height: 32px; + } + `, + BaseCell: ` + &:nth-of-type(1) { + text-align: center; + } + `, + HeaderRow: ` + text-transform: uppercase; + background-color: black; + color: #90CAF9; + .th { + border-bottom: 1px solid #565656; + height: 36px; + } + `, + Row: ` + background-color: #1e1e1e; + position: relative; + cursor: pointer; + .td { + border-top: 1px solid #565656; + border-bottom: 1px solid #565656; + } + &:hover .td { + border-top: 1px solid #177ac9; + border-bottom: 1px solid #177ac9; + } + &:nth-of-type(odd) .td { + background-color: #303030; + } + ` + }), + [] + ) + ); - const onDialogClose = () => { + const onDialogClose = useCallback(() => { setDialogOpen(false); - }; + }, []); - const onDialogSave = (updatedItem: ModuleItem) => { - setDialogOpen(false); - updateModuleItem(updatedItem); - }; + const updateModuleItem = useCallback((updatedItem: ModuleItem) => { + void updateState(readModules(), (data: ModuleItem[]) => { + const new_data = data.map((mi) => + mi.id === updatedItem.id ? { ...mi, ...updatedItem } : mi + ); + setNumChanges(new_data.filter(hasModulesChanged).length); + return new_data; + }); + }, []); + + const onDialogSave = useCallback( + (updatedItem: ModuleItem) => { + setDialogOpen(false); + updateModuleItem(updatedItem); + }, + [updateModuleItem] + ); const editModuleItem = useCallback((mi: ModuleItem) => { setSelectedModuleItem(mi); setDialogOpen(true); }, []); - const onCancel = async () => { + const onCancel = useCallback(async () => { await fetchModules().then(() => { setNumChanges(0); }); - }; + }, [fetchModules]); - function hasModulesChanged(mi: ModuleItem) { - return mi.enabled !== mi.o_enabled || mi.license !== mi.o_license; - } - - const updateModuleItem = (updatedItem: ModuleItem) => { - void updateState(readModules(), (data: ModuleItem[]) => { - const new_data = data.map((mi) => - mi.id === updatedItem.id ? { ...mi, ...updatedItem } : mi + const saveModules = useCallback(async () => { + try { + await Promise.all( + modules.map((condensed_mi: ModuleItem) => + updateModules({ + key: condensed_mi.key, + enabled: condensed_mi.enabled, + license: condensed_mi.license + }) + ) ); - setNumChanges(new_data.filter((mi) => hasModulesChanged(mi)).length); - return new_data; - }); - }; + toast.success(LL.MODULES_UPDATED()); + } catch (error) { + toast.error(error instanceof Error ? error.message : String(error)); + } finally { + await fetchModules(); + setNumChanges(0); + } + }, [modules, updateModules, LL, fetchModules]); - const saveModules = async () => { - await updateModules({ - modules: modules.map((condensed_mi) => ({ - key: condensed_mi.key, - enabled: condensed_mi.enabled, - license: condensed_mi.license - })) - }) - .then(() => { - toast.success(LL.MODULES_UPDATED()); - }) - .catch((error: Error) => { - toast.error(error.message); - }) - .finally(async () => { - await fetchModules(); - setNumChanges(0); - }); - }; - - const renderContent = () => { + const content = useMemo(() => { if (!modules) { - return ; + return ( + + ); } if (modules.length === 0) { @@ -165,13 +184,6 @@ const Modules = () => { ); } - const colorStatus = (status: number) => { - if (status === 1) { - return
Pending Activation
; - } - return
Activated
; - }; - return ( <> @@ -214,7 +226,9 @@ const Modules = () => { {mi.author} {mi.version} {mi.message} - {colorStatus(mi.status)} + + + ))} @@ -248,12 +262,22 @@ const Modules = () => { ); - }; + }, [ + modules, + fetchModules, + error, + modules_theme, + editModuleItem, + LL, + numChanges, + onCancel, + saveModules + ]); return ( {blocker ? : null} - {renderContent()} + {content} {selectedModuleItem && ( (selectedItem); - const updateFormValue = updateValue(setEditItem); + const updateFormValue = useMemo( + () => + updateValue( + setEditItem as unknown as React.Dispatch< + React.SetStateAction> + > + ), + [] + ); + // Sync form state when dialog opens or selected item changes useEffect(() => { if (open) { setEditItem(selectedItem); } }, [open, selectedItem]); - const close = () => { - onClose(); - }; - - const save = () => { + const handleSave = useCallback(() => { onSave(editItem); - }; + }, [editItem, onSave]); + + const dialogTitle = useMemo( + () => `${LL.EDIT()} ${editItem.key}`, + [LL, editItem.key] + ); return ( - {LL.EDIT() + ' ' + editItem.key} + {dialogTitle} } variant="outlined" - onClick={close} + onClick={onClose} color="secondary" > {LL.CANCEL()} @@ -93,7 +103,7 @@ const ModulesDialog = ({
!si.deleted) - .sort((a, b) => a.flags - b.flags) - }} + data={{ nodes: filteredAndSortedSchedule }} theme={schedule_theme} layout={{ custom: true }} > @@ -266,22 +308,15 @@ const Scheduler = () => { {tableList.map((si: ScheduleItem) => ( editScheduleItem(si)}> - {si.active ? ( - - ) : ( - - )} + - {si.flags > 127 ? ( + {si.flags > SCHEDULE_FLAG_THRESHOLD ? ( scheduleType(si) ) : ( <> @@ -307,7 +342,17 @@ const Scheduler = () => { )}
); - }; + }, [ + schedule, + error, + fetchSchedule, + filteredAndSortedSchedule, + schedule_theme, + editScheduleItem, + LL, + dayBox, + scheduleType + ]); return ( @@ -329,7 +374,7 @@ const Scheduler = () => { /> )} - + {numChanges !== 0 && ( diff --git a/interface/src/app/main/SchedulerDialog.tsx b/interface/src/app/main/SchedulerDialog.tsx index c647ffc6e..06495fd94 100644 --- a/interface/src/app/main/SchedulerDialog.tsx +++ b/interface/src/app/main/SchedulerDialog.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react'; +import { useCallback, useEffect, useMemo, useState } from 'react'; import AddIcon from '@mui/icons-material/Add'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -13,7 +13,7 @@ import { DialogActions, DialogContent, DialogTitle, - Grid2 as Grid, + Grid, TextField, ToggleButton, ToggleButtonGroup, @@ -31,6 +31,34 @@ import { validate } from 'validators'; import { ScheduleFlag } from './types'; import type { ScheduleItem } from './types'; +// Constants +const FLAG_MASK_127 = 127; +const SCHEDULE_TYPE_THRESHOLD = 128; +const DEFAULT_TIME = '00:00'; +const TYPOGRAPHY_FONT_SIZE = 10; + +// Day of week flag configuration (static, defined outside component) +const DAY_FLAGS = [ + { value: '2', flag: ScheduleFlag.SCHEDULE_MON }, + { value: '4', flag: ScheduleFlag.SCHEDULE_TUE }, + { value: '8', flag: ScheduleFlag.SCHEDULE_WED }, + { value: '16', flag: ScheduleFlag.SCHEDULE_THU }, + { value: '32', flag: ScheduleFlag.SCHEDULE_FRI }, + { value: '64', flag: ScheduleFlag.SCHEDULE_SAT }, + { value: '1', flag: ScheduleFlag.SCHEDULE_SUN } +] as const; + +// Day of week flag values array (static) +const FLAG_VALUES = [ + ScheduleFlag.SCHEDULE_SUN, + ScheduleFlag.SCHEDULE_MON, + ScheduleFlag.SCHEDULE_TUE, + ScheduleFlag.SCHEDULE_WED, + ScheduleFlag.SCHEDULE_THU, + ScheduleFlag.SCHEDULE_FRI, + ScheduleFlag.SCHEDULE_SAT +] as const; + interface SchedulerDialogProps { open: boolean; creating: boolean; @@ -53,107 +81,163 @@ const SchedulerDialog = ({ const { LL } = useI18nContext(); const [editItem, setEditItem] = useState(selectedItem); const [fieldErrors, setFieldErrors] = useState(); - const [scheduleType, setScheduleType] = useState(); - const updateFormValue = updateValue(setEditItem); + const updateFormValue = useMemo( + () => + updateValue( + setEditItem as unknown as React.Dispatch< + React.SetStateAction> + > + ), + [] + ); useEffect(() => { if (open) { setFieldErrors(undefined); setEditItem(selectedItem); - // set the flags based on type when page is loaded... + // Set the flags based on type when page is loaded: // 0-127 is day schedule // 128 is timer // 129 is on change // 130 is on condition // 132 is immediate setScheduleType( - selectedItem.flags < 128 ? ScheduleFlag.SCHEDULE_DAY : selectedItem.flags + selectedItem.flags < SCHEDULE_TYPE_THRESHOLD + ? ScheduleFlag.SCHEDULE_DAY + : selectedItem.flags ); } }, [open, selectedItem]); - const save = async () => { - try { - setFieldErrors(undefined); - await validate(validator, editItem); - onSave(editItem); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } - }; - - const saveandactivate = async () => { - editItem.active = true; - try { - setFieldErrors(undefined); - await validate(validator, editItem); - onSave(editItem); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } - }; - - const remove = () => { - editItem.deleted = true; - onSave(editItem); - }; - - const getFlagDOWnumber = (newFlag: string[]) => { - let new_flag = 0; - for (const entry of newFlag) { - new_flag |= Number(entry); - } - return new_flag & 127; - }; - - const getFlagDOWstring = (f: number) => { - const new_flags: string[] = []; - if ((f & 129) === 1) { - new_flags.push('1'); - } - if ((f & 130) === 2) { - new_flags.push('2'); - } - if ((f & 4) === 4) { - new_flags.push('4'); - } - if ((f & 8) === 8) { - new_flags.push('8'); - } - if ((f & 16) === 16) { - new_flags.push('16'); - } - if ((f & 32) === 32) { - new_flags.push('32'); - } - if ((f & 64) === 64) { - new_flags.push('64'); - } - - return new_flags; - }; - - const showDOW = (si: ScheduleItem, flag: number) => ( - - {dow[Math.log(flag) / Math.log(2)]} - + // Helper function to handle save operations + const handleSave = useCallback( + async (itemToSave: ScheduleItem) => { + try { + setFieldErrors(undefined); + await validate(validator, itemToSave); + onSave(itemToSave); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); + } + }, + [validator, onSave] ); - const handleClose = (_event, reason: 'backdropClick' | 'escapeKeyDown') => { - if (reason !== 'backdropClick') { - onClose(); + const save = useCallback(async () => { + await handleSave(editItem); + }, [editItem, handleSave]); + + const saveandactivate = useCallback(async () => { + await handleSave({ ...editItem, active: true }); + }, [editItem, handleSave]); + + const remove = useCallback(() => { + onSave({ ...editItem, deleted: true }); + }, [editItem, onSave]); + + // Optimize DOW flag conversion + const getFlagDOWnumber = useCallback((flags: string[]) => { + return flags.reduce((acc, flag) => acc | Number(flag), 0) & FLAG_MASK_127; + }, []); + + const getFlagDOWstring = useCallback((f: number) => { + return FLAG_VALUES.filter((flag) => (f & flag) === flag).map((flag) => + String(flag) + ); + }, []); + + // Day of week display component + const DayOfWeekButton = useCallback( + (flag: number) => { + const dayIndex = Math.log2(flag); + const isSelected = (editItem.flags & flag) === flag; + return ( + + {dow[dayIndex]} + + ); + }, + [editItem.flags, dow] + ); + + const handleClose = useCallback( + (_event: React.SyntheticEvent, reason: 'backdropClick' | 'escapeKeyDown') => { + if (reason !== 'backdropClick') { + onClose(); + } + }, + [onClose] + ); + + const handleScheduleTypeChange = useCallback( + (_event: React.SyntheticEvent, flag: ScheduleFlag | null) => { + if (flag !== null) { + setFieldErrors(undefined); // clear any validation errors + setScheduleType(flag); + // wipe the time field when changing the schedule type + // set the flags based on type + const newFlags = flag === ScheduleFlag.SCHEDULE_DAY ? 0 : flag; + setEditItem((prev) => ({ ...prev, time: '', flags: newFlags })); + } + }, + [] + ); + + const handleDOWChange = useCallback( + (_event: React.SyntheticEvent, flags: string[]) => { + const newFlags = getFlagDOWnumber(flags); + setEditItem((prev) => ({ ...prev, flags: newFlags })); + }, + [getFlagDOWnumber] + ); + + // Memoize derived values + const isDaySchedule = useMemo( + () => scheduleType === ScheduleFlag.SCHEDULE_DAY, + [scheduleType] + ); + const isTimerSchedule = useMemo( + () => scheduleType === ScheduleFlag.SCHEDULE_TIMER, + [scheduleType] + ); + const isImmediateSchedule = useMemo( + () => scheduleType === ScheduleFlag.SCHEDULE_IMMEDIATE, + [scheduleType] + ); + const needsTimeField = useMemo( + () => isDaySchedule || isTimerSchedule, + [isDaySchedule, isTimerSchedule] + ); + + const dowFlags = useMemo( + () => getFlagDOWstring(editItem.flags), + [editItem.flags, getFlagDOWstring] + ); + + const timeFieldValue = useMemo(() => { + if (needsTimeField) { + return editItem.time === '' ? DEFAULT_TIME : editItem.time; } - }; + return editItem.time === DEFAULT_TIME ? '' : editItem.time; + }, [editItem.time, needsTimeField]); + + const timeFieldLabel = useMemo(() => { + if (scheduleType === ScheduleFlag.SCHEDULE_TIMER) return LL.TIMER(1); + if (scheduleType === ScheduleFlag.SCHEDULE_CONDITION) return LL.CONDITION(); + if (scheduleType === ScheduleFlag.SCHEDULE_ONCHANGE) return LL.ONCHANGE(); + if (scheduleType === ScheduleFlag.SCHEDULE_IMMEDIATE) return LL.IMMEDIATE(); + return LL.TIME(1); + }, [scheduleType, LL]); return ( - {creating ? LL.ADD(1) + ' ' + LL.NEW(0) : LL.EDIT()}  + {creating ? `${LL.ADD(1)} ${LL.NEW(0)}` : LL.EDIT()}  {LL.SCHEDULE(1)} @@ -163,47 +247,27 @@ const SchedulerDialog = ({ value={scheduleType} exclusive disabled={!creating} - onChange={(_event, flag: ScheduleFlag) => { - if (flag !== null) { - setFieldErrors(undefined); // clear any validation errors - setScheduleType(flag); - // wipe the time field when changing the schedule type - setEditItem({ ...editItem, time: '' }); - // set the flags based on type - // 0-127 is day schedule - // 128 is timer - // 129 is on change - // 130 is on condition - // 132 is immediate - setEditItem( - flag === ScheduleFlag.SCHEDULE_DAY - ? { ...editItem, flags: 0 } - : { ...editItem, flags: flag } - ); - } - }} + onChange={handleScheduleTypeChange} > {LL.SCHEDULE(0)} {LL.TIMER(0)} {LL.IMMEDIATE()} - {scheduleType === ScheduleFlag.SCHEDULE_DAY && ( + {isDaySchedule && ( { - setEditItem({ ...editItem, flags: getFlagDOWnumber(flag) }); - }} + value={dowFlags} + onChange={handleDOWChange} > - - {showDOW(editItem, ScheduleFlag.SCHEDULE_MON)} - - - {showDOW(editItem, ScheduleFlag.SCHEDULE_TUE)} - - - {showDOW(editItem, ScheduleFlag.SCHEDULE_WED)} - - - {showDOW(editItem, ScheduleFlag.SCHEDULE_THU)} - - - {showDOW(editItem, ScheduleFlag.SCHEDULE_FRI)} - - - {showDOW(editItem, ScheduleFlag.SCHEDULE_SAT)} - - - {showDOW(editItem, ScheduleFlag.SCHEDULE_SUN)} - + {DAY_FLAGS.map(({ value, flag }) => ( + + {DayOfWeekButton(flag)} + + ))} )} - {scheduleType !== ScheduleFlag.SCHEDULE_IMMEDIATE && ( + {!isImmediateSchedule && ( <> - {scheduleType === ScheduleFlag.SCHEDULE_DAY || - scheduleType === ScheduleFlag.SCHEDULE_TIMER ? ( + {needsTimeField ? ( <> - {scheduleType === ScheduleFlag.SCHEDULE_TIMER && ( + {isTimerSchedule && ( {LL.SCHEDULER_HELP_2()} @@ -307,16 +346,10 @@ const SchedulerDialog = ({ ) : ( @@ -325,7 +358,7 @@ const SchedulerDialog = ({ )} {creating ? LL.ADD(0) : LL.UPDATE()} - {scheduleType === ScheduleFlag.SCHEDULE_IMMEDIATE && editItem.cmd !== '' && ( + {isImmediateSchedule && editItem.cmd !== '' && ( + + ); +}; + +const UserProfile = memo(UserProfileComponent); + +export default UserProfile; diff --git a/interface/src/app/main/deviceValue.ts b/interface/src/app/main/deviceValue.ts index 57b0dfaa3..9a156d829 100644 --- a/interface/src/app/main/deviceValue.ts +++ b/interface/src/app/main/deviceValue.ts @@ -2,27 +2,30 @@ import type { TranslationFunctions } from 'i18n/i18n-types'; import { DeviceValueUOM, DeviceValueUOM_s } from './types'; +// Cache NumberFormat instances for better performance +const numberFormatter = new Intl.NumberFormat(); +const numberFormatterWithDecimal = new Intl.NumberFormat(undefined, { + minimumFractionDigits: 1 +}); + const formatDurationMin = (LL: TranslationFunctions, duration_min: number) => { - const days = Math.trunc((duration_min * 60000) / 86400000); - const hours = Math.trunc((duration_min * 60000) / 3600000) % 24; - const minutes = Math.trunc((duration_min * 60000) / 60000) % 60; + const totalMs = duration_min * 60000; + const days = Math.trunc(totalMs / 86400000); + const hours = Math.trunc(totalMs / 3600000) % 24; + const minutes = Math.trunc(duration_min) % 60; - let formatted = ''; + const parts: string[] = []; if (days) { - formatted += LL.NUM_DAYS({ num: days }); + parts.push(LL.NUM_DAYS({ num: days })); } - if (hours) { - if (formatted) formatted += ' '; - formatted += LL.NUM_HOURS({ num: hours }); + parts.push(LL.NUM_HOURS({ num: hours })); } - if (minutes) { - if (formatted) formatted += ' '; - formatted += LL.NUM_MINUTES({ num: minutes }); + parts.push(LL.NUM_MINUTES({ num: minutes })); } - return formatted; + return parts.join(' '); }; export function formatValue( @@ -30,18 +33,21 @@ export function formatValue( value?: unknown, uom?: DeviceValueUOM ) { + // Handle non-numeric values or missing data if (typeof value !== 'number' || uom === undefined || value === undefined) { if (value === undefined || typeof value === 'boolean') { return ''; } + // Type assertion is safe here since we know it's not a number, boolean, or undefined return ( (value as string) + - (value === '' || uom === undefined || uom === 0 + (value === '' || uom === undefined || uom === DeviceValueUOM.NONE ? '' : ' ' + DeviceValueUOM_s[uom]) ); } + // Handle numeric values switch (uom) { case DeviceValueUOM.HOURS: return value ? formatDurationMin(LL, value * 60) : LL.NUM_HOURS({ num: 0 }); @@ -50,18 +56,12 @@ export function formatValue( case DeviceValueUOM.SECONDS: return LL.NUM_SECONDS({ num: value }); case DeviceValueUOM.NONE: - return new Intl.NumberFormat().format(value); + return numberFormatter.format(value); case DeviceValueUOM.DEGREES: case DeviceValueUOM.DEGREES_R: case DeviceValueUOM.FAHRENHEIT: - return ( - new Intl.NumberFormat(undefined, { - minimumFractionDigits: 1 - }).format(value) + - ' ' + - DeviceValueUOM_s[uom] - ); + return numberFormatterWithDecimal.format(value) + ' ' + DeviceValueUOM_s[uom]; default: - return new Intl.NumberFormat().format(value) + ' ' + DeviceValueUOM_s[uom]; + return numberFormatter.format(value) + ' ' + DeviceValueUOM_s[uom]; } } diff --git a/interface/src/app/main/types.ts b/interface/src/app/main/types.ts index f9cd06c7c..67b88d10e 100644 --- a/interface/src/app/main/types.ts +++ b/interface/src/app/main/types.ts @@ -60,7 +60,7 @@ export interface Stat { } export interface Activity { - stats: Stat[]; + readonly stats: readonly Stat[]; } export interface Device { @@ -82,38 +82,43 @@ export interface TemperatureSensor { t?: number; // temp, optional o: number; // offset u: number; // uom + s: boolean; // system sensor flag o_n?: string; } export interface AnalogSensor { id: number; g: number; // GPIO - n: string; - v: number; - u: number; - o: number; - f: number; - t: number; + n: string; // name + v: number; // value + u: number; // uom + o: number; // offset + f: number; // factor + t: number; // type d: boolean; // deleted flag - o_n?: string; + s: boolean; // system sensor flag + o_n?: string; // original name } export interface WriteTemperatureSensor { id: string; name: string; offset: number; + is_system: boolean; } export interface SensorData { ts: TemperatureSensor[]; as: AnalogSensor[]; analog_enabled: boolean; + available_gpios: number[]; + exclude_types: number[]; platform: string; } export interface CoreData { - connected: boolean; - devices: Device[]; + readonly connected: boolean; + readonly devices: readonly Device[]; } export interface DashboardItem { @@ -122,11 +127,12 @@ export interface DashboardItem { n?: string; // name, optional dv?: DeviceValue; // device value, optional nodes?: DashboardItem[]; // children nodes, optional + parentNode: DashboardItem; // to stop lint errors } export interface DashboardData { - connected: boolean; // true if connected to EMS bus - nodes: DashboardItem[]; + readonly connected: boolean; // true if connected to EMS bus + readonly nodes: readonly DashboardItem[]; } export interface DeviceValue { @@ -139,10 +145,11 @@ export interface DeviceValue { s?: string; // steps for up/down, optional m?: number; // min, optional x?: number; // max, optional + [key: string]: unknown; } export interface DeviceData { - nodes: DeviceValue[]; + readonly nodes: readonly DeviceValue[]; } export interface DeviceEntity { @@ -188,13 +195,14 @@ export enum DeviceValueUOM { VOLTS, MBAR, LH, - CTKWH + CTKWH, + HZ } export const DeviceValueUOM_s = [ '', '°C', - '°C', + '°C Rel', '%', 'l/min', 'kWh', @@ -218,12 +226,12 @@ export const DeviceValueUOM_s = [ 'V', 'mbar', 'l/h', - 'ct/kWh' -]; + 'ct/kWh', + 'Hz' +] as const; export enum AnalogType { REMOVED = -1, - NOTUSED = 0, DIGITAL_IN = 1, COUNTER = 2, ADC = 3, @@ -232,29 +240,45 @@ export enum AnalogType { DIGITAL_OUT = 6, PWM_0 = 7, PWM_1 = 8, - PWM_2 = 9 + PWM_2 = 9, + NTC = 10, + RGB = 11, + PULSE = 12, + FREQ_0 = 13, + FREQ_1 = 14, + FREQ_2 = 15, + CNT_0 = 16, + CNT_1 = 17, + CNT_2 = 18 } export const AnalogTypeNames = [ - '(disabled)', - 'Digital In', - 'Counter', - 'ADC', - 'Timer', - 'Rate', - 'Digital Out', - 'PWM 0', - 'PWM 1', - 'PWM 2' -]; + 'Digital In', // 1 + 'Counter', // 2 + 'ADC In', // 3 + 'Timer', // 4 + 'Rate', // 5 + 'Digital Out', // 6 + 'PWM 0', // 7 + 'PWM 1', // 8 + 'PWM 2', // 9 + 'NTC Temp', // 10 + 'RGB Led', // 11 + 'Pulse', // 12 + 'Freq 0', // 13 + 'Freq 1', // 14 + 'Freq 2', // 15 + 'Counter 0', // 16 + 'Counter 1', // 17 + 'Counter 2' // 18 +] as const; -type BoardProfiles = Record; - -export const BOARD_PROFILES: BoardProfiles = { +export const BOARD_PROFILES = { S32: 'BBQKees Gateway S32', S32S3: 'BBQKees Gateway S3', E32: 'BBQKees Gateway E32', E32V2: 'BBQKees Gateway E32 V2', + E32V2_2: 'BBQKees Gateway E32 V2.2', NODEMCU: 'NodeMCU 32S', 'MH-ET': 'MH-ET Live D1 Mini', LOLIN: 'Lolin D32', @@ -263,7 +287,9 @@ export const BOARD_PROFILES: BoardProfiles = { C3MINI: 'Wemos C3 Mini', S2MINI: 'Wemos S2 Mini', S3MINI: 'Liligo S3' -}; +} as const; + +export type BoardProfileKey = keyof typeof BOARD_PROFILES; export interface BoardProfile { board_profile: string; @@ -300,6 +326,7 @@ export interface WriteAnalogSensor { uom: number; type: number; deleted: boolean; + is_system: boolean; } export enum DeviceEntityMask { @@ -331,7 +358,7 @@ export interface ScheduleItem { } export interface Schedule { - schedule: ScheduleItem[]; + readonly schedule: readonly ScheduleItem[]; } export interface ModuleItem { @@ -349,7 +376,7 @@ export interface ModuleItem { } export interface Modules { - modules: ModuleItem[]; + readonly modules: readonly ModuleItem[]; } export enum ScheduleFlag { @@ -380,6 +407,7 @@ export interface EntityItem { value_type: number; value?: unknown; writeable: boolean; + hide: boolean; deleted?: boolean; o_id?: number; o_ram?: number; @@ -393,10 +421,11 @@ export interface EntityItem { o_deleted?: boolean; o_writeable?: boolean; o_value?: unknown; + o_hide?: boolean; } export interface Entities { - entities: EntityItem[]; + readonly entities: readonly EntityItem[]; } // matches emsdevice.h DeviceType @@ -452,4 +481,4 @@ export const DeviceValueTypeNames = [ 'ENUM', 'RAW', 'CMD' -]; +] as const; diff --git a/interface/src/app/main/validators.ts b/interface/src/app/main/validators.ts index c3c04c0d6..8f320dcfb 100644 --- a/interface/src/app/main/validators.ts +++ b/interface/src/app/main/validators.ts @@ -11,376 +11,273 @@ import type { TemperatureSensor } from './types'; -export const GPIO_VALIDATOR = { - validator( - rule: InternalRuleItem, - value: number, - callback: (error?: string) => void - ) { - if ( - value && - (value === 1 || - (value >= 6 && value <= 11) || - value === 20 || - value === 24 || - (value >= 28 && value <= 31) || - value > 40 || - value < 0) - ) { - callback('Must be an valid GPIO port'); - } else { - callback(); - } +// Constants +const ERROR_MESSAGES = { + GPIO_INVALID: 'Must be an valid GPIO port', + NAME_DUPLICATE: 'Name already in use', + GPIO_DUPLICATE: 'GPIO already in use', + VALUE_OUT_OF_RANGE: 'Value out of range', + HEX_REQUIRED: 'Is required and must be in hex format' +} as const; + +const VALIDATION_LIMITS = { + PORT_MIN: 0, + PORT_MAX: 65535, + MODBUS_MAX_CLIENTS_MIN: 0, + MODBUS_MAX_CLIENTS_MAX: 50, + MODBUS_TIMEOUT_MIN: 100, + MODBUS_TIMEOUT_MAX: 20000, + SYSLOG_MARK_INTERVAL_MIN: 0, + SYSLOG_MARK_INTERVAL_MAX: 3600, + SHOWER_MIN_DURATION_MIN: 10, + SHOWER_MIN_DURATION_MAX: 360, + SHOWER_ALERT_TRIGGER_MIN: 1, + SHOWER_ALERT_TRIGGER_MAX: 20, + SHOWER_ALERT_COLDSHOT_MIN: 1, + SHOWER_ALERT_COLDSHOT_MAX: 10, + REMOTE_TIMEOUT_MIN: 1, + REMOTE_TIMEOUT_MAX: 240, + OFFSET_MIN: 0, + OFFSET_MAX: 255, + COMMAND_MIN: 1, + COMMAND_MAX: 300, + NAME_MAX_LENGTH: 19, + HEX_BASE: 16 +} as const; + +type ValidationRules = Array<{ + required?: boolean; + message?: string; + [key: string]: unknown; +}>; + +export const createSettingsValidator = (settings: Settings) => { + const schema: Record = {}; + + // Syslog validations + if (settings.syslog_enabled) { + schema.syslog_host = [ + { required: true, message: 'Host is required' }, + IP_OR_HOSTNAME_VALIDATOR + ]; + schema.syslog_port = [ + { required: true, message: 'Port is required' }, + { + type: 'number', + min: VALIDATION_LIMITS.PORT_MIN, + max: VALIDATION_LIMITS.PORT_MAX, + message: 'Invalid Port' + } + ]; + schema.syslog_mark_interval = [ + { required: true, message: 'Mark interval is required' }, + { + type: 'number', + min: VALIDATION_LIMITS.SYSLOG_MARK_INTERVAL_MIN, + max: VALIDATION_LIMITS.SYSLOG_MARK_INTERVAL_MAX, + message: `Must be between ${VALIDATION_LIMITS.SYSLOG_MARK_INTERVAL_MIN} and ${VALIDATION_LIMITS.SYSLOG_MARK_INTERVAL_MAX}` + } + ]; } + + // Modbus validations + if (settings.modbus_enabled) { + schema.modbus_max_clients = [ + { required: true, message: 'Max clients is required' }, + { + type: 'number', + min: VALIDATION_LIMITS.MODBUS_MAX_CLIENTS_MIN, + max: VALIDATION_LIMITS.MODBUS_MAX_CLIENTS_MAX, + message: 'Invalid number' + } + ]; + schema.modbus_port = [ + { required: true, message: 'Port is required' }, + { + type: 'number', + min: VALIDATION_LIMITS.PORT_MIN, + max: VALIDATION_LIMITS.PORT_MAX, + message: 'Invalid Port' + } + ]; + schema.modbus_timeout = [ + { required: true, message: 'Timeout is required' }, + { + type: 'number', + min: VALIDATION_LIMITS.MODBUS_TIMEOUT_MIN, + max: VALIDATION_LIMITS.MODBUS_TIMEOUT_MAX, + message: `Must be between ${VALIDATION_LIMITS.MODBUS_TIMEOUT_MIN} and ${VALIDATION_LIMITS.MODBUS_TIMEOUT_MAX}` + } + ]; + } + + // Shower timer validations + if (settings.shower_timer) { + schema.shower_min_duration = [ + { + type: 'number', + min: VALIDATION_LIMITS.SHOWER_MIN_DURATION_MIN, + max: VALIDATION_LIMITS.SHOWER_MIN_DURATION_MAX, + message: `Time must be between ${VALIDATION_LIMITS.SHOWER_MIN_DURATION_MIN} and ${VALIDATION_LIMITS.SHOWER_MIN_DURATION_MAX} seconds` + } + ]; + } + + // Shower alert validations + if (settings.shower_alert) { + schema.shower_alert_trigger = [ + { + type: 'number', + min: VALIDATION_LIMITS.SHOWER_ALERT_TRIGGER_MIN, + max: VALIDATION_LIMITS.SHOWER_ALERT_TRIGGER_MAX, + message: `Time must be between ${VALIDATION_LIMITS.SHOWER_ALERT_TRIGGER_MIN} and ${VALIDATION_LIMITS.SHOWER_ALERT_TRIGGER_MAX} minutes` + } + ]; + schema.shower_alert_coldshot = [ + { + type: 'number', + min: VALIDATION_LIMITS.SHOWER_ALERT_COLDSHOT_MIN, + max: VALIDATION_LIMITS.SHOWER_ALERT_COLDSHOT_MAX, + message: `Time must be between ${VALIDATION_LIMITS.SHOWER_ALERT_COLDSHOT_MIN} and ${VALIDATION_LIMITS.SHOWER_ALERT_COLDSHOT_MAX} seconds` + } + ]; + } + + // Remote timeout validations + if (settings.remote_timeout_en) { + schema.remote_timeout = [ + { + type: 'number', + min: VALIDATION_LIMITS.REMOTE_TIMEOUT_MIN, + max: VALIDATION_LIMITS.REMOTE_TIMEOUT_MAX, + message: `Timeout must be between ${VALIDATION_LIMITS.REMOTE_TIMEOUT_MIN} and ${VALIDATION_LIMITS.REMOTE_TIMEOUT_MAX} hours` + } + ]; + } + + return new Schema(schema); }; -export const GPIO_VALIDATORR = { +// Generic unique name validator factory +const createUniqueNameValidator = ( + items: T[], + originalName?: string +) => ({ validator( - rule: InternalRuleItem, - value: number, - callback: (error?: string) => void - ) { - if ( - value && - (value === 1 || - (value >= 6 && value <= 11) || - (value >= 16 && value <= 17) || - value === 20 || - value === 24 || - (value >= 28 && value <= 31) || - value > 40 || - value < 0) - ) { - callback('Must be an valid GPIO port'); - } else { - callback(); - } - } -}; - -export const GPIO_VALIDATORC3 = { - validator( - rule: InternalRuleItem, - value: number, - callback: (error?: string) => void - ) { - if (value && ((value >= 11 && value <= 19) || value > 21 || value < 0)) { - callback('Must be an valid GPIO port'); - } else { - callback(); - } - } -}; - -export const GPIO_VALIDATORS2 = { - validator( - rule: InternalRuleItem, - value: number, - callback: (error?: string) => void - ) { - if ( - value && - ((value >= 19 && value <= 20) || - (value >= 22 && value <= 32) || - value > 40 || - value < 0) - ) { - callback('Must be an valid GPIO port'); - } else { - callback(); - } - } -}; - -export const GPIO_VALIDATORS3 = { - validator( - rule: InternalRuleItem, - value: number, - callback: (error?: string) => void - ) { - if ( - value && - ((value >= 19 && value <= 20) || - (value >= 22 && value <= 37) || - (value >= 39 && value <= 42) || - value > 48 || - value < 0) - ) { - callback('Must be an valid GPIO port'); - } else { - callback(); - } - } -}; - -export const createSettingsValidator = (settings: Settings) => - new Schema({ - ...(settings.board_profile === 'CUSTOM' && - settings.platform === 'ESP32' && { - led_gpio: [ - { required: true, message: 'LED GPIO is required' }, - GPIO_VALIDATOR - ], - dallas_gpio: [ - { required: true, message: 'GPIO is required' }, - GPIO_VALIDATOR - ], - pbutton_gpio: [ - { required: true, message: 'Button GPIO is required' }, - GPIO_VALIDATOR - ], - tx_gpio: [ - { required: true, message: 'Tx GPIO is required' }, - GPIO_VALIDATOR - ], - rx_gpio: [{ required: true, message: 'Rx GPIO is required' }, GPIO_VALIDATOR] - }), - ...(settings.board_profile === 'CUSTOM' && - settings.platform === 'ESP32C3' && { - led_gpio: [ - { required: true, message: 'LED GPIO is required' }, - GPIO_VALIDATORC3 - ], - dallas_gpio: [ - { required: true, message: 'GPIO is required' }, - GPIO_VALIDATORC3 - ], - pbutton_gpio: [ - { required: true, message: 'Button GPIO is required' }, - GPIO_VALIDATORC3 - ], - tx_gpio: [ - { required: true, message: 'Tx GPIO is required' }, - GPIO_VALIDATORC3 - ], - rx_gpio: [ - { required: true, message: 'Rx GPIO is required' }, - GPIO_VALIDATORC3 - ] - }), - ...(settings.board_profile === 'CUSTOM' && - settings.platform === 'ESP32S2' && { - led_gpio: [ - { required: true, message: 'LED GPIO is required' }, - GPIO_VALIDATORS2 - ], - dallas_gpio: [ - { required: true, message: 'GPIO is required' }, - GPIO_VALIDATORS2 - ], - pbutton_gpio: [ - { required: true, message: 'Button GPIO is required' }, - GPIO_VALIDATORS2 - ], - tx_gpio: [ - { required: true, message: 'Tx GPIO is required' }, - GPIO_VALIDATORS2 - ], - rx_gpio: [ - { required: true, message: 'Rx GPIO is required' }, - GPIO_VALIDATORS2 - ] - }), - ...(settings.board_profile === 'CUSTOM' && - settings.platform === 'ESP32S3' && { - led_gpio: [ - { required: true, message: 'LED GPIO is required' }, - GPIO_VALIDATORS3 - ], - dallas_gpio: [ - { required: true, message: 'GPIO is required' }, - GPIO_VALIDATORS3 - ], - pbutton_gpio: [ - { required: true, message: 'Button GPIO is required' }, - GPIO_VALIDATORS3 - ], - tx_gpio: [ - { required: true, message: 'Tx GPIO is required' }, - GPIO_VALIDATORS3 - ], - rx_gpio: [ - { required: true, message: 'Rx GPIO is required' }, - GPIO_VALIDATORS3 - ] - }), - ...(settings.syslog_enabled && { - syslog_host: [ - { required: true, message: 'Host is required' }, - IP_OR_HOSTNAME_VALIDATOR - ], - syslog_port: [ - { required: true, message: 'Port is required' }, - { type: 'number', min: 0, max: 65535, message: 'Invalid Port' } - ], - syslog_mark_interval: [ - { required: true, message: 'Mark interval is required' }, - { type: 'number', min: 0, max: 10, message: 'Must be between 0 and 10' } - ] - }), - ...(settings.modbus_enabled && { - modbus_max_clients: [ - { required: true, message: 'Max clients is required' }, - { type: 'number', min: 0, max: 50, message: 'Invalid number' } - ], - modbus_port: [ - { required: true, message: 'Port is required' }, - { type: 'number', min: 0, max: 65535, message: 'Invalid Port' } - ], - modbus_timeout: [ - { required: true, message: 'Timeout is required' }, - { - type: 'number', - min: 100, - max: 20000, - message: 'Must be between 100 and 20000' - } - ] - }), - ...(settings.shower_timer && { - shower_min_duration: [ - { - type: 'number', - min: 10, - max: 360, - message: 'Time must be between 10 and 360 seconds' - } - ] - }), - ...(settings.shower_alert && { - shower_alert_trigger: [ - { - type: 'number', - min: 1, - max: 20, - message: 'Time must be between 1 and 20 minutes' - } - ], - shower_alert_coldshot: [ - { - type: 'number', - min: 1, - max: 10, - message: 'Time must be between 1 and 10 seconds' - } - ] - }), - ...(settings.remote_timeout_en && { - remote_timeout: [ - { - type: 'number', - min: 1, - max: 240, - message: 'Timeout must be between 1 and 240 hours' - } - ] - }) - }); - -export const uniqueNameValidator = (schedule: ScheduleItem[], o_name?: string) => ({ - validator( - rule: InternalRuleItem, + _rule: InternalRuleItem, name: string, callback: (error?: string) => void ) { if ( name !== '' && - (o_name === undefined || o_name.toLowerCase() !== name.toLowerCase()) && - schedule.find((si) => si.name.toLowerCase() === name.toLowerCase()) + (originalName === undefined || + originalName.toLowerCase() !== name.toLowerCase()) && + items.find((item) => item.name.toLowerCase() === name.toLowerCase()) ) { - callback('Name already in use'); - } else { - callback(); + callback(ERROR_MESSAGES.NAME_DUPLICATE); + return; } + callback(); } }); +// Generic field name validator (for cases where the name field has different property names) +const createUniqueFieldNameValidator = ( + items: T[], + getName: (item: T) => string, + originalName?: string +) => ({ + validator( + _rule: InternalRuleItem, + name: string, + callback: (error?: string) => void + ) { + if ( + name !== '' && + (originalName === undefined || + originalName.toLowerCase() !== name.toLowerCase()) && + items.find((item) => getName(item).toLowerCase() === name.toLowerCase()) + ) { + callback(ERROR_MESSAGES.NAME_DUPLICATE); + return; + } + callback(); + } +}); + +const NAME_PATTERN_BASE = '[a-zA-Z0-9_]'; +const NAME_PATTERN_MESSAGE = `Must be <${VALIDATION_LIMITS.NAME_MAX_LENGTH + 1} characters: alphanumeric or '_'`; + +const NAME_PATTERN = { + type: 'string' as const, + pattern: new RegExp( + `^${NAME_PATTERN_BASE}{0,${VALIDATION_LIMITS.NAME_MAX_LENGTH}}$` + ), + message: NAME_PATTERN_MESSAGE +}; + +const NAME_PATTERN_REQUIRED = { + type: 'string' as const, + pattern: new RegExp( + `^${NAME_PATTERN_BASE}{1,${VALIDATION_LIMITS.NAME_MAX_LENGTH}}$` + ), + message: NAME_PATTERN_MESSAGE +}; + +export const uniqueNameValidator = (schedule: ScheduleItem[], o_name?: string) => + createUniqueNameValidator(schedule, o_name); + export const schedulerItemValidation = ( schedule: ScheduleItem[], scheduleItem: ScheduleItem ) => new Schema({ - name: [ - { - type: 'string', - pattern: /^[a-zA-Z0-9_]{0,19}$/, - message: "Must be <20 characters: alphanumeric or '_'" - }, - ...[uniqueNameValidator(schedule, scheduleItem.o_name)] - ], + name: [NAME_PATTERN, uniqueNameValidator(schedule, scheduleItem.o_name)], cmd: [ { required: true, message: 'Command is required' }, { type: 'string', - min: 1, - max: 300, - message: 'Command must be 1-300 characters' + min: VALIDATION_LIMITS.COMMAND_MIN, + max: VALIDATION_LIMITS.COMMAND_MAX, + message: `Command must be ${VALIDATION_LIMITS.COMMAND_MIN}-${VALIDATION_LIMITS.COMMAND_MAX} characters` } ] }); -export const uniqueCustomNameValidator = ( - entity: EntityItem[], - o_name?: string -) => ({ +export const uniqueCustomNameValidator = (entity: EntityItem[], o_name?: string) => + createUniqueNameValidator(entity, o_name); + +const hexValidator = { validator( - rule: InternalRuleItem, - name: string, + _rule: InternalRuleItem, + value: string, callback: (error?: string) => void ) { - if ( - (o_name === undefined || o_name.toLowerCase() !== name.toLowerCase()) && - entity.find((ei) => ei.name.toLowerCase() === name.toLowerCase()) - ) { - callback('Name already in use'); - } else { - callback(); + if (!value || Number.isNaN(Number.parseInt(value, VALIDATION_LIMITS.HEX_BASE))) { + callback(ERROR_MESSAGES.HEX_REQUIRED); + return; } + callback(); } -}); +}; export const entityItemValidation = (entity: EntityItem[], entityItem: EntityItem) => new Schema({ name: [ { required: true, message: 'Name is required' }, - { - type: 'string', - pattern: /^[a-zA-Z0-9_]{1,19}$/, - message: "Must be <20 characters: alphanumeric or '_'" - }, - ...[uniqueCustomNameValidator(entity, entityItem.o_name)] - ], - device_id: [ - { - validator( - rule: InternalRuleItem, - value: string, - callback: (error?: string) => void - ) { - if (isNaN(parseInt(value, 16))) { - callback('Is required and must be in hex format'); - } - callback(); - } - } - ], - type_id: [ - { - validator( - rule: InternalRuleItem, - value: string, - callback: (error?: string) => void - ) { - if (isNaN(parseInt(value, 16))) { - callback('Is required and must be in hex format'); - } - callback(); - } - } + NAME_PATTERN_REQUIRED, + uniqueCustomNameValidator(entity, entityItem.o_name) ], + device_id: [hexValidator], + type_id: [hexValidator], offset: [ { required: true, message: 'Offset is required' }, - { type: 'number', min: 0, max: 255, message: 'Must be between 0 and 255' } + { + type: 'number', + min: VALIDATION_LIMITS.OFFSET_MIN, + max: VALIDATION_LIMITS.OFFSET_MAX, + message: `Must be between ${VALIDATION_LIMITS.OFFSET_MIN} and ${VALIDATION_LIMITS.OFFSET_MAX}` + } ], factor: [{ required: true, message: 'is required' }] }); @@ -388,93 +285,34 @@ export const entityItemValidation = (entity: EntityItem[], entityItem: EntityIte export const uniqueTemperatureNameValidator = ( sensors: TemperatureSensor[], o_name?: string -) => ({ - validator(rule: InternalRuleItem, n: string, callback: (error?: string) => void) { - if ( - (o_name === undefined || o_name.toLowerCase() !== n.toLowerCase()) && - n !== '' && - sensors.find((ts) => ts.n.toLowerCase() === n.toLowerCase()) - ) { - callback('Name already in use'); - } else { - callback(); - } - } -}); +) => createUniqueFieldNameValidator(sensors, (s) => s.n, o_name); export const temperatureSensorItemValidation = ( sensors: TemperatureSensor[], sensor: TemperatureSensor ) => new Schema({ - n: [ - { - type: 'string', - pattern: /^[a-zA-Z0-9_]{0,19}$/, - message: "Must be <20 characters: alphanumeric or '_'" - }, - ...[uniqueTemperatureNameValidator(sensors, sensor.o_n)] - ] + n: [NAME_PATTERN, uniqueTemperatureNameValidator(sensors, sensor.o_n)] }); -export const isGPIOUniqueValidator = (sensors: AnalogSensor[]) => ({ - validator( - rule: InternalRuleItem, - gpio: number, - callback: (error?: string) => void - ) { - if (sensors.find((as) => as.g === gpio)) { - callback('GPIO already in use'); - } else { - callback(); - } - } -}); - export const uniqueAnalogNameValidator = ( sensors: AnalogSensor[], o_name?: string -) => ({ - validator(rule: InternalRuleItem, n: string, callback: (error?: string) => void) { - if ( - (o_name === undefined || o_name.toLowerCase() !== n.toLowerCase()) && - n !== '' && - sensors.find((as) => as.n.toLowerCase() === n.toLowerCase()) - ) { - callback('Name already in use'); - } else { - callback(); - } - } -}); +) => createUniqueFieldNameValidator(sensors, (s) => s.n, o_name); export const analogSensorItemValidation = ( sensors: AnalogSensor[], - sensor: AnalogSensor, - creating: boolean, - platform: string -) => - new Schema({ + sensor: AnalogSensor +) => { + return new Schema({ + // name is required and must be unique n: [ - { - type: 'string', - pattern: /^[a-zA-Z0-9_]{0,19}$/, - message: "Must be <20 characters: alphanumeric or '_'" - }, - ...[uniqueAnalogNameValidator(sensors, sensor.o_n)] - ], - g: [ - { required: true, message: 'GPIO is required' }, - platform === 'ESP32S3' - ? GPIO_VALIDATORS3 - : platform === 'ESP32S2' - ? GPIO_VALIDATORS2 - : platform === 'ESP32C3' - ? GPIO_VALIDATORC3 - : GPIO_VALIDATOR, - ...(creating ? [isGPIOUniqueValidator(sensors)] : []) + { required: true, message: 'Name is required' }, + NAME_PATTERN, + uniqueAnalogNameValidator(sensors, sensor.o_n) ] }); +}; export const deviceValueItemValidation = (dv: DeviceValue) => new Schema({ @@ -482,17 +320,18 @@ export const deviceValueItemValidation = (dv: DeviceValue) => { required: true, message: 'Value is required' }, { validator( - rule: InternalRuleItem, + _rule: InternalRuleItem, value: unknown, callback: (error?: string) => void ) { if ( typeof value === 'number' && - dv.m && - dv.x && + dv.m !== undefined && + dv.x !== undefined && (value < dv.m || value > dv.x) ) { - callback('Value out of range'); + callback(ERROR_MESSAGES.VALUE_OUT_OF_RANGE); + return; } callback(); } diff --git a/interface/src/app/settings/APSettings.tsx b/interface/src/app/settings/APSettings.tsx index 7c9aee614..593d0e45d 100644 --- a/interface/src/app/settings/APSettings.tsx +++ b/interface/src/app/settings/APSettings.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; @@ -27,6 +27,19 @@ export const isAPEnabled = ({ provision_mode }: APSettingsType) => provision_mode === APProvisionMode.AP_MODE_ALWAYS || provision_mode === APProvisionMode.AP_MODE_DISCONNECTED; +// Efficient range function without recursion +const createRange = (start: number, end: number): number[] => { + const result: number[] = []; + for (let i = start; i <= end; i++) { + result.push(i); + } + return result; +}; + +// Pre-computed ranges for better performance +const CHANNEL_RANGE = createRange(1, 14); +const MAX_CLIENTS_RANGE = createRange(1, 9); + const APSettings = () => { const { loadData, @@ -50,37 +63,42 @@ const APSettings = () => { const [fieldErrors, setFieldErrors] = useState(); - const updateFormValue = updateValueDirty( - origData, - dirtyFlags, - setDirtyFlags, - updateDataValue + const updateFormValue = useMemo( + () => + updateValueDirty( + origData as unknown as Record, + dirtyFlags, + setDirtyFlags, + updateDataValue as (value: unknown) => void + ), + [origData, dirtyFlags, setDirtyFlags, updateDataValue] ); + // Memoize AP enabled state + const apEnabled = useMemo(() => (data ? isAPEnabled(data) : false), [data]); + + // Memoize validation and submit handler + const validateAndSubmit = useCallback(async () => { + if (!data) return; + + try { + setFieldErrors(undefined); + await validate(createAPSettingsValidator(data), data); + await saveData(); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); + } + }, [data, saveData]); + const content = () => { if (!data) { - return ; - } - - const validateAndSubmit = async () => { - try { - setFieldErrors(undefined); - await validate(createAPSettingsValidator(data), data); - await saveData(); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } - }; - - // no lodash - https://asleepace.com/blog/typescript-range-without-a-loop/ - function range(a: number, b: number): number[] { - return a < b ? [a, ...range(a + 1, b)] : [b]; + return ; } return ( <> { {LL.AP_PROVIDE_TEXT_3()} - {isAPEnabled(data) && ( + {apEnabled && ( <> { margin="normal" /> { margin="normal" /> { onChange={updateFormValue} margin="normal" > - {range(1, 14).map((i) => ( + {CHANNEL_RANGE.map((i) => ( {i} @@ -151,7 +169,7 @@ const APSettings = () => { label={LL.AP_HIDE_SSID()} /> { onChange={updateFormValue} margin="normal" > - {range(1, 9).map((i) => ( + {MAX_CLIENTS_RANGE.map((i) => ( {i} ))} { margin="normal" /> { margin="normal" /> ( - {BOARD_PROFILES[code]} + {BOARD_PROFILES[code as BoardProfileKey]} )); } @@ -72,10 +72,10 @@ const ApplicationSettings = () => { const { LL } = useI18nContext(); const updateFormValue = updateValueDirty( - origData, + origData as unknown as Record, dirtyFlags, setDirtyFlags, - updateDataValue + updateDataValue as (value: unknown) => void ); const [fieldErrors, setFieldErrors] = useState(); @@ -106,50 +106,61 @@ const ApplicationSettings = () => { }); }); - const doRestart = async () => { + // Memoized input props to prevent recreation on every render + const SecondsInputProps = useMemo( + () => ({ + endAdornment: {LL.SECONDS()} + }), + [LL] + ); + + const MinutesInputProps = useMemo( + () => ({ + endAdornment: {LL.MINUTES()} + }), + [LL] + ); + + const HoursInputProps = useMemo( + () => ({ + endAdornment: {LL.HOURS()} + }), + [LL] + ); + + const doRestart = useCallback(async () => { setRestarting(true); await sendAPI({ device: 'system', cmd: 'restart', id: 0 }).catch( (error: Error) => { toast.error(error.message); } ); - }; + }, [sendAPI]); - const updateBoardProfile = async (board_profile: string) => { - await readBoardProfile(board_profile).catch((error: Error) => { - toast.error(error.message); - }); - }; + const updateBoardProfile = useCallback( + async (board_profile: string) => { + await readBoardProfile(board_profile).catch((error: Error) => { + toast.error(error.message); + }); + }, + [readBoardProfile] + ); useLayoutTitle(LL.APPLICATION()); - const SecondsInputProps = { - endAdornment: {LL.SECONDS()} - }; - const MinutesInputProps = { - endAdornment: {LL.MINUTES()} - }; - const HoursInputProps = { - endAdornment: {LL.HOURS()} - }; - - const content = () => { - if (!data || !hardwareData) { - return ; + const validateAndSubmit = useCallback(async () => { + try { + setFieldErrors(undefined); + await validate(createSettingsValidator(data), data); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); + } finally { + await saveData(); } + }, [data, saveData]); - const validateAndSubmit = async () => { - try { - setFieldErrors(undefined); - await validate(createSettingsValidator(data), data); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } finally { - await saveData(); - } - }; - - const changeBoardProfile = (event: React.ChangeEvent) => { + const changeBoardProfile = useCallback( + (event: React.ChangeEvent) => { const boardProfile = event.target.value; updateFormValue(event); if (boardProfile === 'CUSTOM') { @@ -160,12 +171,22 @@ const ApplicationSettings = () => { } else { void updateBoardProfile(boardProfile); } - }; + }, + [data, updateBoardProfile, updateFormValue, updateDataValue] + ); - const restart = async () => { - await validateAndSubmit(); - await doRestart(); - }; + const restart = useCallback(async () => { + await validateAndSubmit(); + await doRestart(); + }, [validateAndSubmit, doRestart]); + + // Memoize board profile select items to prevent recreation + const boardProfileItems = useMemo(() => boardProfileSelectItems(), []); + + const content = () => { + if (!data || !hardwareData) { + return ; + } return ( <> @@ -219,7 +240,7 @@ const ApplicationSettings = () => { { { { { { > OFF ERR + WARN NOTICE INFO - DEBUG ALL { margin="normal" select > - {boardProfileSelectItems()} + {boardProfileItems} {LL.CUSTOM()}… @@ -485,7 +506,7 @@ const ApplicationSettings = () => { { { { { { { {LL.DISABLED(1)} LAN8720 TLK110 + RTL8201 @@ -743,7 +765,7 @@ const ApplicationSettings = () => { {data.remote_timeout_en && ( { {data.shower_timer && ( { <> { { {restartNeeded && ( - + + const gridButtons = downloadButtons.filter((btn) => btn.isGridButton); + const standaloneButton = downloadButtons.find((btn) => !btn.isGridButton); - - - - + return ( + + + {LL.DOWNLOAD(0)} + + + + {LL.DOWNLOAD_SETTINGS_TEXT()}. + + + + {gridButtons.map((button) => ( + + + + ))} + + + + {LL.DOWNLOAD_SETTINGS_TEXT2()}. + + + {standaloneButton && ( + )} - - {LL.UPLOAD()} - + + {LL.UPLOAD()} + - - {LL.UPLOAD_TEXT()}. - + + {LL.UPLOAD_TEXT()}. + - - - ); - }; - - return ( - {restarting ? : content()} + + ); }; diff --git a/interface/src/app/settings/MqttSettings.tsx b/interface/src/app/settings/MqttSettings.tsx index a03f139b9..2d02f94b3 100644 --- a/interface/src/app/settings/MqttSettings.tsx +++ b/interface/src/app/settings/MqttSettings.tsx @@ -1,11 +1,14 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; +import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; +import SettingsBackupRestoreIcon from '@mui/icons-material/SettingsBackupRestore'; import WarningIcon from '@mui/icons-material/Warning'; import { + Box, Button, Checkbox, - Grid2 as Grid, + Grid, InputAdornment, MenuItem, TextField, @@ -30,6 +33,8 @@ import type { MqttSettingsType } from 'types'; import { numberValue, updateValueDirty, useRest } from 'utils'; import { createMqttSettingsValidator, validate } from 'validators'; +import { callAction } from '../../api/app'; + const MqttSettings = () => { const { loadData, @@ -52,48 +57,104 @@ const MqttSettings = () => { const [fieldErrors, setFieldErrors] = useState(); - const updateFormValue = updateValueDirty( - origData, - dirtyFlags, - setDirtyFlags, - updateDataValue + const sendResetMQTT = useCallback(() => { + void callAction({ action: 'resetMQTT' }) + .then(() => { + toast.success('MQTT ' + LL.REFRESH() + ' successful'); + }) + .catch((error) => { + toast.error(String(error.error?.message || 'An error occurred')); + }); + }, []); + + const updateFormValue = useMemo( + () => + updateValueDirty( + origData as unknown as Record, + dirtyFlags, + setDirtyFlags, + updateDataValue as (value: unknown) => void + ), + [origData, dirtyFlags, setDirtyFlags, updateDataValue] ); - const SecondsInputProps = { - endAdornment: {LL.SECONDS()} - }; + const SecondsInputProps = useMemo( + () => ({ + endAdornment: {LL.SECONDS()} + }), + [LL] + ); - const content = () => { - if (!data) { - return ; + const emptyFieldErrors = useMemo(() => ({}), []); + + const validateAndSubmit = useCallback(async () => { + if (!data) return; + try { + setFieldErrors(undefined); + await validate(createMqttSettingsValidator(data), data); + await saveData(); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); } + }, [data, saveData]); - const validateAndSubmit = async () => { - try { - setFieldErrors(undefined); - await validate(createMqttSettingsValidator(data), data); - await saveData(); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } - }; + const publishIntervalFields = useMemo( + () => [ + { name: 'publish_time_heartbeat', label: 'Heartbeat', validated: true }, + { name: 'publish_time_boiler', label: LL.MQTT_INT_BOILER(), validated: false }, + { + name: 'publish_time_thermostat', + label: LL.MQTT_INT_THERMOSTATS(), + validated: false + }, + { name: 'publish_time_solar', label: LL.MQTT_INT_SOLAR(), validated: false }, + { name: 'publish_time_mixer', label: LL.MQTT_INT_MIXER(), validated: false }, + { name: 'publish_time_water', label: LL.MQTT_INT_WATER(), validated: false }, + { name: 'publish_time_sensor', label: LL.SENSORS(), validated: false }, + { name: 'publish_time_other', label: LL.DEFAULT(0), validated: false } + ], + [LL] + ); + if (!data) { return ( + + {blocker ? : null} + + + ); + } + + return ( + + {blocker ? : null} <> - - } - label={LL.ENABLE_MQTT()} - /> + + + } + label={LL.ENABLE_MQTT()} + /> + {data.enabled && ( + + )} + { { { { { label={LL.CERT()} variant="outlined" value={data.rootCA} + sx={{ width: '50ch' }} onChange={updateFormValue} margin="normal" /> @@ -254,219 +316,144 @@ const MqttSettings = () => { } label={LL.MQTT_RESPONSE()} /> - {!data.ha_enabled && ( - + + + + } + label={LL.MQTT_PUBLISH_TEXT_1()} + /> + + {data.publish_single && ( } - label={LL.MQTT_PUBLISH_TEXT_1()} + label={LL.MQTT_PUBLISH_TEXT_2()} /> - {data.publish_single && ( + )} + + + + + } + label={LL.MQTT_PUBLISH_TEXT_3()} + /> + + {data.ha_enabled && ( + - - } - label={LL.MQTT_PUBLISH_TEXT_2()} + + Home Assistant + Domoticz + Domoticz (latest) + + + + - )} - - )} - {!data.publish_single && ( - - - - } - label={LL.MQTT_PUBLISH_TEXT_3()} - /> - - {data.ha_enabled && ( - - - - Home Assistant - Domoticz - Domoticz (latest) - - - - - - - - {LL.MQTT_ENTITY_FORMAT_0()} - - {LL.MQTT_ENTITY_FORMAT_1()} (v3.6) - - - {LL.MQTT_ENTITY_FORMAT_2()} (v3.6) - - {LL.MQTT_ENTITY_FORMAT_1()} - {LL.MQTT_ENTITY_FORMAT_2()} - - + + + {LL.MQTT_ENTITY_FORMAT_0()} + + {LL.MQTT_ENTITY_FORMAT_1()} (v3.5) + + + {LL.MQTT_ENTITY_FORMAT_2()} (v3.5) + + + {LL.MQTT_ENTITY_FORMAT_1()} (latest) + + + {LL.MQTT_ENTITY_FORMAT_2()} (latest) + + - )} - - )} + + )} + {LL.MQTT_PUBLISH_INTERVALS()} (0=auto) - - - - - - - - - - - - - - - - - - - - - - - - + {publishIntervalFields.map((field) => ( + + {field.validated ? ( + + ) : ( + + )} + + ))} {dirtyFlags && dirtyFlags.length !== 0 && ( @@ -493,13 +480,6 @@ const MqttSettings = () => { )} - ); - }; - - return ( - - {blocker ? : null} - {content()} ); }; diff --git a/interface/src/app/settings/NTPSettings.tsx b/interface/src/app/settings/NTPSettings.tsx index cf42b5e19..6b79b32ce 100644 --- a/interface/src/app/settings/NTPSettings.tsx +++ b/interface/src/app/settings/NTPSettings.tsx @@ -1,12 +1,27 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; +import { toast } from 'react-toastify'; +import AccessTimeIcon from '@mui/icons-material/AccessTime'; import CancelIcon from '@mui/icons-material/Cancel'; import WarningIcon from '@mui/icons-material/Warning'; -import { Button, Checkbox, MenuItem } from '@mui/material'; +import { + Box, + Button, + Checkbox, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + MenuItem, + TextField, + Typography +} from '@mui/material'; import * as NTPApi from 'api/ntp'; import { readNTPSettings } from 'api/ntp'; +import { dialogStyle } from 'CustomTheme'; +import { useRequest } from 'alova/client'; import { updateState } from 'alova/client'; import type { ValidateFieldsError } from 'async-validator'; import { @@ -19,12 +34,12 @@ import { useLayoutTitle } from 'components'; import { useI18nContext } from 'i18n/i18n-react'; -import type { NTPSettingsType } from 'types'; -import { updateValueDirty, useRest } from 'utils'; +import type { NTPSettingsType, Time } from 'types'; +import { formatLocalDateTime, updateValueDirty, useRest } from 'utils'; import { validate } from 'validators'; import { NTP_SETTINGS_VALIDATOR } from 'validators/ntp'; -import { TIME_ZONES, selectedTimeZone, timeZoneSelectItems } from './TZ'; +import { TIME_ZONES, selectedTimeZone, useTimeZoneSelectItems } from './TZ'; const NTPSettings = () => { const { @@ -46,38 +61,100 @@ const NTPSettings = () => { const { LL } = useI18nContext(); useLayoutTitle('NTP'); - const updateFormValue = updateValueDirty( - origData, - dirtyFlags, - setDirtyFlags, - updateDataValue + // Memoized timezone select items for better performance + const timeZoneItems = useTimeZoneSelectItems(); + + // Memoized selected timezone value + const selectedTzValue = useMemo( + () => (data ? selectedTimeZone(data.tz_label, data.tz_format) : undefined), + [data?.tz_label, data?.tz_format] ); + const [localTime, setLocalTime] = useState(''); + const [settingTime, setSettingTime] = useState(false); + const [processing, setProcessing] = useState(false); const [fieldErrors, setFieldErrors] = useState(); - const content = () => { - if (!data) { - return ; + const { send: updateTime } = useRequest( + (local_time: Time) => NTPApi.updateTime(local_time), + { + immediate: false } + ); - const validateAndSubmit = async () => { - try { - setFieldErrors(undefined); - await validate(NTP_SETTINGS_VALIDATOR, data); - await saveData(); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } - }; + // Memoize updateFormValue to prevent recreation on every render + const updateFormValue = useMemo( + () => + updateValueDirty( + origData as unknown as Record, + dirtyFlags, + setDirtyFlags, + updateDataValue as (value: unknown) => void + ), + [origData, dirtyFlags, setDirtyFlags, updateDataValue] + ); - const changeTimeZone = (event: React.ChangeEvent) => { + // Memoize updateLocalTime handler + const updateLocalTime = useCallback( + (event: React.ChangeEvent) => setLocalTime(event.target.value), + [] + ); + + // Memoize openSetTime handler + const openSetTime = useCallback(() => { + setLocalTime(formatLocalDateTime(new Date())); + setSettingTime(true); + }, []); + + // Memoize configureTime handler + const configureTime = useCallback(async () => { + setProcessing(true); + + try { + await updateTime({ local_time: formatLocalDateTime(new Date(localTime)) }); + toast.success(LL.TIME_SET()); + setSettingTime(false); + await loadData(); + } catch { + toast.error(LL.PROBLEM_UPDATING()); + } finally { + setProcessing(false); + } + }, [localTime, updateTime, LL, loadData]); + + // Memoize close dialog handler + const handleCloseSetTime = useCallback(() => setSettingTime(false), []); + + // Memoize validate and submit handler + const validateAndSubmit = useCallback(async () => { + if (!data) return; + try { + setFieldErrors(undefined); + await validate(NTP_SETTINGS_VALIDATOR, data); + await saveData(); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); + } + }, [data, saveData]); + + // Memoize timezone change handler + const changeTimeZone = useCallback( + (event: React.ChangeEvent) => { void updateState(readNTPSettings(), (settings: NTPSettingsType) => ({ ...settings, tz_label: event.target.value, tz_format: TIME_ZONES[event.target.value] })); updateFormValue(event); - }; + }, + [updateFormValue] + ); + + // Memoize render content to prevent unnecessary re-renders + const renderContent = useMemo(() => { + if (!data) { + return ; + } return ( <> @@ -92,7 +169,7 @@ const NTPSettings = () => { label={LL.ENABLE_NTP()} /> { margin="normal" /> {LL.TIME_ZONE()}... - {timeZoneSelectItems()} + {timeZoneItems} + + + {!data.enabled && !dirtyFlags.length && ( + + + + + + )} + + {dirtyFlags && dirtyFlags.length !== 0 && ( + + + ); }; diff --git a/interface/src/app/settings/Settings.tsx b/interface/src/app/settings/Settings.tsx index 34abc2554..608c37ee9 100644 --- a/interface/src/app/settings/Settings.tsx +++ b/interface/src/app/settings/Settings.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -17,6 +17,7 @@ import { DialogActions, DialogContent, DialogTitle, + Divider, List } from '@mui/material'; @@ -29,134 +30,159 @@ import { SectionContent, useLayoutTitle } from 'components'; import ListMenuItem from 'components/layout/ListMenuItem'; import { useI18nContext } from 'i18n/i18n-react'; +import SystemMonitor from '../status/SystemMonitor'; + const Settings = () => { const { LL } = useI18nContext(); useLayoutTitle(LL.SETTINGS(0)); - const [confirmFactoryReset, setConfirmFactoryReset] = useState(false); + const [confirmFactoryReset, setConfirmFactoryReset] = useState(false); + const [restarting, setRestarting] = useState(); const { send: sendAPI } = useRequest((data: APIcall) => API(data), { immediate: false }); - const doFormat = async () => { + const doFormat = useCallback(async () => { await sendAPI({ device: 'system', cmd: 'format', id: 0 }).then(() => { + setRestarting(true); setConfirmFactoryReset(false); }); - }; + }, [sendAPI]); - const renderFactoryResetDialog = () => ( - setConfirmFactoryReset(false)} - > - {LL.FACTORY_RESET()} - {LL.SYSTEM_FACTORY_TEXT_DIALOG()} - - - + + + + + + + - {LL.FACTORY_RESET()} - - - - ); + + + + ); + }, [ + LL, + handleFactoryResetClick, + handleFactoryResetClose, + doFormat, + confirmFactoryReset, + restarting + ]); - const content = () => ( - <> - - - - - - - - - - - - - - - - - - - {renderFactoryResetDialog()} - - - - - - ); - - return {content()}; + return {restarting ? : content}; }; export default Settings; diff --git a/interface/src/app/settings/TZ.tsx b/interface/src/app/settings/TZ.tsx index 3b3954852..c734f1809 100644 --- a/interface/src/app/settings/TZ.tsx +++ b/interface/src/app/settings/TZ.tsx @@ -1,8 +1,8 @@ +import { useMemo } from 'react'; + import { MenuItem } from '@mui/material'; -type TimeZones = Record; - -export const TIME_ZONES: TimeZones = { +export const TIME_ZONES: Record = { 'Africa/Abidjan': 'GMT0', 'Africa/Accra': 'GMT0', 'Africa/Addis_Ababa': 'EAT-3', @@ -465,14 +465,33 @@ export const TIME_ZONES: TimeZones = { 'Pacific/Wallis': 'UNK-12' }; +// Pre-compute sorted timezone labels for better performance +export const TIME_ZONE_LABELS = Object.keys(TIME_ZONES).sort(); + export function selectedTimeZone(label: string, format: string) { return TIME_ZONES[label] === format ? label : undefined; } -export function timeZoneSelectItems() { - return Object.keys(TIME_ZONES).map((label) => ( - - {label} - - )); +// Memoized version for use in components +export function useTimeZoneSelectItems() { + return useMemo( + () => + TIME_ZONE_LABELS.map((label) => ( + + {label} + + )), + [] + ); +} + +// Fallback export for backward compatibility - now memoized +const precomputedTimeZoneItems = TIME_ZONE_LABELS.map((label) => ( + + {label} + +)); + +export function timeZoneSelectItems() { + return precomputedTimeZoneItems; } diff --git a/interface/src/app/settings/network/Network.tsx b/interface/src/app/settings/network/Network.tsx index c847273a4..300010e3f 100644 --- a/interface/src/app/settings/network/Network.tsx +++ b/interface/src/app/settings/network/Network.tsx @@ -1,4 +1,4 @@ -import { useCallback, useState } from 'react'; +import { memo, useCallback, useMemo, useState } from 'react'; import { Navigate, Route, @@ -28,14 +28,13 @@ const Network = () => { [ { path: '/settings/network/settings', - element: , - dog: 'woof' + element: }, { path: '/settings/network/scan', element: } ], useLocation() ); - const routerTab = matchedRoutes?.[0].route.path || false; + const routerTab = matchedRoutes?.[0]?.route.path || false; const navigate = useNavigate(); @@ -53,14 +52,17 @@ const Network = () => { setSelectedNetwork(undefined); }, []); + const contextValue = useMemo( + () => ({ + ...(selectedNetwork && { selectedNetwork }), + selectNetwork, + deselectNetwork + }), + [selectedNetwork, selectNetwork, deselectNetwork] + ); + return ( - + { ); }; -export default Network; +export default memo(Network); diff --git a/interface/src/app/settings/network/NetworkSettings.tsx b/interface/src/app/settings/network/NetworkSettings.tsx index 65283817d..5f525a992 100644 --- a/interface/src/app/settings/network/NetworkSettings.tsx +++ b/interface/src/app/settings/network/NetworkSettings.tsx @@ -1,4 +1,4 @@ -import { useContext, useEffect, useState } from 'react'; +import { memo, useCallback, useContext, useEffect, useState } from 'react'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; @@ -104,43 +104,42 @@ const NetworkSettings = () => { origData, dirtyFlags, setDirtyFlags, - updateDataValue + updateDataValue as (value: unknown) => void ); const [fieldErrors, setFieldErrors] = useState(); - useEffect(() => deselectNetwork, [deselectNetwork]); + const validateAndSubmit = useCallback(async () => { + if (!data) return; + try { + setFieldErrors(undefined); + await validate(createNetworkSettingsValidator(data), data); + await saveData(); + } catch (error) { + setFieldErrors(error as ValidateFieldsError); + } + deselectNetwork(); + }, [data, saveData, deselectNetwork]); + + const setCancel = useCallback(async () => { + deselectNetwork(); + await loadData(); + }, [deselectNetwork, loadData]); + + const doRestart = useCallback(async () => { + setRestarting(true); + await sendAPI({ device: 'system', cmd: 'restart', id: 0 }).catch( + (error: Error) => { + toast.error(error.message); + } + ); + }, [sendAPI]); const content = () => { if (!data) { - return ; + return ; } - const validateAndSubmit = async () => { - try { - setFieldErrors(undefined); - await validate(createNetworkSettingsValidator(data), data); - await saveData(); - } catch (error) { - setFieldErrors(error as ValidateFieldsError); - } - deselectNetwork(); - }; - - const setCancel = async () => { - deselectNetwork(); - await loadData(); - }; - - const doRestart = async () => { - setRestarting(true); - await sendAPI({ device: 'system', cmd: 'restart', id: 0 }).catch( - (error: Error) => { - toast.error(error.message); - } - ); - }; - return ( <> @@ -165,14 +164,14 @@ const NetworkSettings = () => { selectedNetwork.bssid } /> - + ) : ( { /> )} { /> {(!selectedNetwork || !isNetworkOpen(selectedNetwork)) && ( { {LL.GENERAL_OPTIONS()} { {data.static_ip_config && ( <> { margin="normal" /> { margin="normal" /> { margin="normal" /> { margin="normal" /> { )} {restartNeeded && ( - + - - - - ); - - const content = () => { + const content = useMemo(() => { if (!data) { - return ; + return ; } return ( - <> - - - - - - - - - - - {isNtpEnabled(data) && ( - <> - - - - - - - - - - - )} - - - - - - - - - - - - - - - - - - - - - {data && !isNtpActive(data) && ( - - - - - - )} - - {renderSetTimeDialog()} - + + + + + + + + + + + {isNtpEnabled(data) && ( + <> + + + + + + + + + + + )} + + + + + + + + + + + + + + + + + + + ); - }; + }, [data, error, loadData, LL, theme]); - return {content()}; + return {content}; }; export default NTPStatus; diff --git a/interface/src/app/status/NetworkStatus.tsx b/interface/src/app/status/NetworkStatus.tsx index 7185a947b..6172c8186 100644 --- a/interface/src/app/status/NetworkStatus.tsx +++ b/interface/src/app/status/NetworkStatus.tsx @@ -1,3 +1,5 @@ +import { useMemo } from 'react'; + import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import DnsIcon from '@mui/icons-material/Dns'; import GiteIcon from '@mui/icons-material/Gite'; @@ -25,10 +27,17 @@ import type { NetworkStatusType } from 'types'; import { NetworkConnectionStatus } from 'types'; import { useInterval } from 'utils'; +// Utility functions const isConnected = ({ status }: NetworkStatusType) => status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED || status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED; +export const isWiFi = ({ status }: NetworkStatusType) => + status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED; + +export const isEthernet = ({ status }: NetworkStatusType) => + status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED; + const networkStatusHighlight = ({ status }: NetworkStatusType, theme: Theme) => { switch (status) { case NetworkConnectionStatus.WIFI_STATUS_IDLE: @@ -55,11 +64,6 @@ const networkQualityHighlight = ({ rssi }: NetworkStatusType, theme: Theme) => { return theme.palette.success.main; }; -export const isWiFi = ({ status }: NetworkStatusType) => - status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED; -export const isEthernet = ({ status }: NetworkStatusType) => - status === NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED; - const dnsServers = ({ dns_ip_1, dns_ip_2 }: NetworkStatusType) => { if (!dns_ip_1) { return 'none'; @@ -81,6 +85,33 @@ const IPs = (status: NetworkStatusType) => { return status.local_ip + ', ' + status.local_ipv6; }; +const getNetworkStatusText = ( + status: NetworkConnectionStatus, + reconnectCount: number, + LL: ReturnType['LL'] +) => { + switch (status) { + case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: + return LL.CONNECTED(0) + ' (Ethernet)'; + case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: + return LL.INACTIVE(1); + case NetworkConnectionStatus.WIFI_STATUS_IDLE: + return LL.IDLE(); + case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL: + return 'No SSID Available'; + case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: + return LL.CONNECTED(0) + ' (WiFi) (' + reconnectCount + ')'; + case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: + return LL.CONNECTED(1) + ' ' + LL.FAILED(0) + ' (' + reconnectCount + ')'; + case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: + return LL.CONNECTED(1) + ' ' + LL.LOST() + ' (' + reconnectCount + ')'; + case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: + return LL.DISCONNECTED(); + default: + return LL.UNKNOWN(); + } +}; + const NetworkStatus = () => { const { data, send: loadData, error } = useRequest(NetworkApi.readNetworkStatus); @@ -93,51 +124,30 @@ const NetworkStatus = () => { const theme = useTheme(); - const networkStatus = ({ status }: NetworkStatusType) => { - switch (status) { - case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: - return LL.CONNECTED(0) + ' (Ethernet)'; - case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: - return LL.INACTIVE(1); - case NetworkConnectionStatus.WIFI_STATUS_IDLE: - return LL.IDLE(); - case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL: - return 'No SSID Available'; - case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: - return LL.CONNECTED(0) + ' (WiFi) (' + data.reconnect_count + ')'; - case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: - return ( - LL.CONNECTED(1) + ' ' + LL.FAILED(0) + ' (' + data.reconnect_count + ')' - ); - case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: - return LL.CONNECTED(1) + ' ' + LL.LOST() + ' (' + data.reconnect_count + ')'; - case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: - return LL.DISCONNECTED(); - default: - return LL.UNKNOWN(); - } - }; - - const content = () => { + const content = useMemo(() => { if (!data) { - return ; + return ; } + const statusText = getNetworkStatusText(data.status, data.reconnect_count, LL); + const statusColor = networkStatusHighlight(data, theme); + const qualityColor = networkQualityHighlight(data, theme); + return ( - + {isWiFi(data) && } {isEthernet(data) && } - + - + @@ -148,13 +158,13 @@ const NetworkStatus = () => { <> - + @@ -218,9 +228,9 @@ const NetworkStatus = () => { )} ); - }; + }, [data, error, loadData, LL, theme]); - return {content()}; + return {content}; }; export default NetworkStatus; diff --git a/interface/src/app/status/Status.tsx b/interface/src/app/status/Status.tsx index 1b0836901..be5427785 100644 --- a/interface/src/app/status/Status.tsx +++ b/interface/src/app/status/Status.tsx @@ -1,4 +1,4 @@ -import { useContext, useState } from 'react'; +import { useCallback, useContext, useMemo, useState } from 'react'; import { toast } from 'react-toastify'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; @@ -8,10 +8,10 @@ import DeviceHubIcon from '@mui/icons-material/DeviceHub'; import DirectionsBusIcon from '@mui/icons-material/DirectionsBus'; import LogoDevIcon from '@mui/icons-material/LogoDev'; import MemoryIcon from '@mui/icons-material/Memory'; +import MonitorHeartIcon from '@mui/icons-material/MonitorHeart'; import PowerSettingsNewIcon from '@mui/icons-material/PowerSettingsNew'; import RouterIcon from '@mui/icons-material/Router'; import SettingsInputAntennaIcon from '@mui/icons-material/SettingsInputAntenna'; -import TimerIcon from '@mui/icons-material/Timer'; import WifiIcon from '@mui/icons-material/Wifi'; import { Avatar, @@ -37,12 +37,34 @@ import { FormLoader, SectionContent, useLayoutTitle } from 'components'; import ListMenuItem from 'components/layout/ListMenuItem'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; -import { NTPSyncStatus, NetworkConnectionStatus } from 'types'; +import { NTPSyncStatus, NetworkConnectionStatus, SystemStatusCodes } from 'types'; import { useInterval } from 'utils'; import { formatDateTime } from 'utils/time'; import SystemMonitor from './SystemMonitor'; +// Pure functions moved outside component to avoid recreation on each render +const formatNumber = (num: number) => new Intl.NumberFormat().format(num); + +const formatDurationSec = ( + duration_sec: number, + LL: ReturnType['LL'] +) => { + const ms = duration_sec * 1000; + const days = Math.trunc(ms / 86400000); + const hours = Math.trunc(ms / 3600000) % 24; + const minutes = Math.trunc(ms / 60000) % 60; + const seconds = Math.trunc(ms / 1000) % 60; + + const parts: string[] = []; + if (days) parts.push(LL.NUM_DAYS({ num: days })); + if (hours) parts.push(LL.NUM_HOURS({ num: hours })); + if (minutes) parts.push(LL.NUM_MINUTES({ num: minutes })); + parts.push(LL.NUM_SECONDS({ num: seconds })); + + return parts.join(' '); +}; + const SystemStatus = () => { const { LL } = useI18nContext(); @@ -62,7 +84,6 @@ const SystemStatus = () => { send: loadData, error } = useRequest(readSystemStatus, { - initialData: [], async middleware(_, next) { if (!restarting) { await next(); @@ -76,51 +97,46 @@ const SystemStatus = () => { const theme = useTheme(); - const formatDurationSec = (duration_sec: number) => { - const days = Math.trunc((duration_sec * 1000) / 86400000); - const hours = Math.trunc((duration_sec * 1000) / 3600000) % 24; - const minutes = Math.trunc((duration_sec * 1000) / 60000) % 60; - const seconds = Math.trunc((duration_sec * 1000) / 1000) % 60; + // Memoize derived status values to avoid recalculation on every render + const busStatus = useMemo(() => { + if (!data) return 'EMS state unknown'; - let formatted = ''; - if (days) { - formatted += LL.NUM_DAYS({ num: days }) + ' '; + switch (data.bus_status) { + case busConnectionStatus.BUS_STATUS_CONNECTED: + return `EMS ${LL.CONNECTED(0)} (${formatDurationSec(data.bus_uptime, LL)})`; + case busConnectionStatus.BUS_STATUS_TX_ERRORS: + return 'EMS ' + LL.TX_ISSUES(); + case busConnectionStatus.BUS_STATUS_OFFLINE: + return 'EMS ' + LL.DISCONNECTED(); + default: + return 'EMS state unknown'; } - if (hours) { - formatted += LL.NUM_HOURS({ num: hours }) + ' '; - } - if (minutes) { - formatted += LL.NUM_MINUTES({ num: minutes }) + ' '; - } - formatted += LL.NUM_SECONDS({ num: seconds }); - return formatted; - }; + }, [data?.bus_status, data?.bus_uptime, LL]); - function formatNumber(num: number) { - return new Intl.NumberFormat().format(num); - } + // Memoize derived status values to avoid recalculation on every render + const systemStatus = useMemo(() => { + if (!data) return '??'; - const busStatus = () => { - if (data) { - switch (data.bus_status) { - case busConnectionStatus.BUS_STATUS_CONNECTED: - return ( - 'EMS ' + - LL.CONNECTED(0) + - ' (' + - formatDurationSec(data.bus_uptime) + - ')' - ); - case busConnectionStatus.BUS_STATUS_TX_ERRORS: - return 'EMS ' + LL.TX_ISSUES(); - case busConnectionStatus.BUS_STATUS_OFFLINE: - return 'EMS ' + LL.DISCONNECTED(); - } + switch (data.status) { + case SystemStatusCodes.SYSTEM_STATUS_PENDING_UPLOAD: + case SystemStatusCodes.SYSTEM_STATUS_UPLOADING: + return LL.WAIT_FIRMWARE(); + case SystemStatusCodes.SYSTEM_STATUS_ERROR_UPLOAD: + return LL.ERROR(); + case SystemStatusCodes.SYSTEM_STATUS_PENDING_RESTART: + case SystemStatusCodes.SYSTEM_STATUS_RESTART_REQUESTED: + return LL.RESTARTING_PRE(); + case SystemStatusCodes.SYSTEM_STATUS_INVALID_GPIO: + return LL.GPIO_OF(LL.FAILED(0)); + default: + // SystemStatusCodes.SYSTEM_STATUS_NORMAL + return 'OK'; } - return 'EMS state unknown'; - }; + }, [data?.status, LL]); + + const busStatusHighlight = useMemo(() => { + if (!data) return theme.palette.warning.main; - const busStatusHighlight = () => { switch (data.bus_status) { case busConnectionStatus.BUS_STATUS_TX_ERRORS: return theme.palette.warning.main; @@ -131,27 +147,28 @@ const SystemStatus = () => { default: return theme.palette.warning.main; } - }; + }, [data?.bus_status, theme.palette]); + + const ntpStatus = useMemo(() => { + if (!data) return LL.UNKNOWN(); - const ntpStatus = () => { switch (data.ntp_status) { case NTPSyncStatus.NTP_DISABLED: return LL.NOT_ENABLED(); case NTPSyncStatus.NTP_INACTIVE: return LL.INACTIVE(0); case NTPSyncStatus.NTP_ACTIVE: - return ( - LL.ACTIVE() + - (data.ntp_time !== undefined - ? ' (' + formatDateTime(data.ntp_time) + ')' - : '') - ); + return data.ntp_time + ? `${LL.ACTIVE()} (${formatDateTime(data.ntp_time)})` + : LL.ACTIVE(); default: return LL.UNKNOWN(); } - }; + }, [data?.ntp_status, data?.ntp_time, LL]); + + const ntpStatusHighlight = useMemo(() => { + if (!data) return theme.palette.error.main; - const ntpStatusHighlight = () => { switch (data.ntp_status) { case NTPSyncStatus.NTP_DISABLED: return theme.palette.info.main; @@ -162,9 +179,11 @@ const SystemStatus = () => { default: return theme.palette.error.main; } - }; + }, [data?.ntp_status, theme.palette]); + + const networkStatusHighlight = useMemo(() => { + if (!data) return theme.palette.warning.main; - const networkStatusHighlight = () => { switch (data.network_status) { case NetworkConnectionStatus.WIFI_STATUS_IDLE: case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: @@ -179,9 +198,11 @@ const SystemStatus = () => { default: return theme.palette.warning.main; } - }; + }, [data?.network_status, theme.palette]); + + const networkStatus = useMemo(() => { + if (!data) return LL.UNKNOWN(); - const networkStatus = () => { switch (data.network_status) { case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: return LL.INACTIVE(1); @@ -190,24 +211,27 @@ const SystemStatus = () => { case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL: return 'No SSID Available'; case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: - return LL.CONNECTED(0) + ' (WiFi, ' + data.wifi_rssi + ' dBm)'; + return `${LL.CONNECTED(0)} (WiFi, ${data.wifi_rssi} dBm)`; case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: - return LL.CONNECTED(0) + ' (Ethernet)'; + return `${LL.CONNECTED(0)} (Ethernet)`; case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: - return LL.CONNECTED(1) + ' ' + LL.FAILED(0); + return `${LL.CONNECTED(1)} ${LL.FAILED(0)}`; case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: - return LL.CONNECTED(1) + ' ' + LL.LOST(); + return `${LL.CONNECTED(1)} ${LL.LOST()}`; case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: return LL.DISCONNECTED(); default: return LL.UNKNOWN(); } - }; + }, [data?.network_status, data?.wifi_rssi, LL]); - const activeHighlight = (value: boolean) => - value ? theme.palette.success.main : theme.palette.info.main; + const activeHighlight = useCallback( + (value: boolean) => + value ? theme.palette.success.main : theme.palette.info.main, + [theme.palette] + ); - const doRestart = async () => { + const doRestart = useCallback(async () => { setConfirmRestart(false); setRestarting(true); await sendAPI({ device: 'system', cmd: 'restart', id: 0 }).catch( @@ -215,69 +239,114 @@ const SystemStatus = () => { toast.error(error.message); } ); - }; + }, [sendAPI]); - const renderRestartDialog = () => ( - setConfirmRestart(false)} - > - {LL.RESTART()} - {LL.RESTART_CONFIRM()} - - - - - + const handleCloseRestartDialog = useCallback(() => { + setConfirmRestart(false); + }, []); + + const renderRestartDialog = useMemo( + () => ( + + {LL.RESTART()} + {LL.RESTART_CONFIRM()} + + + + + + ), + [confirmRestart, handleCloseRestartDialog, doRestart, LL] ); - const content = () => { + // Memoize formatted values + const firmwareVersion = useMemo( + () => `v${data?.emsesp_version || ''}`, + [data?.emsesp_version] + ); + + const uptimeText = useMemo( + () => (data ? formatDurationSec(data.uptime, LL) : ''), + [data?.uptime, LL] + ); + + const freeMemoryText = useMemo( + () => (data ? `${formatNumber(data.free_heap)} KB ${LL.FREE_MEMORY()}` : ''), + [data?.free_heap, LL] + ); + + const networkIcon = useMemo( + () => + data?.network_status === NetworkConnectionStatus.WIFI_STATUS_CONNECTED + ? WifiIcon + : RouterIcon, + [data?.network_status] + ); + + const mqttStatusText = useMemo( + () => (data?.mqtt_status ? LL.CONNECTED(0) : LL.INACTIVE(0)), + [data?.mqtt_status, LL] + ); + + const apStatusText = useMemo( + () => (data?.ap_status ? LL.ACTIVE() : LL.INACTIVE(0)), + [data?.ap_status, LL] + ); + + const handleRestartClick = useCallback(() => { + setConfirmRestart(true); + }, []); + + const content = useMemo(() => { if (!data || !LL) { - return ; + return ; } return ( <> - + - + {me.admin && ( @@ -289,29 +358,25 @@ const SystemStatus = () => { icon={MemoryIcon} bgcolor="#68374d" label={LL.HARDWARE()} - text={formatNumber(data.free_heap) + ' KB' + ' ' + LL.FREE_MEMORY()} + text={freeMemoryText} to="/status/hardwarestatus" /> @@ -320,16 +385,16 @@ const SystemStatus = () => { icon={DeviceHubIcon} bgcolor={activeHighlight(data.mqtt_status)} label="MQTT" - text={data.mqtt_status ? LL.CONNECTED(0) : LL.INACTIVE(0)} + text={mqttStatusText} to="/status/mqtt" /> @@ -338,7 +403,7 @@ const SystemStatus = () => { icon={SettingsInputAntennaIcon} bgcolor={activeHighlight(data.ap_status)} label={LL.ACCESS_POINT(0)} - text={data.ap_status ? LL.ACTIVE() : LL.INACTIVE(0)} + text={apStatusText} to="/status/ap" /> @@ -352,14 +417,33 @@ const SystemStatus = () => { /> - {renderRestartDialog()} + {renderRestartDialog} ); - }; + }, [ + data, + LL, + firmwareVersion, + uptimeText, + freeMemoryText, + networkIcon, + mqttStatusText, + apStatusText, + busStatus, + busStatusHighlight, + networkStatusHighlight, + networkStatus, + ntpStatusHighlight, + ntpStatus, + activeHighlight, + me.admin, + handleRestartClick, + error, + loadData, + renderRestartDialog + ]); - return ( - {restarting ? : content()} - ); + return {restarting ? : content}; }; export default SystemStatus; diff --git a/interface/src/app/status/SystemLog.tsx b/interface/src/app/status/SystemLog.tsx index ee0207713..84663c19d 100644 --- a/interface/src/app/status/SystemLog.tsx +++ b/interface/src/app/status/SystemLog.tsx @@ -1,4 +1,11 @@ -import { useEffect, useRef, useState } from 'react'; +import { + memo, + useCallback, + useEffect, + useLayoutEffect, + useRef, + useState +} from 'react'; import { toast } from 'react-toastify'; import DownloadIcon from '@mui/icons-material/GetApp'; @@ -8,7 +15,7 @@ import { Box, Button, Checkbox, - Grid2 as Grid, + Grid, IconButton, MenuItem, TextField, @@ -31,13 +38,16 @@ import type { LogEntry, LogSettings } from 'types'; import { LogLevel } from 'types'; import { updateValueDirty, useRest } from 'utils'; -const TextColors = { +const MAX_LOG_ENTRIES = 1000; // Limit log entries to prevent memory issues + +const TextColors: Record = { [LogLevel.ERROR]: '#ff0000', // red [LogLevel.WARNING]: '#ff0000', // red [LogLevel.NOTICE]: '#ffffff', // white [LogLevel.INFO]: '#ffcc00', // yellow [LogLevel.DEBUG]: '#00ffff', // cyan - [LogLevel.TRACE]: '#00ffff' // cyan + [LogLevel.TRACE]: '#00ffff', // cyan + [LogLevel.ALL]: '#ffffff' // white }; const LogEntryLine = styled('span')( @@ -46,11 +56,6 @@ const LogEntryLine = styled('span')( }) ); -const topOffset = () => - document.getElementById('log-window')?.getBoundingClientRect().bottom || 0; -const leftOffset = () => - document.getElementById('log-window')?.getBoundingClientRect().left || 0; - const levelLabel = (level: LogLevel) => { switch (level) { case LogLevel.ERROR: @@ -70,6 +75,39 @@ const levelLabel = (level: LogLevel) => { } }; +const paddedLevelLabel = (level: LogLevel, compact: boolean) => { + const label = levelLabel(level); + return compact ? ' ' + label[0] : label.padStart(8, '\xa0'); +}; + +const paddedNameLabel = (name: string, compact: boolean) => { + const label = '[' + name + ']'; + return compact ? label : label.padEnd(12, '\xa0'); +}; + +const paddedIDLabel = (id: number, compact: boolean) => { + const label = id + ':'; + return compact ? label : label.padEnd(7, '\xa0'); +}; + +// Memoized log entry component to prevent unnecessary re-renders +const LogEntryItem = memo( + ({ entry, compact }: { entry: LogEntry; compact: boolean }) => { + return ( +
+ {entry.t} + {paddedLevelLabel(entry.l, compact)}  + {paddedIDLabel(entry.i, compact)} + {paddedNameLabel(entry.n, compact)} + {entry.m} +
+ ); + }, + (prevProps, nextProps) => + prevProps.entry.i === nextProps.entry.i && + prevProps.compact === nextProps.compact +); + const SystemLog = () => { const { LL } = useI18nContext(); @@ -101,54 +139,89 @@ const SystemLog = () => { const [readOpen, setReadOpen] = useState(false); const [logEntries, setLogEntries] = useState([]); const [autoscroll, setAutoscroll] = useState(true); - const [lastId, setLastId] = useState(-1); + const [boxPosition, setBoxPosition] = useState({ top: 0, left: 0 }); const ALPHA_NUMERIC_DASH_REGEX = /^[a-fA-F0-9 ]+$/; const updateFormValue = updateValueDirty( - origData, + origData as unknown as Record, dirtyFlags, setDirtyFlags, - updateDataValue + updateDataValue as (value: unknown) => void ); + // Calculate box position after layout + useLayoutEffect(() => { + const logWindow = document.getElementById('log-window'); + if (!logWindow) { + return; + } + + const updatePosition = () => { + const windowElement = document.getElementById('log-window'); + if (!windowElement) { + return; + } + const rect = windowElement.getBoundingClientRect(); + setBoxPosition({ top: rect.bottom, left: rect.left }); + }; + + updatePosition(); + + // Debounce resize events with requestAnimationFrame + let rafId: number; + const handleResize = () => { + cancelAnimationFrame(rafId); + rafId = requestAnimationFrame(updatePosition); + }; + + // Update position on window resize + window.addEventListener('resize', handleResize); + const resizeObserver = new ResizeObserver(handleResize); + resizeObserver.observe(logWindow); + + return () => { + window.removeEventListener('resize', handleResize); + resizeObserver.disconnect(); + cancelAnimationFrame(rafId); + }; + }, [data]); // Recalculate when data changes (in case layout shifts) + + // Memoize message handler to avoid recreating on every render + const handleLogMessage = useCallback((message: { data: string }) => { + const rawData = message.data; + const logentry = JSON.parse(rawData) as LogEntry; + setLogEntries((log) => { + // Skip if this is a duplicate entry (check last entry id) + if (log.length > 0) { + const lastEntry = log[log.length - 1]; + if (lastEntry && logentry.i <= lastEntry.i) { + return log; + } + } + const newLog = [...log, logentry]; + // Limit log entries to prevent memory issues - only slice when necessary + if (newLog.length > MAX_LOG_ENTRIES) { + return newLog.slice(-MAX_LOG_ENTRIES); + } + return newLog; + }); + }, []); + useSSE(fetchLogES, { immediate: true, interceptByGlobalResponded: false }) - .onMessage((message: { data: string }) => { - const rawData = message.data; - const logentry = JSON.parse(rawData) as LogEntry; - if (lastId < logentry.i) { - setLogEntries((log) => [...log, logentry]); - setLastId(logentry.i); - } - }) + .onMessage(handleLogMessage) .onError(() => { toast.error('No connection to Log service'); }); - const paddedLevelLabel = (level: LogLevel) => { - const label = levelLabel(level); - return data?.compact ? ' ' + label[0] : label.padStart(8, '\xa0'); - }; + const onDownload = useCallback(() => { + const result = logEntries + .map((i) => `${i.t} ${levelLabel(i.l)} ${i.i}: [${i.n}] ${i.m}`) + .join('\n'); - const paddedNameLabel = (name: string) => { - const label = '[' + name + ']'; - return data?.compact ? label : label.padEnd(12, '\xa0'); - }; - - const paddedIDLabel = (id: number) => { - const label = id + ':'; - return data?.compact ? label : label.padEnd(7, '\xa0'); - }; - - const onDownload = () => { - let result = ''; - for (const i of logEntries) { - result += - i.t + ' ' + levelLabel(i.l) + ' ' + i.i + ': [' + i.n + '] ' + i.m + '\n'; - } const a = document.createElement('a'); a.setAttribute( 'href', @@ -158,24 +231,28 @@ const SystemLog = () => { document.body.appendChild(a); a.click(); document.body.removeChild(a); - }; + }, [logEntries]); - const saveSettings = async () => { + const saveSettings = useCallback(async () => { await saveData(); - }; + }, [saveData]); - // handle scrolling + // handle scrolling - optimized to only scroll when needed const ref = useRef(null); + const logWindowRef = useRef(null); + useEffect(() => { if (logEntries.length && autoscroll) { - ref.current?.scrollIntoView({ - behavior: 'smooth', - block: 'end' - }); + const container = logWindowRef.current; + if (container) { + requestAnimationFrame(() => { + container.scrollTop = container.scrollHeight; + }); + } } - }, [logEntries.length]); + }, [logEntries.length, autoscroll]); - const sendReadCommand = () => { + const sendReadCommand = useCallback(() => { if (readValue === '') { setReadOpen(!readOpen); return; @@ -186,11 +263,11 @@ const SystemLog = () => { setReadOpen(false); setReadValue(''); } - }; + }, [readValue, readOpen, send]); const content = () => { if (!data) { - return ; + return ; } return ( @@ -278,6 +355,7 @@ const SystemLog = () => { > { setReadOpen(false); setReadValue(''); @@ -303,7 +381,7 @@ const SystemLog = () => { ) : ( <> {data.developer_mode && ( - + )} @@ -325,27 +403,20 @@ const SystemLog = () => {
leftOffset(), - top: () => topOffset(), + left: boxPosition.left, + top: boxPosition.top, p: 1 }} > {logEntries.map((e) => ( -
- {e.t} - {paddedLevelLabel(e.l)}  - {paddedIDLabel(e.i)} - {paddedNameLabel(e.n)} - - {e.m} - -
+ ))}
diff --git a/interface/src/app/status/SystemMonitor.tsx b/interface/src/app/status/SystemMonitor.tsx index eb5faea23..492049074 100644 --- a/interface/src/app/status/SystemMonitor.tsx +++ b/interface/src/app/status/SystemMonitor.tsx @@ -1,12 +1,11 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useRef, useState } from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; -import { Box, Button, Dialog, DialogContent, Typography } from '@mui/material'; +import { Box, Button, Typography } from '@mui/material'; import { callAction } from 'api/app'; import { readSystemStatus } from 'api/system'; -import { dialogStyle } from 'CustomTheme'; import { useRequest } from 'alova/client'; import MessageBox from 'components/MessageBox'; import { useI18nContext } from 'i18n/i18n-react'; @@ -17,11 +16,9 @@ import { LinearProgressWithLabel } from '../../components/upload/LinearProgressW const SystemMonitor = () => { const [errorMessage, setErrorMessage] = useState(); - + const hasInitialized = useRef(false); const { LL } = useI18nContext(); - let count = 0; - const { send: setSystemStatus } = useRequest( (status: string) => callAction({ action: 'systemStatus', param: status }), { @@ -32,10 +29,12 @@ const SystemMonitor = () => { const { data, send } = useRequest(readSystemStatus, { force: true, async middleware(_, next) { - if (count++ >= 1) { - // skip first request (1 second) to allow AsyncWS to send its response - await next(); + // Skip first request to allow AsyncWS to send its response + if (!hasInitialized.current) { + hasInitialized.current = true; + return; // Don't await next() on first call } + await next(); } }) .onSuccess((event) => { @@ -51,53 +50,102 @@ const SystemMonitor = () => { } }) .onError((error) => { - setErrorMessage(error.message); + setErrorMessage(String(error.error?.message || 'An error occurred')); }); useInterval(() => { void send(); }, 1000); // check every 1 second - const onCancel = async () => { + const { statusMessage, isUploading, progressValue } = useMemo(() => { + const status = data?.status; + + let message = ''; + if (status && status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING) { + message = LL.WAIT_FIRMWARE(); + } else if (status === SystemStatusCodes.SYSTEM_STATUS_PENDING_RESTART) { + message = LL.APPLICATION_RESTARTING(); + } else if (status === SystemStatusCodes.SYSTEM_STATUS_NORMAL) { + message = LL.RESTARTING_PRE(); + } else if (status === SystemStatusCodes.SYSTEM_STATUS_ERROR_UPLOAD) { + message = 'Upload Failed'; + } else { + message = LL.RESTARTING_POST(); + } + + const uploading = + status !== undefined && status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING; + const progress = + uploading && status + ? Math.round(status - SystemStatusCodes.SYSTEM_STATUS_UPLOADING) + : 0; + + return { + statusMessage: message, + isUploading: uploading, + progressValue: progress + }; + }, [data?.status, LL]); + + const onCancel = useCallback(async () => { setErrorMessage(undefined); - await setSystemStatus( - SystemStatusCodes.SYSTEM_STATUS_NORMAL as unknown as string - ); + await setSystemStatus(String(SystemStatusCodes.SYSTEM_STATUS_NORMAL)); document.location.href = '/'; - }; + }, [setSystemStatus]); return ( - - - + + + + EMS-ESP - {data?.status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING - ? LL.WAIT_FIRMWARE() - : data?.status === SystemStatusCodes.SYSTEM_STATUS_PENDING_RESTART - ? LL.APPLICATION_RESTARTING() - : data?.status === SystemStatusCodes.SYSTEM_STATUS_NORMAL - ? LL.RESTARTING_PRE() - : data?.status === SystemStatusCodes.SYSTEM_STATUS_ERROR_UPLOAD - ? 'Upload Failed' - : LL.RESTARTING_POST()} + {statusMessage} {errorMessage ? ( - + ) : ( @@ -105,20 +153,16 @@ const SystemMonitor = () => { {LL.PLEASE_WAIT()}… - {data && data.status >= SystemStatusCodes.SYSTEM_STATUS_UPLOADING && ( + {isUploading && ( - + )} )} - - + + ); }; diff --git a/interface/src/app/status/Version.tsx b/interface/src/app/status/Version.tsx index b8fc7881b..17a452f4a 100644 --- a/interface/src/app/status/Version.tsx +++ b/interface/src/app/status/Version.tsx @@ -1,7 +1,16 @@ -import { useContext, useEffect, useState } from 'react'; +import { + memo, + useCallback, + useContext, + useEffect, + useMemo, + useRef, + useState +} from 'react'; import { toast } from 'react-toastify'; import CancelIcon from '@mui/icons-material/Cancel'; +import CloseIcon from '@mui/icons-material/Close'; import CheckIcon from '@mui/icons-material/Done'; import DownloadIcon from '@mui/icons-material/GetApp'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; @@ -9,14 +18,17 @@ import WarningIcon from '@mui/icons-material/Warning'; import { Box, Button, - Checkbox, Dialog, DialogActions, DialogContent, DialogTitle, - FormControlLabel, - Grid2 as Grid, + Grid, + IconButton, Link, + Table, + TableBody, + TableCell, + TableRow, Typography } from '@mui/material'; @@ -36,258 +48,603 @@ import { } from 'components'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; +import type { TranslationFunctions } from 'i18n/i18n-types'; +import { prettyDateTime } from 'utils/time'; + +// Constants moved outside component to avoid recreation +const STABLE_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/'; +const STABLE_RELNOTES_URL = + 'https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md'; +const DEV_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/latest/'; +const DEV_RELNOTES_URL = + 'https://github.com/emsesp/EMS-ESP32/blob/dev/CHANGELOG_LATEST.md'; + +// Types for better type safety +interface PartitionData { + partition: string; + version: string; + install_date?: string; + size: number; +} + +interface VersionData { + emsesp_version: string; + arduino_version: string; + esp_platform: string; + flash_chip_size: number; + psram: boolean; + build_flags?: string; + partition: string; + partitions: PartitionData[]; + developer_mode: boolean; +} + +interface UpgradeCheckData { + emsesp_version: string; + dev_upgradeable: boolean; + stable_upgradeable: boolean; +} + +interface VersionInfo { + name: string; + published_at?: string; +} + +// Memoized components for better performance +const VersionInfoDialog = memo( + ({ + showVersionInfo, + latestVersion, + latestDevVersion, + partitionVersion, + partition, + currentPartition, + size, + locale, + LL, + onClose + }: { + showVersionInfo: number; + latestVersion?: VersionInfo; + latestDevVersion?: VersionInfo; + partitionVersion?: VersionInfo | undefined; + partition: string; + currentPartition: string; + size: number; + locale: string; + LL: TranslationFunctions; + onClose: () => void; + }) => { + if (showVersionInfo === 0) return null; + + const isStable = showVersionInfo === 1; + const isDev = showVersionInfo === 2; + const isPartition = showVersionInfo === 3; + + const version = isStable + ? latestVersion + : isDev + ? latestDevVersion + : partitionVersion; + const relNotesUrl = isStable + ? STABLE_RELNOTES_URL + : isDev + ? DEV_RELNOTES_URL + : ''; + + return ( + + {LL.FIRMWARE_VERSION_INFO()} + + + + + + {LL.VERSION()} + + + {isPartition + ? typeof version === 'string' + ? version + : version?.name + : version?.name} + + + + + {isPartition ? LL.TYPE(0) : LL.RELEASE_TYPE()} + + + {partition === currentPartition && LL.ACTIVE() + ' '} + {isStable + ? LL.STABLE() + : isDev + ? LL.DEVELOPMENT() + : 'Partition ' + LL.VERSION()} + + + {isPartition && ( + + + Partition + + + {partition} + + + )} + {isPartition && ( + + + Size + + + {size} KB + + + )} + {version?.published_at && ( + + + {isPartition ? 'Install Date' : 'Build Date'} + + + {prettyDateTime(locale, new Date(version.published_at))} + + + )} + +
+
+ + {!isPartition && ( + + )} + + +
+ ); + } +); + +const InstallDialog = memo( + ({ + openInstallDialog, + fetchDevVersion, + latestVersion, + latestDevVersion, + downloadOnly, + platform, + LL, + onClose, + onInstall + }: { + openInstallDialog: boolean; + fetchDevVersion: boolean; + latestVersion?: VersionInfo; + latestDevVersion?: VersionInfo; + downloadOnly: boolean; + platform: string; + LL: TranslationFunctions; + onClose: () => void; + onInstall: (url: string) => void; + }) => { + const binURL = useMemo(() => { + if (!latestVersion || !latestDevVersion) return ''; + + const version = fetchDevVersion ? latestDevVersion : latestVersion; + const filename = `EMS-ESP-${version.name.replaceAll('.', '_')}-${platform}.bin`; + + return fetchDevVersion + ? `${DEV_URL}${filename}` + : `${STABLE_URL}v${version.name}/${filename}`; + }, [fetchDevVersion, latestVersion, latestDevVersion, platform]); + + return ( + + + {`${LL.INSTALL()} ${fetchDevVersion ? LL.DEVELOPMENT() : LL.STABLE()} Firmware`} + + + + {LL.INSTALL_VERSION( + downloadOnly ? LL.DOWNLOAD(1) : LL.INSTALL(), + fetchDevVersion ? latestDevVersion?.name : latestVersion?.name + )} + + + + + + {!downloadOnly && ( + + )} + + + ); + } +); + +const InstallPartitionDialog = memo( + ({ + openInstallPartitionDialog, + version, + partition, + LL, + onClose, + onInstall + }: { + openInstallPartitionDialog: boolean; + version: string; + partition: string; + LL: TranslationFunctions; + onClose: () => void; + onInstall: (partition: string) => void; + }) => { + return ( + + + {LL.INSTALL()} {LL.STORED_VERSIONS()} + + + {LL.INSTALL_VERSION(LL.INSTALL(), version)} + + + + + + + + ); + } +); + +// Helper function moved outside component +const getPlatform = (data: VersionData): string => { + return `${data.esp_platform}-${data.flash_chip_size >= 16384 ? '16MB' : '4MB'}${data.psram ? '+' : ''}`; +}; const Version = () => { const { LL, locale } = useI18nContext(); const { me } = useContext(AuthenticatedContext); + // State management const [restarting, setRestarting] = useState(false); const [openInstallDialog, setOpenInstallDialog] = useState(false); + + const [partitionVersion, setPartitionVersion] = useState( + undefined + ); + const [partition, setPartition] = useState(''); + const [openInstallPartitionDialog, setOpenInstallPartitionDialog] = + useState(false); + const [usingDevVersion, setUsingDevVersion] = useState(false); - const [upgradeAvailable, setUpgradeAvailable] = useState(false); + const [fetchDevVersion, setFetchDevVersion] = useState(false); + const [devUpgradeAvailable, setDevUpgradeAvailable] = useState(false); + const [stableUpgradeAvailable, setStableUpgradeAvailable] = + useState(false); const [internetLive, setInternetLive] = useState(false); const [downloadOnly, setDownloadOnly] = useState(false); - - const STABLE_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/'; - const STABLE_RELNOTES_URL = - 'https://github.com/emsesp/EMS-ESP32/blob/main/CHANGELOG.md'; - - const DEV_URL = 'https://github.com/emsesp/EMS-ESP32/releases/download/latest/'; - const DEV_RELNOTES_URL = - 'https://github.com/emsesp/EMS-ESP32/blob/dev/CHANGELOG_LATEST.md'; + const [showVersionInfo, setShowVersionInfo] = useState(0); // 1 = stable, 2 = dev, 3 = partition + const [firmwareSize, setFirmwareSize] = useState(0); const { send: sendCheckUpgrade } = useRequest( (versions: string) => callAction({ action: 'checkUpgrade', param: versions }), - { - immediate: false - } + { immediate: false } ).onSuccess((event) => { - const data = event.data as { emsesp_version: string; upgradeable: boolean }; - setUpgradeAvailable(data.upgradeable); + const data = event.data as UpgradeCheckData; + setDevUpgradeAvailable(data.dev_upgradeable); + setStableUpgradeAvailable(data.stable_upgradeable); + }); + + const { send: sendSetPartition } = useRequest( + (partition: string) => callAction({ action: 'setPartition', param: partition }), + { immediate: false } + ).onError((error) => { + toast.error(String(error.error?.message || 'An error occurred')); }); const { - data: data, + data, send: loadData, error } = useRequest(SystemApi.readSystemStatus).onSuccess((event) => { - // older version of EMS-ESP on 4MB boards, can't use OTA because of SSL support in HttpClient - if (event.data.arduino_version.startsWith('Tasmota')) { + const systemData = event.data as VersionData; + if (systemData.arduino_version.startsWith('Tasmota')) { setDownloadOnly(true); } - setUsingDevVersion(event.data.emsesp_version.includes('dev')); + setUsingDevVersion(systemData.emsesp_version.includes('dev')); }); const { send: sendUploadURL } = useRequest( (url: string) => callAction({ action: 'uploadURL', param: url }), - { - immediate: false - } + { immediate: false } ); - // called immediately to get the latest versions on page load const { data: latestVersion } = useRequest(getStableVersion); const { data: latestDevVersion } = useRequest(getDevVersion); - useEffect(() => { - if (latestVersion && latestDevVersion) { - sendCheckUpgrade(latestDevVersion.name + ',' + latestVersion.name) - .catch((error: Error) => { - toast.error('Failed to check for upgrades: ' + error.message); - }) - .finally(() => { - setInternetLive(true); - }); - } - }, [latestVersion, latestDevVersion]); - - const rtf = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }); - const DIVISIONS = [ - { amount: 60, name: 'seconds' }, - { amount: 60, name: 'minutes' }, - { amount: 24, name: 'hours' }, - { amount: 7, name: 'days' }, - { amount: 4.34524, name: 'weeks' }, - { amount: 12, name: 'months' }, - { amount: Number.POSITIVE_INFINITY, name: 'years' } - ]; - function formatTimeAgo(date) { - let duration = (date.getTime() - new Date().getTime()) / 1000; - for (let i = 0; i < DIVISIONS.length; i++) { - const division = DIVISIONS[i]; - if (Math.abs(duration) < division.amount) { - return rtf.format( - Math.round(duration), - division.name as Intl.RelativeTimeFormatUnit - ); - } - duration /= division.amount; - } - } - const { send: sendAPI } = useRequest((data: APIcall) => API(data), { immediate: false }); - const doRestart = async () => { - setRestarting(true); + // Memoized values + const platform = useMemo(() => (data ? getPlatform(data) : ''), [data]); + + // Memoize filtered partitions to avoid recomputing on every render + const otherPartitions = useMemo( + () => data?.partitions.filter((p) => p.partition !== data.partition) ?? [], + [data] + ); + + const setPartitionVersionInfo = useCallback( + (partition: string) => { + setShowVersionInfo(3); + + // search for the partition in the data.partitions array + const partitionData = data?.partitions.find((p) => p.partition === partition); + if (partitionData) { + setPartitionVersion({ + name: partitionData.version, + published_at: partitionData.install_date ?? '' + }); + setPartition(partitionData.partition); + setFirmwareSize(partitionData.size); + } + }, + [data] + ); + + const doRestart = useCallback(async () => { await sendAPI({ device: 'system', cmd: 'restart', id: 0 }).catch( (error: Error) => { toast.error(error.message); } ); - }; - - const getBinURL = () => { - if (!internetLive) { - return ''; - } - const filename = - 'EMS-ESP-' + - (usingDevVersion ? latestDevVersion.name : latestVersion.name).replaceAll( - '.', - '_' - ) + - '-' + - getPlatform() + - '.bin'; - return usingDevVersion - ? DEV_URL + filename - : STABLE_URL + 'v' + latestVersion.name + '/' + filename; - }; - - const getPlatform = () => { - return ( - [data.esp_platform, data.flash_chip_size >= 16384 ? '16MB' : '4MB'].join('-') + - (data.psram ? '+' : '') - ); - }; - - const installFirmwareURL = async (url: string) => { - await sendUploadURL(url).catch((error: Error) => { - toast.error(error.message); - }); setRestarting(true); - }; + }, [sendAPI]); + + const installFirmwareURL = useCallback( + async (url: string) => { + await sendUploadURL(url).catch((error: Error) => { + toast.error(error.message); + }); + await doRestart(); + }, + [sendUploadURL, doRestart] + ); + + const installPartitionFirmware = useCallback( + async (partition: string) => { + await sendSetPartition(partition).catch((error: Error) => { + toast.error(error.message); + }); + setRestarting(true); + }, + [sendSetPartition] + ); + + const showPartitionDialog = useCallback( + (version: string, partition: string, install_date: string) => { + setOpenInstallPartitionDialog(true); + setPartitionVersion({ name: version, published_at: install_date }); + setPartition(partition); + }, + [] + ); + + const showFirmwareDialog = useCallback((useDevVersion: boolean) => { + setFetchDevVersion(useDevVersion); + setOpenInstallDialog(true); + }, []); + + const closeInstallDialog = useCallback(() => { + setOpenInstallDialog(false); + }, []); + + const closeInstallPartitionDialog = useCallback(() => { + setOpenInstallPartitionDialog(false); + }, []); + + const handleVersionInfoClose = useCallback(() => { + setShowVersionInfo(0); + setPartitionVersion(undefined); + setPartition(''); + }, []); + + // check upgrades - only once when both versions are available + const upgradeCheckedRef = useRef(false); + useEffect(() => { + if (latestVersion && latestDevVersion && !upgradeCheckedRef.current) { + upgradeCheckedRef.current = true; + const versions = `${latestDevVersion.name},${latestVersion.name}`; + sendCheckUpgrade(versions) + .catch((error: Error) => { + toast.error(`Failed to check for upgrades: ${error.message}`); + }) + .finally(() => { + setInternetLive(true); + }); + } + }, [latestVersion, latestDevVersion, sendCheckUpgrade]); useLayoutTitle('EMS-ESP Firmware'); - const renderInstallDialog = () => ( - closeInstallDialog()} - > - - {LL.INSTALL() + - ' ' + - (usingDevVersion ? LL.DEVELOPMENT() : LL.STABLE()) + - ' Firmware'} - - - - {LL.INSTALL_VERSION( - usingDevVersion ? latestDevVersion?.name : latestVersion?.name - )} - - - - - - - - - ); + // Memoized button rendering logic + const showButtons = useCallback( + (showingDev: boolean) => { + const choice = showingDev + ? !usingDevVersion + ? LL.SWITCH_RELEASE_TYPE(LL.DEVELOPMENT()) + : devUpgradeAvailable + ? LL.UPDATE_AVAILABLE() + : undefined + : usingDevVersion + ? LL.SWITCH_RELEASE_TYPE(LL.STABLE()) + : stableUpgradeAvailable + ? LL.UPDATE_AVAILABLE() + : undefined; - const showFirmwareDialog = (useDevVersion?: boolean) => { - setUsingDevVersion(useDevVersion || usingDevVersion); - setOpenInstallDialog(true); - }; + if (!choice) { + return ( + <> + + + {LL.LATEST_VERSION(usingDevVersion ? LL.DEVELOPMENT() : LL.STABLE())} + + + + ); + } - const closeInstallDialog = () => { - setOpenInstallDialog(false); - setUsingDevVersion(data.emsesp_version.includes('dev')); - }; + if (!me.admin) return null; - const showButtons = (showDev?: boolean) => { - if (!me.admin) { - return; - } - - if (downloadOnly) { return ( ); - } + }, + [ + usingDevVersion, + devUpgradeAvailable, + stableUpgradeAvailable, + me.admin, + LL, + showFirmwareDialog + ] + ); - return ( - - ); - }; - - const content = () => { + const content = useMemo(() => { if (!data) { - return ; + return ; } - const isDev = data.emsesp_version.includes('dev'); - return ( <> - + {LL.THIS_VERSION()} {   ({data.build_flags}) )} + setPartitionVersionInfo(data.partition)} + aria-label={LL.FIRMWARE_VERSION_INFO()} + > + + @@ -312,63 +675,35 @@ const Version = () => { - {getPlatform()} + {platform} -   ({data.psram ? '+PSRAM' : '-PSRAM'}) +   ( + {data.psram ? ( + + ) : ( + + )} + PSRAM) - - - {LL.RELEASE_TYPE()} - - - - } - slotProps={{ - typography: { - color: 'grey' - } - }} - checked={!isDev} - label={LL.STABLE()} - sx={{ '& .MuiSvgIcon-root': { fontSize: 16 } }} - /> - - } - slotProps={{ - typography: { - color: 'grey' - } - }} - checked={isDev} - label={LL.DEVELOPMENT()} - sx={{ '& .MuiSvgIcon-root': { fontSize: 16 } }} - /> - {internetLive ? ( <> - + {LL.AVAILABLE_VERSION()} @@ -381,21 +716,60 @@ const Version = () => { alignItems: 'baseline' }} > + {otherPartitions.length > 0 && data.developer_mode && ( + <> + + + {LL.STORED_VERSIONS()} + + + + {otherPartitions.map((partition) => ( + + {partition.version} + + setPartitionVersionInfo(partition.partition) + } + aria-label={LL.FIRMWARE_VERSION_INFO()} + > + + + + + ))} + + + )} {LL.STABLE()} - - {latestVersion.name} - - {latestVersion.published_at && ( - -  ( - {formatTimeAgo(new Date(latestVersion.published_at))}) - - )} - {!usingDevVersion && showButtons(false)} + {latestVersion?.name} + setShowVersionInfo(1)} + aria-label={LL.FIRMWARE_VERSION_INFO()} + > + + + {showButtons(false)} @@ -404,37 +778,17 @@ const Version = () => { - - {latestDevVersion.name} - - {latestDevVersion.published_at && ( - -  ( - {formatTimeAgo(new Date(latestDevVersion.published_at))}) - - )} + {latestDevVersion?.name} + setShowVersionInfo(2)} + aria-label={LL.FIRMWARE_VERSION_INFO()} + > + + {showButtons(true)} - - {upgradeAvailable ? ( - - - {LL.UPGRADE_AVAILABLE()} - - ) : ( - - - {LL.LATEST_VERSION()} - - )} ) : ( @@ -444,7 +798,37 @@ const Version = () => { )} {me.admin && ( <> - {renderInstallDialog()} + + + {LL.UPLOAD()} @@ -454,11 +838,37 @@ const Version = () => { ); - }; + }, [ + data, + error, + loadData, + LL, + platform, + internetLive, + latestVersion, + latestDevVersion, + showVersionInfo, + locale, + openInstallDialog, + fetchDevVersion, + downloadOnly, + me.admin, + showButtons, + handleVersionInfoClose, + closeInstallDialog, + installFirmwareURL, + doRestart, + otherPartitions, + setPartitionVersionInfo, + showPartitionDialog, + partitionVersion, + partition, + firmwareSize, + closeInstallPartitionDialog, + installPartitionFirmware + ]); - return ( - {restarting ? : content()} - ); + return {restarting ? : content}; }; -export default Version; +export default memo(Version); diff --git a/interface/src/components/ButtonRow.tsx b/interface/src/components/ButtonRow.tsx index 01c7aafb7..8fff5e161 100644 --- a/interface/src/components/ButtonRow.tsx +++ b/interface/src/components/ButtonRow.tsx @@ -1,26 +1,22 @@ -import type { FC } from 'react'; +import { memo } from 'react'; import { Box } from '@mui/material'; import type { BoxProps } from '@mui/material'; -const ButtonRow: FC = ({ children, ...rest }) => ( +const ButtonRow = memo(({ children, ...rest }) => ( {children} -); +)); export default ButtonRow; diff --git a/interface/src/components/ButtonTooltip.tsx b/interface/src/components/ButtonTooltip.tsx index 8498a6860..536500060 100644 --- a/interface/src/components/ButtonTooltip.tsx +++ b/interface/src/components/ButtonTooltip.tsx @@ -1,17 +1,7 @@ -import { Tooltip, type TooltipProps, styled, tooltipClasses } from '@mui/material'; +import { Tooltip, type TooltipProps } from '@mui/material'; -export const ButtonTooltip = styled(({ className, ...props }: TooltipProps) => ( - -))(({ theme }) => ({ - [`& .${tooltipClasses.arrow}`]: { - color: theme.palette.success.main - }, - [`& .${tooltipClasses.tooltip}`]: { - backgroundColor: theme.palette.success.main, - color: 'rgba(0, 0, 0, 0.87)', - boxShadow: theme.shadows[1], - fontSize: 10 - } -})); +export const ButtonTooltip = ({ children, ...props }: TooltipProps) => ( + {children} +); export default ButtonTooltip; diff --git a/interface/src/components/MessageBox.tsx b/interface/src/components/MessageBox.tsx index 70196c722..010f96aec 100644 --- a/interface/src/components/MessageBox.tsx +++ b/interface/src/components/MessageBox.tsx @@ -1,11 +1,11 @@ -import type { FC } from 'react'; +import { type FC, memo, useMemo } from 'react'; import CheckCircleOutlineOutlinedIcon from '@mui/icons-material/CheckCircleOutlineOutlined'; import ErrorIcon from '@mui/icons-material/Error'; import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined'; import ReportProblemOutlinedIcon from '@mui/icons-material/ReportProblemOutlined'; import { Box, Typography, useTheme } from '@mui/material'; -import type { BoxProps, SvgIconProps, Theme } from '@mui/material'; +import type { BoxProps, SvgIconProps } from '@mui/material'; type MessageBoxLevel = 'warning' | 'success' | 'info' | 'error'; @@ -14,22 +14,18 @@ export interface MessageBoxProps extends BoxProps { message?: string; } -const LEVEL_ICONS: { - [type in MessageBoxLevel]: React.ComponentType; -} = { +const LEVEL_ICONS: Record> = { success: CheckCircleOutlineOutlinedIcon, info: InfoOutlinedIcon, warning: ReportProblemOutlinedIcon, error: ErrorIcon }; -const LEVEL_BACKGROUNDS: { - [type in MessageBoxLevel]: (theme: Theme) => string; -} = { - success: (theme: Theme) => theme.palette.success.dark, - info: (theme: Theme) => theme.palette.info.main, - warning: (theme: Theme) => theme.palette.warning.dark, - error: (theme: Theme) => theme.palette.error.dark +const LEVEL_PALETTE_PATHS: Record = { + success: 'success.dark', + info: 'info.main', + warning: 'warning.dark', + error: 'error.dark' }; const MessageBox: FC = ({ @@ -40,25 +36,38 @@ const MessageBox: FC = ({ ...rest }) => { const theme = useTheme(); - const Icon = LEVEL_ICONS[level]; - const backgroundColor = LEVEL_BACKGROUNDS[level](theme); - const color = 'white'; + + const { Icon, backgroundColor } = useMemo(() => { + const Icon = LEVEL_ICONS[level]; + const palettePath = LEVEL_PALETTE_PATHS[level]; + const [key, shade] = palettePath.split('.') as [ + keyof typeof theme.palette, + string + ]; + const paletteKey = theme.palette[key] as unknown as Record; + const backgroundColor = paletteKey[shade]; + + return { Icon, backgroundColor }; + }, [level, theme]); + return ( - - {message ?? ''} - - {children} + {(message || children) && ( + + {message} + {children} + + )} ); }; -export default MessageBox; +export default memo(MessageBox); diff --git a/interface/src/components/SectionContent.tsx b/interface/src/components/SectionContent.tsx index 3dcc56c27..e6c2c561f 100644 --- a/interface/src/components/SectionContent.tsx +++ b/interface/src/components/SectionContent.tsx @@ -1,33 +1,28 @@ +import { memo } from 'react'; import type { FC } from 'react'; -import { Divider, Paper } from '@mui/material'; +import { Paper } from '@mui/material'; +import type { SxProps, Theme } from '@mui/material/styles'; import type { RequiredChildrenProps } from 'utils'; interface SectionContentProps extends RequiredChildrenProps { - title?: string; id?: string; } -const SectionContent: FC = (props) => { - const { children, title, id } = props; - return ( - - {title && ( - - {title} - - )} - {children} - - ); +// Extract styles to avoid recreation on every render +const paperStyles: SxProps = { + p: 1.5, + m: 1.5, + borderRadius: 3, + border: '1px solid rgb(65, 65, 65)' }; -export default SectionContent; +const SectionContent: FC = ({ children, id }) => ( + + {children} + +); + +// Memoize to prevent unnecessary re-renders +export default memo(SectionContent); diff --git a/interface/src/components/index.ts b/interface/src/components/index.ts index 4d47f6d2d..ed2ffc878 100644 --- a/interface/src/components/index.ts +++ b/interface/src/components/index.ts @@ -1,10 +1,15 @@ +// use direct exports to reduce bundle size +export { default as SectionContent } from './SectionContent'; +export { default as ButtonRow } from './ButtonRow'; +export { default as MessageBox } from './MessageBox'; +export { default as ButtonTooltip } from './ButtonTooltip'; + +// Re-export sub-modules export * from './inputs'; export * from './layout'; export * from './loading'; export * from './routing'; export * from './upload'; -export { default as SectionContent } from './SectionContent'; -export { default as ButtonRow } from './ButtonRow'; -export { default as MessageBox } from './MessageBox'; + +// Specific routing exports export { default as BlockNavigation } from './routing/BlockNavigation'; -export { default as ButtonTooltip } from './ButtonTooltip'; diff --git a/interface/src/components/inputs/BlockFormControlLabel.tsx b/interface/src/components/inputs/BlockFormControlLabel.tsx index a07df2c87..8f7ba7672 100644 --- a/interface/src/components/inputs/BlockFormControlLabel.tsx +++ b/interface/src/components/inputs/BlockFormControlLabel.tsx @@ -1,3 +1,4 @@ +import { memo } from 'react'; import type { FC } from 'react'; import { FormControlLabel } from '@mui/material'; @@ -9,4 +10,4 @@ const BlockFormControlLabel: FC = (props) => (
); -export default BlockFormControlLabel; +export default memo(BlockFormControlLabel); diff --git a/interface/src/components/inputs/LanguageSelector.tsx b/interface/src/components/inputs/LanguageSelector.tsx index 9e3b12162..6e0ab57f2 100644 --- a/interface/src/components/inputs/LanguageSelector.tsx +++ b/interface/src/components/inputs/LanguageSelector.tsx @@ -1,4 +1,6 @@ -import { type ChangeEventHandler, useContext } from 'react'; +import { memo, useCallback, useContext, useMemo } from 'react'; +import type { ChangeEventHandler } from 'react'; +import type { CSSProperties } from 'react'; import { MenuItem, TextField } from '@mui/material'; @@ -17,73 +19,66 @@ import { I18nContext } from 'i18n/i18n-react'; import type { Locales } from 'i18n/i18n-types'; import { loadLocaleAsync } from 'i18n/i18n-util.async'; -const LanguageSelector = () => { - const { setLocale, locale } = useContext(I18nContext); +const flagStyle: CSSProperties = { width: 16, verticalAlign: 'middle' }; - const onLocaleSelected: ChangeEventHandler = async ({ - target - }) => { - const loc = target.value as Locales; - localStorage.setItem('lang', loc); - await loadLocaleAsync(loc); - setLocale(loc); - }; +interface LanguageOption { + key: Locales; + flag: string; + label: string; +} + +const LANGUAGE_OPTIONS: LanguageOption[] = [ + { key: 'cz', flag: CZflag, label: 'CZ' }, + { key: 'de', flag: DEflag, label: 'DE' }, + { key: 'en', flag: GBflag, label: 'EN' }, + { key: 'fr', flag: FRflag, label: 'FR' }, + { key: 'it', flag: ITflag, label: 'IT' }, + { key: 'nl', flag: NLflag, label: 'NL' }, + { key: 'no', flag: NOflag, label: 'NO' }, + { key: 'pl', flag: PLflag, label: 'PL' }, + { key: 'sk', flag: SKflag, label: 'SK' }, + { key: 'sv', flag: SVflag, label: 'SV' }, + { key: 'tr', flag: TRflag, label: 'TR' } +]; + +const LanguageSelector = () => { + const { setLocale, locale, LL } = useContext(I18nContext); + + const onLocaleSelected: ChangeEventHandler = useCallback( + async ({ target }) => { + const loc = target.value as Locales; + localStorage.setItem('lang', loc); + await loadLocaleAsync(loc); + setLocale(loc); + }, + [setLocale] + ); + + // Memoize menu items to prevent recreation on every render + const menuItems = useMemo( + () => + LANGUAGE_OPTIONS.map(({ key, flag, label }) => ( + + {label} +  {label} + + )), + [] + ); return ( - - -  CZ - - - -  DE - - - -  EN - - - -  FR - - - -  IT - - - -  NL - - - -  NO - - - -  PL - - - -  SK - - - -  SV - - - -  TR - + {menuItems} ); }; -export default LanguageSelector; +export default memo(LanguageSelector); diff --git a/interface/src/components/inputs/ValidatedPasswordField.tsx b/interface/src/components/inputs/ValidatedPasswordField.tsx index 5e28cf2be..44ab69995 100644 --- a/interface/src/components/inputs/ValidatedPasswordField.tsx +++ b/interface/src/components/inputs/ValidatedPasswordField.tsx @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { memo, useCallback, useState } from 'react'; import type { FC } from 'react'; import VisibilityIcon from '@mui/icons-material/Visibility'; @@ -13,6 +13,10 @@ type ValidatedPasswordFieldProps = Omit; const ValidatedPasswordField: FC = ({ ...props }) => { const [showPassword, setShowPassword] = useState(false); + const togglePasswordVisibility = useCallback(() => { + setShowPassword((prev) => !prev); + }, []); + return ( = ({ ...props }) = input: { endAdornment: ( - setShowPassword(!showPassword)} edge="end"> + {showPassword ? : } @@ -32,4 +40,4 @@ const ValidatedPasswordField: FC = ({ ...props }) = ); }; -export default ValidatedPasswordField; +export default memo(ValidatedPasswordField); diff --git a/interface/src/components/inputs/ValidatedTextField.tsx b/interface/src/components/inputs/ValidatedTextField.tsx index 9fdcdab5d..1660af29d 100644 --- a/interface/src/components/inputs/ValidatedTextField.tsx +++ b/interface/src/components/inputs/ValidatedTextField.tsx @@ -1,3 +1,4 @@ +import { memo } from 'react'; import type { FC } from 'react'; import { FormHelperText, TextField } from '@mui/material'; @@ -14,18 +15,42 @@ export type ValidatedTextFieldProps = ValidatedFieldProps & TextFieldProps; const ValidatedTextField: FC = ({ fieldErrors, + sx, ...rest }) => { - const errors = fieldErrors && fieldErrors[rest.name]; - const renderErrors = () => - errors && - errors.map((e) => {e.message}); + const errors = fieldErrors?.[rest.name]; + return ( <> - - {renderErrors()} + null + }, + inputLabel: { + style: { color: 'grey' } + } + } + })} + color={rest.disabled ? 'secondary' : 'primary'} + /> + {errors?.map((e) => ( + + {e.message} + + ))} ); }; -export default ValidatedTextField; +export default memo(ValidatedTextField); diff --git a/interface/src/components/layout/Layout.tsx b/interface/src/components/layout/Layout.tsx index 70c94100a..711cf8ad1 100644 --- a/interface/src/components/layout/Layout.tsx +++ b/interface/src/components/layout/Layout.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useState } from 'react'; +import { memo, useCallback, useEffect, useMemo, useState } from 'react'; import type { FC } from 'react'; import { useLocation } from 'react-router'; @@ -13,22 +13,26 @@ import { LayoutContext } from './context'; export const DRAWER_WIDTH = 210; -const Layout: FC = ({ children }) => { +const LayoutComponent: FC = ({ children }) => { const [mobileOpen, setMobileOpen] = useState(false); const [title, setTitle] = useState(PROJECT_NAME); const { pathname } = useLocation(); - const handleDrawerToggle = () => { - setMobileOpen(!mobileOpen); - }; + // Memoize drawer toggle handler to prevent unnecessary re-renders + const handleDrawerToggle = useCallback(() => { + setMobileOpen((prev) => !prev); + }, []); - useEffect(() => setMobileOpen(false), [pathname]); + // Close drawer when route changes + useEffect(() => { + setMobileOpen(false); + }, [pathname]); - // cache the object to prevent unnecessary re-renders - const obj = useMemo(() => ({ title, setTitle }), [title]); + // Memoize context value to prevent unnecessary re-renders + const contextValue = useMemo(() => ({ title, setTitle }), [title]); return ( - + @@ -39,4 +43,6 @@ const Layout: FC = ({ children }) => { ); }; +const Layout = memo(LayoutComponent); + export default Layout; diff --git a/interface/src/components/layout/LayoutAppBar.tsx b/interface/src/components/layout/LayoutAppBar.tsx index bc0e84f46..6bea11462 100644 --- a/interface/src/components/layout/LayoutAppBar.tsx +++ b/interface/src/components/layout/LayoutAppBar.tsx @@ -1,8 +1,10 @@ +import { memo, useCallback, useMemo } from 'react'; import { Link, useLocation, useNavigate } from 'react-router'; import ArrowBackIcon from '@mui/icons-material/ArrowBack'; import MenuIcon from '@mui/icons-material/Menu'; import { AppBar, IconButton, Toolbar, Typography } from '@mui/material'; +import type { SxProps, Theme } from '@mui/material/styles'; import { useI18nContext } from 'i18n/i18n-react'; @@ -13,30 +15,47 @@ interface LayoutAppBarProps { onToggleDrawer: () => void; } -const LayoutAppBar = ({ title, onToggleDrawer }: LayoutAppBarProps) => { +// Extract static styles +const appBarStyles: SxProps = { + width: { md: `calc(100% - ${DRAWER_WIDTH}px)` }, + ml: { md: `${DRAWER_WIDTH}px` }, + boxShadow: 'none', + backgroundColor: '#2e586a' +}; + +const menuButtonStyles: SxProps = { + mr: 2, + display: { md: 'none' } +}; + +const backButtonStyles: SxProps = { + mr: 1, + fontSize: 20, + verticalAlign: 'middle' +}; + +const LayoutAppBarComponent = ({ title, onToggleDrawer }: LayoutAppBarProps) => { const { LL } = useI18nContext(); const navigate = useNavigate(); + const location = useLocation(); - const pathnames = useLocation() - .pathname.split('/') - .filter((x) => x); + const pathnames = useMemo( + () => location.pathname.split('/').filter((x) => x), + [location.pathname] + ); + + const handleBackClick = useCallback(() => { + void navigate('/' + pathnames[0]); + }, [navigate, pathnames]); return ( - + @@ -44,10 +63,10 @@ const LayoutAppBar = ({ title, onToggleDrawer }: LayoutAppBarProps) => { {pathnames.length > 1 && ( <> navigate('/' + pathnames[0])} + onClick={handleBackClick} > @@ -70,4 +89,6 @@ const LayoutAppBar = ({ title, onToggleDrawer }: LayoutAppBarProps) => { ); }; +const LayoutAppBar = memo(LayoutAppBarComponent); + export default LayoutAppBar; diff --git a/interface/src/components/layout/LayoutDrawer.tsx b/interface/src/components/layout/LayoutDrawer.tsx index 320208129..8c85f666e 100644 --- a/interface/src/components/layout/LayoutDrawer.tsx +++ b/interface/src/components/layout/LayoutDrawer.tsx @@ -1,3 +1,5 @@ +import { memo, useMemo } from 'react'; + import { Box, Divider, Drawer, Toolbar, Typography, styled } from '@mui/material'; import { PROJECT_NAME } from 'env'; @@ -21,19 +23,23 @@ interface LayoutDrawerProps { onClose: () => void; } -const LayoutDrawerProps = ({ mobileOpen, onClose }: LayoutDrawerProps) => { - const drawer = ( - <> - - - - {PROJECT_NAME} - - - - - - +const LayoutDrawerComponent = ({ mobileOpen, onClose }: LayoutDrawerProps) => { + // Memoize drawer content to prevent unnecessary re-renders + const drawer = useMemo( + () => ( + <> + + + + {PROJECT_NAME} + + + + + + + ), + [] ); return ( @@ -66,4 +72,6 @@ const LayoutDrawerProps = ({ mobileOpen, onClose }: LayoutDrawerProps) => { ); }; -export default LayoutDrawerProps; +const LayoutDrawer = memo(LayoutDrawerComponent); + +export default LayoutDrawer; diff --git a/interface/src/components/layout/LayoutMenu.tsx b/interface/src/components/layout/LayoutMenu.tsx index c9f7aca68..d37c96b5c 100644 --- a/interface/src/components/layout/LayoutMenu.tsx +++ b/interface/src/components/layout/LayoutMenu.tsx @@ -1,4 +1,4 @@ -import { useContext, useState } from 'react'; +import { memo, useCallback, useContext, useState } from 'react'; import AccountCircleIcon from '@mui/icons-material/AccountCircle'; import AssessmentIcon from '@mui/icons-material/Assessment'; @@ -7,47 +7,24 @@ import ConstructionIcon from '@mui/icons-material/Construction'; import KeyboardArrowDown from '@mui/icons-material/KeyboardArrowDown'; import LiveHelpIcon from '@mui/icons-material/LiveHelp'; import MoreTimeIcon from '@mui/icons-material/MoreTime'; -import PersonIcon from '@mui/icons-material/Person'; import PlaylistAddIcon from '@mui/icons-material/PlaylistAdd'; import SensorsIcon from '@mui/icons-material/Sensors'; import SettingsIcon from '@mui/icons-material/Settings'; import StarIcon from '@mui/icons-material/Star'; -import { - Avatar, - Box, - Button, - Divider, - List, - ListItem, - ListItemButton, - ListItemIcon, - ListItemText, - Popover -} from '@mui/material'; +import { Box, Divider, List, ListItemButton, ListItemText } from '@mui/material'; -import { LanguageSelector } from 'components/inputs'; import LayoutMenuItem from 'components/layout/LayoutMenuItem'; import { AuthenticatedContext } from 'contexts/authentication'; import { useI18nContext } from 'i18n/i18n-react'; -const LayoutMenu = () => { - const { me, signOut } = useContext(AuthenticatedContext); +const LayoutMenuComponent = () => { + const { me } = useContext(AuthenticatedContext); const { LL } = useI18nContext(); - - const [anchorEl, setAnchorEl] = useState(null); - - const open = Boolean(anchorEl); - const id = anchorEl ? 'app-menu-popover' : undefined; - const [menuOpen, setMenuOpen] = useState(true); - const handleClick = (event: React.MouseEvent) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; + const handleMenuToggle = useCallback(() => { + setMenuOpen((prev) => !prev); + }, []); return ( <> @@ -64,28 +41,13 @@ const LayoutMenu = () => { > setMenuOpen(!menuOpen)} + onClick={handleMenuToggle} sx={{ - pt: 2.5, - pb: menuOpen ? 0 : 2.5, '&:hover, &:focus': { '& svg': { opacity: 1 } } }} > { to="/settings" /> + + - - - - - - - - {me.username} - - - - - - - - - - - - - - - - - ); }; +const LayoutMenu = memo(LayoutMenuComponent); + export default LayoutMenu; diff --git a/interface/src/components/layout/LayoutMenuItem.tsx b/interface/src/components/layout/LayoutMenuItem.tsx index 99b6278bd..b19652cca 100644 --- a/interface/src/components/layout/LayoutMenuItem.tsx +++ b/interface/src/components/layout/LayoutMenuItem.tsx @@ -1,7 +1,8 @@ +import { memo, useMemo } from 'react'; import { Link, useLocation } from 'react-router'; import { ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; -import type { SvgIconProps } from '@mui/material'; +import type { SvgIconProps, SxProps, Theme } from '@mui/material'; import { routeMatches } from 'utils'; @@ -12,7 +13,7 @@ interface LayoutMenuItemProps { disabled?: boolean; } -const LayoutMenuItem = ({ +const LayoutMenuItemComponent = ({ icon: Icon, label, to, @@ -20,18 +21,68 @@ const LayoutMenuItem = ({ }: LayoutMenuItemProps) => { const { pathname } = useLocation(); - const selected = routeMatches(to, pathname); + const selected = useMemo(() => routeMatches(to, pathname), [to, pathname]); + + // Memoize dynamic styles based on selected state + const buttonStyles: SxProps = useMemo( + () => ({ + transition: 'all 0.05s cubic-bezier(0.55, 0.085, 0.68, 0.53)', + backgroundColor: selected ? 'rgba(144, 202, 249, 0.1)' : 'transparent', + borderRadius: '8px', + margin: '2px 8px', + '&:hover': { + backgroundColor: 'rgba(68, 82, 211, 0.39)' + }, + '&::before': { + content: '""', + position: 'absolute', + left: 0, + top: 0, + bottom: 0, + width: selected ? '4px' : '0px', + backgroundColor: '#90caf9', + borderRadius: '0 2px 2px 0', + transition: 'width 0.05s cubic-bezier(0.55, 0.085, 0.68, 0.53)' + } + }), + [selected] + ); + + const iconStyles: SxProps = useMemo( + () => ({ + color: selected ? '#90caf9' : '#9e9e9e', + transition: 'color 0.05s cubic-bezier(0.55, 0.085, 0.68, 0.53)', + transform: selected ? 'scale(1.1)' : 'scale(1)', + transitionProperty: 'color, transform' + }), + [selected] + ); + + const textStyles: SxProps = useMemo( + () => ({ + color: selected ? '#90caf9' : '#f5f5f5', + transition: 'color 0.05s cubic-bezier(0.55, 0.085, 0.68, 0.53)', + transitionProperty: 'color, font-weight' + }), + [selected] + ); return ( - - + + - - {label} - + {label} ); }; +const LayoutMenuItem = memo(LayoutMenuItemComponent); + export default LayoutMenuItem; diff --git a/interface/src/components/layout/ListMenuItem.tsx b/interface/src/components/layout/ListMenuItem.tsx index 0a8df795b..db92093de 100644 --- a/interface/src/components/layout/ListMenuItem.tsx +++ b/interface/src/components/layout/ListMenuItem.tsx @@ -1,3 +1,5 @@ +import { memo } from 'react'; +import type { CSSProperties } from 'react'; import { Link } from 'react-router'; import NavigateNextIcon from '@mui/icons-material/NavigateNext'; @@ -20,8 +22,14 @@ interface ListMenuItemProps { disabled?: boolean; } -function RenderIcon({ icon: Icon, bgcolor, label, text }: ListMenuItemProps) { - return ( +const iconStyles: CSSProperties = { + justifyContent: 'right', + color: 'lightblue', + verticalAlign: 'middle' +}; + +const RenderIcon = memo( + ({ icon: Icon, bgcolor, label, text }: ListMenuItemProps) => ( <> @@ -30,8 +38,8 @@ function RenderIcon({ icon: Icon, bgcolor, label, text }: ListMenuItemProps) { - ); -} + ) +); const LayoutMenuItem = ({ icon, @@ -46,27 +54,31 @@ const LayoutMenuItem = ({ + } > - + ) : ( - + )} ); -export default LayoutMenuItem; +export default memo(LayoutMenuItem); diff --git a/interface/src/components/loading/FormLoader.tsx b/interface/src/components/loading/FormLoader.tsx index b44cbdcea..762909bc4 100644 --- a/interface/src/components/loading/FormLoader.tsx +++ b/interface/src/components/loading/FormLoader.tsx @@ -1,3 +1,5 @@ +import { memo } from 'react'; + import RefreshIcon from '@mui/icons-material/Refresh'; import { Box, Button, CircularProgress } from '@mui/material'; @@ -9,12 +11,12 @@ interface FormLoaderProps { onRetry?: () => void; } -const FormLoader = ({ errorMessage, onRetry }: FormLoaderProps) => { +const FormLoaderComponent = ({ errorMessage, onRetry }: FormLoaderProps) => { const { LL } = useI18nContext(); if (errorMessage) { return ( - + {onRetry && ( - @@ -38,4 +39,4 @@ const BlockNavigation = ({ blocker }: { blocker: Blocker }) => { ); }; -export default BlockNavigation; +export default memo(BlockNavigation); diff --git a/interface/src/components/routing/RequireAdmin.tsx b/interface/src/components/routing/RequireAdmin.tsx index 5c363a30a..20be11eda 100644 --- a/interface/src/components/routing/RequireAdmin.tsx +++ b/interface/src/components/routing/RequireAdmin.tsx @@ -1,4 +1,4 @@ -import { useContext } from 'react'; +import { memo, useContext } from 'react'; import type { FC } from 'react'; import { Navigate } from 'react-router'; @@ -14,4 +14,4 @@ const RequireAdmin: FC = ({ children }) => { ); }; -export default RequireAdmin; +export default memo(RequireAdmin); diff --git a/interface/src/components/routing/RequireAuthenticated.tsx b/interface/src/components/routing/RequireAuthenticated.tsx index 29a352158..36a32f0b3 100644 --- a/interface/src/components/routing/RequireAuthenticated.tsx +++ b/interface/src/components/routing/RequireAuthenticated.tsx @@ -1,4 +1,4 @@ -import { useContext, useEffect } from 'react'; +import { memo, useContext, useEffect } from 'react'; import type { FC } from 'react'; import { Navigate, useLocation } from 'react-router'; @@ -18,7 +18,7 @@ const RequireAuthenticated: FC = ({ children }) => { if (!authenticationContext.me) { storeLoginRedirect(location); } - }); + }, [authenticationContext.me, location]); return authenticationContext.me ? ( = ({ children }) => { ); }; -export default RequireAuthenticated; +export default memo(RequireAuthenticated); diff --git a/interface/src/components/routing/RequireUnauthenticated.tsx b/interface/src/components/routing/RequireUnauthenticated.tsx index 03632a85f..4f3a84875 100644 --- a/interface/src/components/routing/RequireUnauthenticated.tsx +++ b/interface/src/components/routing/RequireUnauthenticated.tsx @@ -1,4 +1,4 @@ -import { useContext } from 'react'; +import { memo, useContext } from 'react'; import type { FC } from 'react'; import { Navigate } from 'react-router'; @@ -16,4 +16,4 @@ const RequireUnauthenticated: FC = ({ children }) => { ); }; -export default RequireUnauthenticated; +export default memo(RequireUnauthenticated); diff --git a/interface/src/components/routing/RouterTabs.tsx b/interface/src/components/routing/RouterTabs.tsx index 67e76c297..9a3d7d31e 100644 --- a/interface/src/components/routing/RouterTabs.tsx +++ b/interface/src/components/routing/RouterTabs.tsx @@ -1,3 +1,4 @@ +import { memo, useCallback } from 'react'; import type { FC } from 'react'; import { useNavigate } from 'react-router'; @@ -15,9 +16,12 @@ const RouterTabs: FC = ({ value, children }) => { const theme = useTheme(); const smallDown = useMediaQuery(theme.breakpoints.down('sm')); - const handleTabChange = (_event: unknown, path: string) => { - void navigate(path); - }; + const handleTabChange = useCallback( + (_event: unknown, path: string) => { + void navigate(path); + }, + [navigate] + ); return ( = ({ value, children }) => { ); }; -export default RouterTabs; +export default memo(RouterTabs); diff --git a/interface/src/components/routing/authentication.ts b/interface/src/components/routing/authentication.ts index 58f92024c..51c01fb94 100644 --- a/interface/src/components/routing/authentication.ts +++ b/interface/src/components/routing/authentication.ts @@ -1,6 +1,5 @@ import type { Path } from 'react-router'; -import type * as H from 'history'; import { jwtDecode } from 'jwt-decode'; import type { Me, SignInRequest, SignInResponse } from 'types'; @@ -14,11 +13,17 @@ export const verifyAuthorization = () => export const signIn = (request: SignInRequest) => alovaInstance.Post('/rest/signIn', request); +// Cache storage reference to avoid repeated checks +let cachedStorage: Storage | undefined; + export function getStorage() { - return localStorage || sessionStorage; + if (!cachedStorage) { + cachedStorage = localStorage || sessionStorage; + } + return cachedStorage; } -export function storeLoginRedirect(location?: H.Location) { +export function storeLoginRedirect(location?: { pathname: string; search: string }) { if (location) { getStorage().setItem(SIGN_IN_PATHNAME, location.pathname); getStorage().setItem(SIGN_IN_SEARCH, location.search); @@ -36,7 +41,7 @@ export function fetchLoginRedirect(): Partial { clearLoginRedirect(); return { pathname: signInPathname || `/dashboard`, - search: (signInPathname && signInSearch) || undefined + ...(signInPathname && signInSearch && { search: signInSearch }) }; } diff --git a/interface/src/components/upload/DragNdrop.tsx b/interface/src/components/upload/DragNdrop.tsx index e2cfa2abc..1449f5e6c 100644 --- a/interface/src/components/upload/DragNdrop.tsx +++ b/interface/src/components/upload/DragNdrop.tsx @@ -1,16 +1,59 @@ // Code inspired by Prince Azubuike from https://medium.com/@dprincecoder/creating-a-drag-and-drop-file-upload-component-in-react-a-step-by-step-guide-4d93b6cc21e0 -import { type ChangeEvent, useRef, useState } from 'react'; +import { + type ChangeEvent, + type DragEvent, + type MouseEvent, + useRef, + useState +} from 'react'; import CancelIcon from '@mui/icons-material/Cancel'; import CloudUploadIcon from '@mui/icons-material/CloudUpload'; import UploadIcon from '@mui/icons-material/Upload'; -import { Box, Button } from '@mui/material'; +import { Box, Button, Typography, styled } from '@mui/material'; import { useI18nContext } from 'i18n/i18n-react'; -import './dragNdrop.css'; +const DocumentUploader = styled(Box)<{ active?: boolean }>(({ theme, active }) => ({ + border: `2px dashed ${active ? '#6dc24b' : '#4282fe'}`, + backgroundColor: '#2e3339', + padding: theme.spacing(1.25), + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + position: 'relative', + borderRadius: theme.spacing(1), + cursor: 'pointer', + minHeight: '120px', + transition: 'border-color 0.2s ease-in-out' +})); -const DragNdrop = ({ text, onFileSelected }) => { +const UploadInfo = styled(Box)({ + display: 'flex', + alignItems: 'center' +}); + +const FileInfo = styled(Box)({ + display: 'flex', + flexDirection: 'column', + width: '100%', + justifyContent: 'space-between', + alignItems: 'center' +}); + +const FileName = styled(Typography)(({ theme }) => ({ + fontSize: '14px', + color: '#6dc24b', + margin: theme.spacing(1, 0) +})); + +interface DragNdropProps { + text: string; + onFileSelected: (file: File) => void; +} + +const DragNdrop = ({ text, onFileSelected }: DragNdropProps) => { const [file, setFile] = useState(); const [dragged, setDragged] = useState(false); const inputRef = useRef(null); @@ -28,14 +71,17 @@ const DragNdrop = ({ text, onFileSelected }) => { }; const handleFileChange = (e: ChangeEvent) => { - if (!e.target.files) { + if (!e.target.files || e.target.files.length === 0) { return; } - checkFileExtension(e.target.files[0]); + const selectedFile = e.target.files[0]; + if (selectedFile) { + checkFileExtension(selectedFile); + } e.target.value = ''; // this is to allow the same file to be selected again }; - const handleDrop = (event) => { + const handleDrop = (event: DragEvent) => { event.preventDefault(); const droppedFiles = event.dataTransfer.files; if (droppedFiles.length > 0) { @@ -43,38 +89,40 @@ const DragNdrop = ({ text, onFileSelected }) => { } }; - const handleRemoveFile = (event) => { + const handleRemoveFile = (event: MouseEvent) => { event.stopPropagation(); setFile(undefined); setDragged(false); }; - const handleUploadClick = (event) => { + const handleUploadClick = (event: MouseEvent) => { event.stopPropagation(); - onFileSelected(file); + if (file) { + onFileSelected(file); + } }; const handleBrowseClick = () => { inputRef.current?.click(); }; - const handleDragOver = (event) => { + const handleDragOver = (event: DragEvent) => { event.preventDefault(); // prevent file from being opened setDragged(true); }; return ( -
setDragged(false)} onClick={handleBrowseClick} > -
+ -

{text}

-
+ {text} + { {file && ( <> -
-

{file.name}

-
+ + {file.name} +
+ ); }; diff --git a/interface/src/components/upload/SingleUpload.tsx b/interface/src/components/upload/SingleUpload.tsx index 912e4aa17..5ad6941f2 100644 --- a/interface/src/components/upload/SingleUpload.tsx +++ b/interface/src/components/upload/SingleUpload.tsx @@ -12,7 +12,12 @@ import { useI18nContext } from 'i18n/i18n-react'; import DragNdrop from './DragNdrop'; import { LinearProgressWithLabel } from './LinearProgressWithLabel'; -const SingleUpload = ({ text, doRestart }) => { +interface SingleUploadProps { + text: string; + doRestart: () => void; +} + +const SingleUpload = ({ text, doRestart }: SingleUploadProps) => { const [md5, setMd5] = useState(); const [file, setFile] = useState(); const { LL } = useI18nContext(); @@ -25,8 +30,8 @@ const SingleUpload = ({ text, doRestart }) => { } = useRequest(SystemApi.uploadFile, { immediate: false }).onSuccess(({ data }) => { - if (data) { - setMd5(data.md5 as string); + if (data && typeof data === 'object' && 'md5' in data) { + setMd5((data as { md5: string }).md5); toast.success(LL.UPLOAD() + ' MD5 ' + LL.SUCCESSFUL()); setFile(undefined); } else { @@ -34,16 +39,19 @@ const SingleUpload = ({ text, doRestart }) => { } }); - useEffect(async () => { - if (file) { - await sendUpload(file).catch((error: Error) => { - if (error.message === 'The user aborted a request') { - toast.warning(LL.UPLOAD() + ' ' + LL.ABORTED()); - } else { - toast.warning('Invalid file extension or incompatible bin file'); - } - }); - } + useEffect(() => { + const uploadFile = async () => { + if (file) { + await sendUpload(file).catch((error: Error) => { + if (error.message.includes('The user aborted a request')) { + toast.warning(LL.UPLOAD() + ' ' + LL.ABORTED()); + } else { + toast.warning('Invalid file extension or incompatible bin file'); + } + }); + } + }; + void uploadFile(); }, [file]); return ( diff --git a/interface/src/components/upload/dragNdrop.css b/interface/src/components/upload/dragNdrop.css deleted file mode 100644 index f239b9831..000000000 --- a/interface/src/components/upload/dragNdrop.css +++ /dev/null @@ -1,33 +0,0 @@ -.document-uploader { - border: 2px dashed #4282fe; - background-color: #2e3339; - padding: 10px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - position: relative; - border-radius: 8px; - cursor: pointer; - - &.active { - border-color: #6dc24b; - } - - .upload-info { - display: flex; - align-items: center; - } - - .file-info { - display: flex; - flex-direction: column; - width: 100%; - justify-content: space-between; - align-items: center; - p { - font-size: 14px; - color: #6dc24b; - } - } -} diff --git a/interface/src/contexts/authentication/Authentication.tsx b/interface/src/contexts/authentication/Authentication.tsx index d3aef600d..dba45cad7 100644 --- a/interface/src/contexts/authentication/Authentication.tsx +++ b/interface/src/contexts/authentication/Authentication.tsx @@ -69,7 +69,12 @@ const Authentication: FC = ({ children }) => { // cache object to prevent re-renders const obj = useMemo( - () => ({ signIn, signOut, me, refresh }), + () => ({ + signIn, + signOut, + refresh, + ...(me && { me }) + }), [signIn, signOut, me, refresh] ); diff --git a/interface/src/i18n/cz/index.ts b/interface/src/i18n/cz/index.ts index 396a13b62..efc1c6887 100644 --- a/interface/src/i18n/cz/index.ts +++ b/interface/src/i18n/cz/index.ts @@ -40,7 +40,7 @@ const cz: Translation = { RUN_COMMAND: 'Zavolat příkaz', CHANGE_VALUE: 'Změnit hodnotu', CANCEL: 'Zrušit', - RESET: 'Resetovat', + REMOVE_ALL: 'Odebrat vše', APPLY_CHANGES: 'Použít změny ({0})', UPDATE: 'Aktualizovat', EXECUTE: 'Provést', @@ -60,7 +60,6 @@ const cz: Translation = { DUTY_CYCLE: 'Pracovní cyklus', UNIT: 'Jednotka', STARTVALUE: 'Počáteční hodnota', - WARN_GPIO: 'Upozornění: buďte opatrní při přiřazování GPIO!', EDIT: 'Upravit', SENSOR: 'Senzor', TEMP_SENSOR: 'Teplotní senzor', @@ -153,7 +152,7 @@ const cz: Translation = { SET_ALL: 'nastavit vše', OPTIONS: 'Možnosti', NAME: 'Název', - CUSTOMIZATIONS_RESET: 'Opravdu chcete odstranit všechna přizpůsobení včetně vlastních nastavení teplotních a analogových senzorů?', + CUSTOMIZATIONS_RESET: 'Opravdu chcete odstranit všechna přizpůsobení?', SUPPORT_INFORMATION: 'Podpora', HELP_INFORMATION_1: 'Navštivte online wiki pro pokyny, jak konfigurovat EMS-ESP', HELP_INFORMATION_2: 'Pro živý chat s komunitou se připojte k našemu serveru Discord', @@ -162,6 +161,7 @@ const cz: Translation = { UPLOAD: 'Nahrát', DOWNLOAD: '{{S|s|s}}táhnout', INSTALL: 'Instalovat', + REINSTALL: 'Znovu instalovat', ABORTED: 'přerušeno', FAILED: 'neúspěšné', SUCCESSFUL: 'úspěšné', @@ -186,8 +186,9 @@ const cz: Translation = { BUFFER_SIZE: 'Maximální velikost vyrovnávací paměti', COMPACT: 'Kompaktní', DOWNLOAD_SETTINGS_TEXT: 'Vytvořte zálohu svého nastavení a konfigurace', + DOWNLOAD_SETTINGS_TEXT2: 'Exportovat všechna data', UPLOAD_TEXT: 'Nahrajte nový soubor firmwaru (.bin) nebo záložní soubor (.json)', - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + UPLOAD_DROP_TEXT: 'Přetáhněte soubor sem nebo klikněte pro výběr', ERROR: 'Neočekávaná chyba, zkuste to prosím znovu', TIME_SET: 'Čas nastaven', MANAGE_USERS: 'Spravovat uživatele', @@ -331,28 +332,31 @@ const cz: Translation = { ALLVALUES: 'Všechny hodnoty', SPECIAL_FUNCTIONS: 'Speciální funkce', WAIT_FIRMWARE: 'Firmware se nahrává a instaluje', - INSTALL_VERSION: 'Tímto se instalovat verze {0}. Jste si jistí?', - UPGRADE_AVAILABLE: 'Je k dispozici aktualizace firmwaru!', - LATEST_VERSION: 'Používáte nejnovější verzi firmwaru', + INSTALL_VERSION: 'Tímto se {0} verze {1}. Jste si jistí?', + UPDATE_AVAILABLE: 'aktualizace dostupná', + LATEST_VERSION: 'Používáte nejnovější verzi {0}firmwaru', PLEASE_WAIT: 'Prosím čekejte', - RESTARTING_PRE: 'Inicializace', + RESTARTING_PRE: 'Bootování', RESTARTING_POST: 'Příprava', AUTO_SCROLL: 'Automatické rolování', DASHBOARD: 'Dashboard', DEVELOPER_MODE: 'Režim vývojáře', - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate + BYTES: 'Bajty', + BITMASK: 'Bit Mask', DUPLICATE: 'Duplikát', - UPGRADE: 'Upgrade', DASHBOARD_1: 'Všechny aktivní entity EMS jsou označené jako oblíbené. Všechny vlastní entity, harmonogramy a externí sensory jsou zobrazeny níže.', - NO_DATA_1: 'Nebyly nalezeny žádné oblíbené entity. Použijte', - NO_DATA_2: 'modul sloužící k jejich výběru.', - NO_DATA_3: 'Pro zobrazení všech dostupných entit navštivte', + NO_DATA_1: 'Nebyly nalezeny žádné oblíbené entity. Použijte modul', + NO_DATA_2: 'pro jejich výběr.', + NO_DATA_3: 'Pro zobrazení všech dostupných entit navštivte stránku', THIS_VERSION: 'Tato verze', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ sestavení', - REINSTALL: 'Přeinstalovat', INTERNET_CONNECTION_REQUIRED: 'Pro automatickou kontrolu a instalaci aktualizací je třeba internetové připojení', + SWITCH_RELEASE_TYPE: 'Přepnout na {0} verzi', + FIRMWARE_VERSION_INFO: 'Informace o verzi firmwaru', + NO_DATA: 'Žádná data', + USER_PROFILE: 'Uživatelský profil', + STORED_VERSIONS: 'Uložené verze' }; export default cz; diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index 2df6cd86f..8aa4e1dc8 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -40,9 +40,9 @@ const de: Translation = { RUN_COMMAND: 'Befehl ausführen', CHANGE_VALUE: 'Wert ändern', CANCEL: 'Abbrechen', - RESET: 'Zurücksetzen', + REMOVE_ALL: 'Alles entfernen', APPLY_CHANGES: 'Änderungen anwenden ({0})', - UPDATE: 'Update', + UPDATE: 'Aktualisieren', EXECUTE: 'Ausführen', REMOVE: 'Entfernen', PROBLEM_UPDATING: 'Problem beim Aktualisieren', @@ -60,7 +60,6 @@ const de: Translation = { DUTY_CYCLE: 'Arbeitszyklus', UNIT: 'Maßeinheit', STARTVALUE: 'Startwert', - WARN_GPIO: 'Warnung: Vorsicht bei der korrekten Wahl des GPIO!', EDIT: 'Editiere', SENSOR: 'Sensor', TEMP_SENSOR: 'Temperatursensor', @@ -153,15 +152,16 @@ const de: Translation = { SET_ALL: 'Setzen Sie alle', OPTIONS: 'Optionen', NAME: 'Name', - CUSTOMIZATIONS_RESET: 'Möchten Sie wirklich alle Anpassungen entfernen, einschließlich der benutzerdefinierten Einstellungen der Temperatur- und Analogsensoren?', + CUSTOMIZATIONS_RESET: 'Möchten Sie wirklich alle Anpassungen entfernen?', SUPPORT_INFORMATION: 'Unterstützende Informationen', HELP_INFORMATION_1: 'EMS-ESP Konfigurationsanweisungen und mehr finden Sie im Online-Wiki', HELP_INFORMATION_2: 'Für einen Live-Community-Chat besuchen Sie unseren Discord-Server', HELP_INFORMATION_3: 'Um neue Funktionen anzufragen oder Fehler zu melden, eröffnen Sie ein Issue auf GitHub', HELP_INFORMATION_4: 'Bitte laden Sie die Systemdetails und hängen Sie sie an das Support-Issue an', UPLOAD: 'Hochladen', - DOWNLOAD: '{{H|h|h}}erunterladen', + DOWNLOAD: '{{Herunterladen|heruntergeladen|}}', INSTALL: 'Installieren', + REINSTALL: 'Neu installieren', ABORTED: 'abgebrochen', FAILED: 'gescheitert', SUCCESSFUL: 'erfolgreich', @@ -186,6 +186,7 @@ const de: Translation = { BUFFER_SIZE: 'Max. Puffergröße', COMPACT: 'Kompakte Darstellung', DOWNLOAD_SETTINGS_TEXT: 'Erstellen Sie eine Sicherung Ihrer Konfigurationen und Einstellungen', + DOWNLOAD_SETTINGS_TEXT2: 'Exportiere alle Daten', UPLOAD_TEXT: 'Laden Sie eine neue Firmware-Datei (.bin) oder eine Sicherungsdatei (.json) hoch', UPLOAD_DROP_TEXT: 'Legen Sie eine Firmware-Datei (.bin) ab oder klicken Sie hier', ERROR: 'Unerwarteter Fehler, bitte versuchen Sie es erneut.', @@ -331,11 +332,11 @@ const de: Translation = { ALLVALUES: 'Alle Werte', SPECIAL_FUNCTIONS: 'Sonderfunktionen', WAIT_FIRMWARE: 'Die Firmware wird hochgeladen und installiert.', - INSTALL_VERSION: 'Dadurch wird die Version {0} heruntergeladen. Sind Sie sicher?', - UPGRADE_AVAILABLE: 'Es ist ein Firmware-Upgrade verfügbar.', - LATEST_VERSION: 'Sie verwenden die neueste Firmware-Version', + INSTALL_VERSION: 'Dadurch wird die Version {1} {0}. Sind Sie sicher?', + UPDATE_AVAILABLE: 'Firmware-Update verfügbar', + LATEST_VERSION: 'Sie verwenden die neueste {0} Firmware-Version', PLEASE_WAIT: 'Bitte warten', - RESTARTING_PRE: 'Initialisierung', + RESTARTING_PRE: 'Booten', RESTARTING_POST: 'Vorbereitung', AUTO_SCROLL: 'Automatisches Scrollen', DASHBOARD: 'Dashboard', @@ -343,7 +344,6 @@ const de: Translation = { BYTES: 'Bytes', BITMASK: 'Bit Maske', DUPLICATE: 'Kopieren', - UPGRADE: 'Aktualisieren', DASHBOARD_1: 'Alle EMS-Entitäten, die aktiv und als Favorit markiert sind, sowie alle benutzerdefinierten Entitäten, Zeitpläne und externen Sensordaten werden unten angezeigt.', NO_DATA_1: 'Keine favorisierten EMS-Entitäten gefunden! Verwenden Sie das Modul', NO_DATA_2: ', um sie zu markieren.', @@ -351,8 +351,12 @@ const de: Translation = { THIS_VERSION: 'Diese Version', PLATFORM: 'Plattform', RELEASE_TYPE: 'Release Typ', - REINSTALL: 'Neu installieren', - INTERNET_CONNECTION_REQUIRED: 'Internetverbindung erforderlich für automatische Version-Überprüfung und -Aktualisierung', + INTERNET_CONNECTION_REQUIRED: 'Für die automatische Versionsprüfung und Aktualisierung ist eine Internetverbindung erforderlich', + SWITCH_RELEASE_TYPE: 'Zum {0}-Release wechseln', + FIRMWARE_VERSION_INFO: 'Firmware-Versionsinformation', + NO_DATA: 'Keine Daten', + USER_PROFILE: 'Benutzerprofil', + STORED_VERSIONS: 'Gespeicherte Versionen' }; export default de; diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index f14092f29..bdb05a480 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -40,7 +40,7 @@ const en: Translation = { RUN_COMMAND: 'Call Command', CHANGE_VALUE: 'Change Value', CANCEL: 'Cancel', - RESET: 'Reset', + REMOVE_ALL: 'Remove All', APPLY_CHANGES: 'Apply Changes ({0})', UPDATE: 'Update', EXECUTE: 'Execute', @@ -60,7 +60,6 @@ const en: Translation = { DUTY_CYCLE: 'Duty Cycle', UNIT: 'UoM', STARTVALUE: 'Start Value', - WARN_GPIO: 'Warning: be careful when assigning a GPIO!', EDIT: 'Edit', SENSOR: 'Sensor', TEMP_SENSOR: 'Temperature Sensor', @@ -153,7 +152,7 @@ const en: Translation = { SET_ALL: 'set all', OPTIONS: 'Options', NAME: 'Name', - CUSTOMIZATIONS_RESET: 'Are you sure you want remove all customizations including the custom settings of the Temperature and Analog sensors?', + CUSTOMIZATIONS_RESET: 'Are you sure you want remove all the customizations?', SUPPORT_INFORMATION: 'Support Information', HELP_INFORMATION_1: 'Visit the online wiki to get instructions on how to configure EMS-ESP', HELP_INFORMATION_2: 'For live community chat join our Discord server', @@ -162,6 +161,7 @@ const en: Translation = { UPLOAD: 'Upload', DOWNLOAD: '{{D|d|d}}ownload', INSTALL: 'Install', + REINSTALL: 'Reinstall', ABORTED: 'aborted', FAILED: 'failed', SUCCESSFUL: 'successful', @@ -179,13 +179,14 @@ const en: Translation = { DEVELOPMENT: 'Development', UPTIME: 'System Uptime', FREE_MEMORY: 'Free Memory', - PSRAM: 'PSRAM (Size / Free)', - FLASH: 'Flash Chip (Size , Speed)', - APPSIZE: 'Application (Partition: Used / Free)', - FILESYSTEM: 'File System (Used / Free)', + PSRAM: 'PSRAM (size / free)', + FLASH: 'Flash Chip (size , speed)', + APPSIZE: 'Application (partition: used / free)', + FILESYSTEM: 'File System (used / free)', BUFFER_SIZE: 'Max Buffer Size', COMPACT: 'Compact', DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', + DOWNLOAD_SETTINGS_TEXT2: 'Export all data', UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', ERROR: 'Unexpected Error, please try again', @@ -331,11 +332,11 @@ const en: Translation = { ALLVALUES: 'All Values', SPECIAL_FUNCTIONS: 'Special Functions', WAIT_FIRMWARE: 'Firmware is uploading and installing', - INSTALL_VERSION: 'This will install version {0}. Are you sure?', - UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', - LATEST_VERSION: 'You are using the latest firmware version', + INSTALL_VERSION: 'This will {0} version {1}. Are you sure?', + UPDATE_AVAILABLE: 'update available', + LATEST_VERSION: 'You are using the latest {0} firmware version', PLEASE_WAIT: 'Please wait', - RESTARTING_PRE: 'Initializing', + RESTARTING_PRE: 'Booting', RESTARTING_POST: 'Preparing', AUTO_SCROLL: 'Auto Scroll', DASHBOARD: 'Dashboard', @@ -344,15 +345,18 @@ const en: Translation = { BYTES: 'Bytes', BITMASK: 'Bit Mask', DUPLICATE: 'Duplicate', - UPGRADE: 'Upgrade', NO_DATA_1: 'No favorite EMS entities found yet. Use the', NO_DATA_2: 'module to mark them.', NO_DATA_3: 'To see all available entities go to', THIS_VERSION: 'This Version', PLATFORM: 'Platform', RELEASE_TYPE: 'Release Type', - REINSTALL: 'Re-install', INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + SWITCH_RELEASE_TYPE: 'Switch to {0} release', + FIRMWARE_VERSION_INFO: 'Firmware Version Information', + NO_DATA: 'No data', + USER_PROFILE: 'User Profile', + STORED_VERSIONS: 'Stored Versions' }; export default en; diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index 973fd1230..008df1fcd 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -40,10 +40,10 @@ const fr: Translation = { RUN_COMMAND: 'Lancer une commande', CHANGE_VALUE: 'Changer la valeur', CANCEL: 'Annuler', - RESET: 'Réinitialiser', - APPLY_CHANGES: 'Apply Changes ({0})', // TODO translate - UPDATE: 'Update', // TODO translate - EXECUTE: 'Execute', // TODO translate + REMOVE_ALL: 'Supprimer tout', + APPLY_CHANGES: 'Appliquer les changements ({0})', + UPDATE: 'Update', + EXECUTE: 'Execute', REMOVE: 'Enlever', PROBLEM_UPDATING: 'Problème lors de la mise à jour', PROBLEM_LOADING: 'Problème lors du chargement', @@ -60,19 +60,18 @@ const fr: Translation = { DUTY_CYCLE: 'Cycle de fonctionnement', UNIT: 'Unité', STARTVALUE: 'Valeur de départ', - WARN_GPIO: 'Attention: soyez vigilant en choisissant un GPIO!', EDIT: 'Éditer', SENSOR: 'Capteur', TEMP_SENSOR: 'Capteur de température', TEMP_SENSORS: 'Capteurs de température', WRITE_CMD_SENT: 'Envoyer la commande sent', - EMS_BUS_WARNING: 'Bus EMS déconnecté. Si ce message persiste après quelques secondes, vérifiez les paramètres et la configuration de la carte.', + EMS_BUS_WARNING: 'Bus EMS déconnecté. Si ce message persiste après quelques secondes, vérifiez les paramètres et la configuration de la carte.', EMS_BUS_SCANNING: 'Scan des appareils EMS...', CONNECTED: 'Connecté', TX_ISSUES: 'Problèmes de transmission (Tx) - Essayez un autre mode Tx', DISCONNECTED: 'Déconnecté', EMS_SCAN: 'Etes-vous sûr de vouloir lancer un scan complet du bus EMS ?', - DATA_TRAFFIC: 'Data Traffic', // TODO translate + DATA_TRAFFIC: 'Traffic des données', EMS_DEVICE: 'Appareils EMS', SUCCESS: 'SUCCÈS', FAIL: 'ÉCHEC', @@ -114,9 +113,9 @@ const fr: Translation = { BYPASS_TOKEN: "Contourner l'autorisation du jeton d'accès sur les appels API", READONLY: 'Activer le mode lecture uniquement (bloque toutes les commandes EMS sortantes en écriture Tx)', UNDERCLOCK_CPU: 'Underclock du CPU', - HEATINGOFF: 'Start boiler with forced heating off', // TODO translate + HEATINGOFF: 'Démarrer le chauffage avec le chauffage forcé éteint', REMOTE_TIMEOUT: 'Remote timeout', - REMOTE_TIMEOUT_EN: 'Disable remote on missing room temperature', // TODO translate + REMOTE_TIMEOUT_EN: 'Disable remote on missing room temperature', MIN_DURATION: 'Wait time', ENABLE_SHOWER_TIMER: 'Activer la minuterie de la douche', ENABLE_SHOWER_ALERT: 'Activer les alertes de durée de douche', @@ -148,12 +147,12 @@ const fr: Translation = { CUSTOMIZATIONS_HELP_3: "désactiver l'action d'écriture", CUSTOMIZATIONS_HELP_4: "exclure de MQTT et de l'API", CUSTOMIZATIONS_HELP_5: 'cacher des appareils', - CUSTOMIZATIONS_HELP_6: 'remove from memory', // TODO translate + CUSTOMIZATIONS_HELP_6: 'supprimer de la mémoire', SELECT_DEVICE: 'Sélectionnez un appareil', SET_ALL: 'tout régler', OPTIONS: 'Options', NAME: 'Nom', - CUSTOMIZATIONS_RESET: 'Êtes-vous sûr de vouloir supprimer toutes les personnalisations, y compris les paramètres personnalisés des capteurs de température et analogiques ?', + CUSTOMIZATIONS_RESET: 'Êtes-vous sûr de vouloir supprimer toutes les personnalisations?', SUPPORT_INFORMATION: 'Information de support', HELP_INFORMATION_1: 'Visitez le wiki en ligne pour obtenir des instructions sur la façon de configurer EMS-ESP', HELP_INFORMATION_2: 'Pour une discussion en direct avec la communauté, rejoignez notre serveur Discord', @@ -162,20 +161,21 @@ const fr: Translation = { UPLOAD: 'Upload', DOWNLOAD: '{{D|d|d}}ownload', INSTALL: 'Installer', + REINSTALL: 'Réinstaller', ABORTED: 'annulé', FAILED: 'échoué', SUCCESSFUL: 'réussi', SYSTEM: 'Système', LOG_OF: '{0} Log', STATUS_OF: 'Statut {0}', - DOWNLOAD_UPLOAD: 'Download/Upload', // TODO translate + DOWNLOAD_UPLOAD: 'Télécharger/Mettre à jour', CLOSE: 'Fermer', USE: 'Utiliser', FACTORY_RESET: 'Réinitialisation', SYSTEM_FACTORY_TEXT: "L'appareil a été réinitialisé et va maintenant redémarrer", SYSTEM_FACTORY_TEXT_DIALOG: "Êtes-vous sûr de vouloir réinitialiser l'appareil à ses paramètres d'usine ?", - AVAILABLE_VERSION: 'Latest Available Versions', // TODO translate - STABLE: 'Stable', // TODO translate + AVAILABLE_VERSION: 'Versions disponibles', + STABLE: 'Stable', DEVELOPMENT: 'Développement', UPTIME: 'Durée de fonctionnement du système', FREE_MEMORY: 'Libre Memory', @@ -185,9 +185,10 @@ const fr: Translation = { FILESYSTEM: 'File System (Utilisée / Libre)', BUFFER_SIZE: 'Max taille du buffer', COMPACT: 'Compact', - DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', // TODO translate - UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', // TODO translate - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + DOWNLOAD_SETTINGS_TEXT: 'Créer une sauvegarde de vos paramètres et configurations', + DOWNLOAD_SETTINGS_TEXT2: 'Exporter toutes les données', + UPLOAD_TEXT: 'Télécharger un nouveau fichier firmware (.bin) ou une sauvegarde (.json)', + UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', ERROR: 'Erreur inattendue, veuillez réessayer', TIME_SET: 'Time set', MANAGE_USERS: 'Gérer les utilisateurs', @@ -217,7 +218,7 @@ const fr: Translation = { MQTT_PUBLISH_TEXT_2: 'Publier vers des topics de commande (ioBroker)', MQTT_PUBLISH_TEXT_3: 'Activer la découverte MQTT', MQTT_PUBLISH_TEXT_4: 'Préfixe pour les topics découverte', - MQTT_PUBLISH_TEXT_5: 'Discovery type', // TODO translate + MQTT_PUBLISH_TEXT_5: 'Type de découverte', MQTT_PUBLISH_INTERVALS: 'Intervalles de publication', MQTT_INT_BOILER: 'Chaudières et pompes à chaleur', MQTT_INT_THERMOSTATS: 'Thermostats', @@ -226,10 +227,10 @@ const fr: Translation = { MQTT_INT_WATER: 'Modules eau', MQTT_QUEUE: 'Queue MQTT', DEFAULT: 'Défaut', - MQTT_ENTITY_FORMAT: 'Entity ID format', // TODO translate - MQTT_ENTITY_FORMAT_0: 'Single instance, long name (v3.4)', // TODO translate - MQTT_ENTITY_FORMAT_1: 'Single instance, short name', // TODO translate - MQTT_ENTITY_FORMAT_2: 'Multiple instances, short name', // TODO translate + MQTT_ENTITY_FORMAT: 'Format de l\'ID de l\'entité', + MQTT_ENTITY_FORMAT_0: 'Instance unique, nom long (v3.4)', + MQTT_ENTITY_FORMAT_1: 'Instance unique, nom court', + MQTT_ENTITY_FORMAT_2: 'Instances multiples, nom court', MQTT_CLEAN_SESSION: 'Flag Clean Session', MQTT_RETAIN_FLAG: 'Toujours activer le Retain Flag', INACTIVE: 'Inactif', @@ -260,7 +261,7 @@ const fr: Translation = { NETWORK_SCANNER: 'Scan réseau', NETWORK_NO_WIFI: 'Pas de réseau WiFi trouvé', NETWORK_BLANK_SSID: 'laisser vide pour désactiver le WiFi', - NETWORK_BLANK_BSSID: 'leave blank to use only SSID', // TODO translate + NETWORK_BLANK_BSSID: 'laisser vide pour utiliser uniquement le SSID', TX_POWER: 'Puissance Tx', HOSTNAME: "Nom d'hôte", NETWORK_DISABLE_SLEEP: 'Désactiver le mode veille du WiFi', @@ -280,79 +281,82 @@ const fr: Translation = { ENTITY: 'entité', MIN: 'min', MAX: 'max', - BLOCK_NAVIGATE_1: 'You have unsaved changes', // TODO translate - BLOCK_NAVIGATE_2: 'If you navigate to a different page, your unsaved changes will be lost. Are you sure you want to leave this page?', // TODO translate - STAY: 'Stay', // TODO translate - LEAVE: 'Leave', // TODO translate - SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate - SCHEDULE: 'Schedule', // TODO translate - TIME: 'Time', // TODO translate - TIMER: 'Timer', // TODO translate - ONCHANGE: 'Sur le changement', // TODO translate - CONDITION: 'Condition', // TODO translate - IMMEDIATE: 'Immédiate', // TODO translate - SCHEDULE_UPDATED: 'Schedule updated', // TODO translate - SCHEDULE_TIMER_1: 'on startup', // TODO translate - SCHEDULE_TIMER_2: 'every minute', // TODO translate - SCHEDULE_TIMER_3: 'every hour', // TODO translate - CUSTOM_ENTITIES: 'Custom Entities', // TODO translate - ENTITIES_HELP_1: 'Fetch custom entities from the EMS bus', // TODO translate - ENTITIES_UPDATED: 'Entities Updated', // TODO translate - WRITEABLE: 'Writeable', // TODO translate - SHOWING: 'Showing', // TODO translate - SEARCH: 'Search', // TODO translate - CERT: 'TLS root certificate (leave blank for insecure)', // TODO translate + BLOCK_NAVIGATE_1: 'Vous avez des modifications non enregistrées', + BLOCK_NAVIGATE_2: 'Si vous naviguez vers une autre page, vos modifications non enregistrées seront perdues. Êtes-vous sûr de vouloir quitter cette page ?', + STAY: 'Rester', + LEAVE: 'Quitter', + SCHEDULER: 'Scheduler', + SCHEDULER_HELP_1: 'Automatiser les commandes en ajoutant des événements programmés ci-dessous. Définissez un nom unique pour activer/désactiver l\'activation via API/MQTT', + SCHEDULER_HELP_2: 'Utiliser 00:00 pour déclencher une fois au démarrage', + SCHEDULE: 'Programme', + TIME: 'Temps', + TIMER: 'Minuteur', + ONCHANGE: 'Sur le changement', + CONDITION: 'Condition', + IMMEDIATE: 'Immédiat', + SCHEDULE_UPDATED: 'Programme mis à jour', + SCHEDULE_TIMER_1: 'au démarrage', + SCHEDULE_TIMER_2: 'toutes les minutes', + SCHEDULE_TIMER_3: 'toutes les heures', + CUSTOM_ENTITIES: 'Entités personnalisées', + ENTITIES_HELP_1: 'Récupérer les entités personnalisées du bus EMS', + ENTITIES_UPDATED: 'Entités mises à jour', + WRITEABLE: 'Écriture', + SHOWING: 'Affichage', + SEARCH: 'Rechercher', + CERT: 'Certificat racine TLS (laisser vide pour l\'insecurité)', ENABLE_TLS: 'Activer TLS', - ON: 'On', // TODO translate - OFF: 'Off', // TODO translate - POLARITY: 'Polarity', // TODO translate - ACTIVEHIGH: 'Active High', // TODO translate - ACTIVELOW: 'Active Low', // TODO translate - UNCHANGED: 'Unchanged', // TODO translate - ALWAYS: 'Always', // TODO translate - ACTIVITY: 'Activity', // TODO translate - CONFIGURE: 'Configure {0}', // TODO translate - SYSTEM_MEMORY: 'System Memory', // TODO translate - APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate - SECURITY_1: 'Add or remove users', // TODO translate - DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate - MODULES: 'Module', // TODO translate + ON: 'On', + OFF: 'Off', + POLARITY: 'Polarity', + ACTIVEHIGH: 'Actif haut', + ACTIVELOW: 'Actif bas', + UNCHANGED: 'Inchangé', + ALWAYS: 'Toujours', + ACTIVITY: 'Activité', + CONFIGURE: 'Configurer {0}', + SYSTEM_MEMORY: 'Mémoire système', + APPLICATION_SETTINGS_1: 'Modifier les paramètres de l\'application EMS-ESP', + SECURITY_1: 'Ajouter ou supprimer des utilisateurs', + DOWNLOAD_UPLOAD_1: 'Télécharger et mettre à jour les paramètres et le firmware', + MODULES: 'Module', MODULES_1: 'Activer ou désactiver les modules externes', - MODULES_UPDATED: 'Modules updated', // TODO translate - MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate - MODULES_NONE: 'No external modules detected', // TODO translate - RENAME: 'Rename', // TODO translate + MODULES_UPDATED: 'Modules mis à jour', + MODULES_DESCRIPTION: 'Cliquer sur le module pour activer ou désactiver les modules EMS-ESP', + MODULES_NONE: 'Aucun module externe détecté', + RENAME: 'Renommer', ENABLE_MODBUS: 'Activer Modbus', - VIEW_LOG: 'View log to diagnose issues', // TODO translate - UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate - SERVICES: 'Services', // TODO translate - ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions', - WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate - INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate - UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate - PLEASE_WAIT: 'Please wait', // TODO translate - RESTARTING_PRE: 'Initializing', // TODO translate - RESTARTING_POST: 'Preparing', // TODO translate - AUTO_SCROLL: 'Auto Scroll', // TODO translate - DASHBOARD: 'Dashboard', // TODO translate - DEVELOPER_MODE: 'Developer Mode', // TODO translate - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate - DUPLICATE: 'Duplicate', // TODO translate - UPGRADE: 'Upgrade', // TODO translate - DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', // TODO translate - NO_DATA_1: 'No favorite EMS entities found yet. Use the', // TODO translate - NO_DATA_2: 'module to mark them.', // TODO translate - NO_DATA_3: 'To see all available entities go to', // TODO translate - THIS_VERSION: 'This Version', // TODO translate - PLATFORM: 'Platform', // TODO translate - RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + VIEW_LOG: 'Voir le journal pour diagnostiquer les problèmes', + UPLOAD_DRAG: 'glisser-déposer un fichier ici ou cliquer pour en sélectionner un', + SERVICES: 'Services', + ALLVALUES: 'Toutes les valeurs', + SPECIAL_FUNCTIONS: 'Fonctions spéciales', + WAIT_FIRMWARE: 'Firmware en cours de téléchargement et d\'installation', + INSTALL_VERSION: 'Cela va {0} la version {1}. Êtes-vous sûr ?', + UPDATE_AVAILABLE: 'mise à jour disponible', + LATEST_VERSION: 'Vous utilisez la dernière version {0} du firmware', + PLEASE_WAIT: 'Veuillez patienter', + RESTARTING_PRE: 'Démarrage', + RESTARTING_POST: 'Préparation', + AUTO_SCROLL: 'Défilement automatique', + DASHBOARD: 'Tableau de bord', + DEVELOPER_MODE: 'Mode développeur', + BYTES: 'Octets', + BITMASK: 'Masque de bits', + DUPLICATE: 'Dupliquer', + DASHBOARD_1: 'Toutes les entités EMS actives et marquées comme favoris, plus toutes les entités personnalisées, les programmes et les données des capteurs externes sont affichées ci-dessous.', + NO_DATA_1: 'Aucune entité EMS favorite trouvée. Utilisez le', + NO_DATA_2: 'module pour les marquer.', + NO_DATA_3: 'Pour voir toutes les entités disponibles, aller à', + THIS_VERSION: 'Cette version', + PLATFORM: 'Plateforme', + RELEASE_TYPE: 'Type de version', + INTERNET_CONNECTION_REQUIRED: 'Connexion Internet requise pour la vérification automatique des versions et la mise à niveau', + SWITCH_RELEASE_TYPE: 'Passer à la version {0}', + FIRMWARE_VERSION_INFO: 'Informations sur la version du firmware', + NO_DATA: 'Aucune donnée', + USER_PROFILE: 'Profil utilisateur', + STORED_VERSIONS: 'Versions stockées' }; export default fr; diff --git a/interface/src/i18n/it/index.ts b/interface/src/i18n/it/index.ts index d2ac2cb1a..cd38ed18a 100644 --- a/interface/src/i18n/it/index.ts +++ b/interface/src/i18n/it/index.ts @@ -40,7 +40,7 @@ const it: Translation = { RUN_COMMAND: 'Esegui', CHANGE_VALUE: 'Cambia Valore', CANCEL: 'Annulla', - RESET: 'Reset', + REMOVE_ALL: 'Rimuovi tutto', APPLY_CHANGES: 'Applica Cambiamenti ({0})', UPDATE: 'Update', EXECUTE: 'Execute', @@ -60,7 +60,6 @@ const it: Translation = { DUTY_CYCLE: 'Ciclo di lavoro', UNIT: 'UoM', STARTVALUE: 'Valore di partenza', - WARN_GPIO: 'Avvertimento: prestare attenzione quando si assegna un GPIO!', EDIT: 'Modifica', SENSOR: 'Sensore', TEMP_SENSOR: 'Sensore Temperatura', @@ -72,7 +71,7 @@ const it: Translation = { TX_ISSUES: 'Problema di Tx - prova una modalità differente', DISCONNECTED: 'Disconnesso', EMS_SCAN: 'Sei sicuro di voler iniziare una scansione completa del bus EMS ?', - DATA_TRAFFIC: 'Data Traffic', // TODO translate + DATA_TRAFFIC: 'Traffico dati', EMS_DEVICE: 'Dispositivo EMS ', SUCCESS: 'SUCCESSO', FAIL: 'FALLITO', @@ -115,7 +114,7 @@ const it: Translation = { READONLY: 'Abilita modalità sola-lettura (blocca tutti i comandi di scrittura EMS Tx in uscita)', UNDERCLOCK_CPU: 'Abbassa velocità della CPU', REMOTE_TIMEOUT: 'Remote timeout', - REMOTE_TIMEOUT_EN: 'Disable remote on missing room temperature', // TODO translate + REMOTE_TIMEOUT_EN: 'Disabilitare il telecomando in caso di temperatura ambiente mancante', HEATINGOFF: 'Avviamento caldaia con riscaldamento forzato spento', MIN_DURATION: 'Wait time', ENABLE_SHOWER_TIMER: 'Abilita timer doccia', @@ -153,7 +152,7 @@ const it: Translation = { SET_ALL: 'imposta tutto', OPTIONS: 'Opzioni', NAME: 'Nome', - CUSTOMIZATIONS_RESET: 'Sei sicuro di voler rimuovere tutte le personalizzazioni incluse le impostazioni personalizzate dei sensori di temperatura e analogici?', + CUSTOMIZATIONS_RESET: 'Sei sicuro di voler rimuovere tutte le personalizzazioni?', SUPPORT_INFORMATION: 'Informazioni di Supporto', HELP_INFORMATION_1: 'Visita il wiki online per ottenere istruzioni su come configurare EMS-ESP', HELP_INFORMATION_2: 'Per la chat della community dal vivo unisciti al nostro server Discord', @@ -162,6 +161,7 @@ const it: Translation = { UPLOAD: 'Carica', DOWNLOAD: 'Scarica', INSTALL: 'Installare {0}', + REINSTALL: 'Riavviare', ABORTED: 'Annullato', FAILED: 'Fallito', SUCCESSFUL: 'Riuscito', @@ -174,8 +174,8 @@ const it: Translation = { FACTORY_RESET: 'Impostazioni di fabbrica', SYSTEM_FACTORY_TEXT: 'Il dispositivo è stato ripristinato alle impostazioni di fabbrica e ora verrà riavviato', SYSTEM_FACTORY_TEXT_DIALOG: 'Sei sicuro di voler ripristinare il dispositivo alle impostazioni di fabbrica??', - AVAILABLE_VERSION: 'Latest Available Versions', // TODO translate - STABLE: 'Stable', // TODO translate + AVAILABLE_VERSION: 'Versioni disponibili', + STABLE: 'Stabile', DEVELOPMENT: 'Sviluppo', UPTIME: 'Tempo di attività del sistema', FREE_MEMORY: 'Free Memory', @@ -184,10 +184,11 @@ const it: Translation = { APPSIZE: 'Applicazione (Partizione: Usata / Libera)', FILESYSTEM: 'Memoria Sistema (Usata / Libera)', BUFFER_SIZE: 'Max Buffer Size', - COMPACT: 'Compact', - DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', // TODO translate - UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', // TODO translate - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + COMPACT: 'Compatto', + DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', + DOWNLOAD_SETTINGS_TEXT2: 'Esporta tutti i dati', + UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', + UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', ERROR: 'Errore Inaspettato, prego tenta ancora', TIME_SET: 'Imposta Ora', MANAGE_USERS: 'Gestione Utenti', @@ -260,7 +261,7 @@ const it: Translation = { NETWORK_SCANNER: 'Scansione Rete', NETWORK_NO_WIFI: 'Nessuana rete WiFi trovata', NETWORK_BLANK_SSID: 'lasciare vuoto per disattivare WiFi', - NETWORK_BLANK_BSSID: 'leave blank to use only SSID', // TODO translate + NETWORK_BLANK_BSSID: 'lasciare vuoto per usare solo SSID', TX_POWER: 'Potenza Tx', HOSTNAME: 'Nome ospite', NETWORK_DISABLE_SLEEP: 'Disabilita la modalità sospensione Wi-Fi', @@ -303,56 +304,59 @@ const it: Translation = { WRITEABLE: 'Scrivibile', SHOWING: 'Visualizza', SEARCH: 'Ricerca', - CERT: 'TLS root certificate (leave blank for insecure)', // TODO translate + CERT: 'Certificato radice TLS (lasciare vuoto per l\'insecure)', ENABLE_TLS: 'Abilita TLS', - ON: 'On', // TODO translate - OFF: 'Off', // TODO translate - POLARITY: 'Polarity', // TODO translate - ACTIVEHIGH: 'Active High', // TODO translate - ACTIVELOW: 'Active Low', // TODO translate - UNCHANGED: 'Unchanged', // TODO translate - ALWAYS: 'Always', // TODO translate - ACTIVITY: 'Activity', // TODO translate - CONFIGURE: 'Configure {0}', // TODO translate - SYSTEM_MEMORY: 'System Memory', // TODO translate - APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate - SECURITY_1: 'Add or remove users', // TODO translate - DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate - MODULES: 'Module', // TODO translate - MODULES_1: 'Attiva o disattiva i moduli esterni', // TODO translate - MODULES_UPDATED: 'Modules updated', // TODO translate - MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate - MODULES_NONE: 'No external modules detected', // TODO translate - RENAME: 'Rename', // TODO translate + ON: 'On', + OFF: 'Off', + POLARITY: 'Polarity', + ACTIVEHIGH: 'Active High', + ACTIVELOW: 'Active Low', + UNCHANGED: 'Unchanged', + ALWAYS: 'Always', + ACTIVITY: 'Activity', + CONFIGURE: 'Configure {0}', + SYSTEM_MEMORY: 'System Memory', + APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', + SECURITY_1: 'Add or remove users', + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', + MODULES: 'Module', + MODULES_1: 'Attiva o disattiva i moduli esterni', + MODULES_UPDATED: 'Modules updated', + MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', + MODULES_NONE: 'No external modules detected', + RENAME: 'Rename', ENABLE_MODBUS: 'Abilita Modbus', - VIEW_LOG: 'View log to diagnose issues', // TODO translate - UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate - SERVICES: 'Services', // TODO translate - ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate - WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate - INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate - UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate - PLEASE_WAIT: 'Please wait', // TODO translate - RESTARTING_PRE: 'Initializing', // TODO translate - RESTARTING_POST: 'Preparing', // TODO translate - AUTO_SCROLL: 'Auto Scroll', // TODO translate - DASHBOARD: 'Dashboard', // TODO translate - DEVELOPER_MODE: 'Developer Mode', // TODO translate - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate - DUPLICATE: 'Duplicate', // TODO translate - UPGRADE: 'Upgrade', // TODO translate - DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', // TODO translate - NO_DATA_1: 'No favorite EMS entities found yet. Use the', // TODO translate - NO_DATA_2: 'module to mark them.', // TODO translate - NO_DATA_3: 'To see all available entities go to', // TODO translate - THIS_VERSION: 'This Version', // TODO translate - PLATFORM: 'Platform', // TODO translate - RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + VIEW_LOG: 'Visualizza log per diagnosticare problemi', + UPLOAD_DRAG: 'trascina e rilascia un file qui o clicca per selezionare uno', + SERVICES: 'Servizi', + ALLVALUES: 'Tutti i valori', + SPECIAL_FUNCTIONS: 'Funzioni speciali', + WAIT_FIRMWARE: 'Firmware è in upload e installazione', + INSTALL_VERSION: 'Questo installerà la versione {1} {0}. Sei sicuro?', + UPDATE_AVAILABLE: 'aggiornamento disponibile', + LATEST_VERSION: 'Stai usando la versione più recente del firmware {0}', + PLEASE_WAIT: 'Attendere', + RESTARTING_PRE: 'Avviamento', + RESTARTING_POST: 'Preparazione', + AUTO_SCROLL: 'Scorrimento automatico', + DASHBOARD: 'Pannello di controllo', + DEVELOPER_MODE: 'Modalità sviluppatore', + BYTES: 'Byte', + BITMASK: 'Bitmask', + DUPLICATE: 'Duplicato', + DASHBOARD_1: 'Tutte le entità EMS che sono attive e marcate come preferite, più tutte le entità personalizzate, piani di programmazione e dati dei sensori esterni sono visualizzati di seguito.', + NO_DATA_1: 'Nessuna entità EMS preferita trovata. Usa il', + NO_DATA_2: 'modulo per marcarle.', + NO_DATA_3: 'Per vedere tutte le entità disponibili vai a', + THIS_VERSION: 'Questa versione', + PLATFORM: 'Piattaforma', + RELEASE_TYPE: 'Tipo di rilascio', + INTERNET_CONNECTION_REQUIRED: 'Connessione internet richiesta per il controllo automatico delle versioni e l\'aggiornamento', + SWITCH_RELEASE_TYPE: 'Cambia in {0} rilascio', + FIRMWARE_VERSION_INFO: 'Informazioni sulla versione del firmware', + NO_DATA: 'Nessun dato', + USER_PROFILE: 'Profilo utente', + STORED_VERSIONS: 'Versioni memorizzate' }; export default it; diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index c7f76ce89..3f23c42db 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -40,7 +40,7 @@ const nl: Translation = { RUN_COMMAND: 'Call commando', CHANGE_VALUE: 'Wijzig waarde', CANCEL: 'Annuleren', - RESET: 'Reset', + REMOVE_ALL: 'Verwijderen alles', APPLY_CHANGES: 'Aanpassen ({0})', UPDATE: 'Update', EXECUTE: 'Uitvoeren', @@ -60,7 +60,6 @@ const nl: Translation = { DUTY_CYCLE: 'Duty Cycle', UNIT: 'UoM', STARTVALUE: 'Startwaarde', - WARN_GPIO: 'Waarschuwing: let op met het koppelen van de juiste GPIO pin!', EDIT: 'Wijzigen', SENSOR: 'Sensor', TEMP_SENSOR: 'Temperatuur sensor', @@ -153,7 +152,7 @@ const nl: Translation = { SET_ALL: 'Alles aanzetten', OPTIONS: 'Opties', NAME: 'Naam', - CUSTOMIZATIONS_RESET: 'Weet je zeker dat je alle custom aanpassingen wilt verwijderen inclusief de custom instellingen voor analoge temperatuursensoren?', + CUSTOMIZATIONS_RESET: 'Weet je zeker dat je alle custom aanpassingen wilt verwijderen?', SUPPORT_INFORMATION: 'Support Informatie', HELP_INFORMATION_1: 'Bezoek de online wiki om instructies te vinden om EMS-ESP te configureren', HELP_INFORMATION_2: 'Voor de live community ga naar de Discord server', @@ -162,6 +161,7 @@ const nl: Translation = { UPLOAD: 'Upload', DOWNLOAD: '{{D|d|d}}ownload', INSTALL: 'Installeren', + REINSTALL: 'Opnieuw installeren', ABORTED: 'afgebroken', FAILED: 'mislukt', SUCCESSFUL: 'successvol', @@ -178,14 +178,15 @@ const nl: Translation = { STABLE: 'Stable', DEVELOPMENT: 'Development', UPTIME: 'Systeem Uptime', - FREE_MEMORY: 'Free Memory', - PSRAM: 'PSRAM (Size / Free)', - FLASH: 'Flash Chip (Size , Speed)', - APPSIZE: 'Application (Partition: Used / Free)', - FILESYSTEM: 'File System (Used / Free)', - BUFFER_SIZE: 'Max Buffer Size', + FREE_MEMORY: 'Vrij geheugen', + PSRAM: 'PSRAM (grootte / vrij)', + FLASH: 'Flash Chip (grootte , snelheid)', + APPSIZE: 'Applicatie (partition: gebruikt / vrij)', + FILESYSTEM: 'Bestandssysteem (gebruikt / vrij)', + BUFFER_SIZE: 'Max buffer grootte', COMPACT: 'Compact', DOWNLOAD_SETTINGS_TEXT: 'Maak een back-up van uw configuratie en instellingen', + DOWNLOAD_SETTINGS_TEXT2: 'Exporteer alle data', UPLOAD_TEXT: 'Upload een nieuw firmwarebestand (.bin) of een back-upbestand (.json)', UPLOAD_DROP_TEXT: 'Sleep en firmware .bin bestand hierheen of klik hier', ERROR: 'Onverwachte fout, probeer opnieuw', @@ -225,7 +226,7 @@ const nl: Translation = { MQTT_INT_MIXER: 'Mixer Modules', MQTT_INT_WATER: 'Water Modules', MQTT_QUEUE: 'MQTT Queue', - DEFAULT: 'Default', + DEFAULT: 'Standaard', MQTT_ENTITY_FORMAT: 'Entity ID formaat', MQTT_ENTITY_FORMAT_0: 'Eén instantie, lange naam (v3.4)', MQTT_ENTITY_FORMAT_1: 'Eén instantie, korte naam', @@ -249,20 +250,20 @@ const nl: Translation = { AP_PROVIDE_TEXT_3: 'nooit', AP_PREFERRED_CHANNEL: 'Voorkeurskanaal', AP_HIDE_SSID: 'SSID verbergen', - AP_CLIENTS: 'AP Clients', - AP_MAX_CLIENTS: 'Max Clients', - AP_LOCAL_IP: 'Local IP', - NETWORK_SCAN: 'Scan WiFi Networken', - IDLE: 'Idle', + AP_CLIENTS: 'AP Gebruikers', + AP_MAX_CLIENTS: 'Max Gebruikers', + AP_LOCAL_IP: 'Lokale IP', + NETWORK_SCAN: 'Scan WiFi Netwerken', + IDLE: 'Inactief', LOST: 'Verloren', SCANNING: 'Scannen', SCAN_AGAIN: 'Opnieuw scannen', - NETWORK_SCANNER: 'Netwerk Scanner', - NETWORK_NO_WIFI: 'Geen WiFi networken gevonden', + NETWORK_SCANNER: 'Netwerk Scannen', + NETWORK_NO_WIFI: 'Geen WiFi netwerken gevonden', NETWORK_BLANK_SSID: 'laat leeg om WiFi uit te schakelen', NETWORK_BLANK_BSSID: 'laat leeg om alleen SSID te bebruiken', TX_POWER: 'Tx Vermogen', - HOSTNAME: 'Hostname', + HOSTNAME: 'Hostnaam', NETWORK_DISABLE_SLEEP: 'WiFi Sleep Mode uitzetten', NETWORK_LOW_BAND: 'Lagere WiFi bandbreedte gebruiken', NETWORK_USE_DNS: 'Activeer mDNS Service', @@ -272,9 +273,9 @@ const nl: Translation = { NETWORK_GATEWAY: 'Gateway', NETWORK_SUBNET: 'Subnetmasker', NETWORK_DNS: 'DNS Servers', - ADDRESS_OF: '{0} Address', - ADMINISTRATOR: 'Administrator', - GUEST: 'Gast', + ADDRESS_OF: '{0} Adres', + ADMINISTRATOR: 'Beheerder', + GUEST: 'Bezoeker', NEW: 'Nieuwe', NEW_NAME_OF: 'Hernoem {0}', ENTITY: 'Entiteit', @@ -320,7 +321,7 @@ const nl: Translation = { DOWNLOAD_UPLOAD_1: 'Download en upload instellingen en firmware', MODULES: 'Module', MODULES_1: 'Externe modules activeren of deactiveren', - MODULES_UPDATED: 'Modules geüpdatet', + MODULES_UPDATED: 'Modules geüpdatet', MODULES_DESCRIPTION: 'Klik op de module om EMS-ESP library modules te activeren of te deactiveren', MODULES_NONE: 'Geen externe modules gedetecteerd', RENAME: 'Hernoemen', @@ -331,19 +332,18 @@ const nl: Translation = { ALLVALUES: 'All waarden', SPECIAL_FUNCTIONS: 'Speciale functies', WAIT_FIRMWARE: 'Firmware wordt geüpload en geïnstalleerd', - INSTALL_VERSION: 'Hiermee wordt versie {0} geïnstalleerd. Weet je het zeker?', - UPGRADE_AVAILABLE: 'Er is een firmware-upgrade beschikbaar!', - LATEST_VERSION: 'U gebruikt de nieuwste firmwareversie', + INSTALL_VERSION: 'Hiermee wordt versie {1} {0}. Weet je het zeker?', + UPDATE_AVAILABLE: 'update beschikbaar', + LATEST_VERSION: 'U gebruikt de nieuwste {0} firmwareversie', PLEASE_WAIT: 'Een ogenblik geduld', - RESTARTING_PRE: 'Initialiseren', + RESTARTING_PRE: 'Booten', RESTARTING_POST: 'Voorbereiding', AUTO_SCROLL: 'Automatisch Scrollen', DASHBOARD: 'Dashboard', DEVELOPER_MODE: 'Ontwikkelaarsmodus', - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate + BYTES: 'Bytes', + BITMASK: 'Bit Mask', DUPLICATE: 'Duplicaat', - UPGRADE: 'Upgraden', DASHBOARD_1: 'Alle EMS-entiteiten die actief zijn en als favoriet zijn gemarkeerd, plus alle aangepaste entiteiten en externe sensorgegevens worden hieronder weergegeven.', NO_DATA_1: 'Er zijn nog geen favoriete EMS-entiteiten gevonden. Gebruik de', NO_DATA_2: 'module om ze te markeren.', @@ -351,8 +351,12 @@ const nl: Translation = { THIS_VERSION: 'Deze Versie', PLATFORM: 'Platform', RELEASE_TYPE: 'Release Typ', - REINSTALL: 'Opnieuw Installeren', INTERNET_CONNECTION_REQUIRED: 'Internetverbinding vereist voor automatische versiecontrole en -upgrade', + SWITCH_RELEASE_TYPE: 'Switch naar {0} release', + FIRMWARE_VERSION_INFO: 'Informatie over firmwareversie', + NO_DATA: 'Geen data', + USER_PROFILE: 'Gebruikersprofiel', + STORED_VERSIONS: 'Opgeslagen versies' }; export default nl; \ No newline at end of file diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index 14ce06f46..88af2bc43 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -40,10 +40,10 @@ const no: Translation = { RUN_COMMAND: 'Kjør kommando', CHANGE_VALUE: 'Endre Verdi', CANCEL: 'Avbryt', - RESET: 'Nullstill', + REMOVE_ALL: 'Fjern alles', APPLY_CHANGES: 'Utfør endringer({0})', UPDATE: 'Oppdater', - EXECUTE: 'Execute', // TODO translate + EXECUTE: 'Utfør', REMOVE: 'Fjern', PROBLEM_UPDATING: 'Problem med oppdatering', PROBLEM_LOADING: 'Problem med opplasting', @@ -60,7 +60,6 @@ const no: Translation = { DUTY_CYCLE: 'Duty Cycle', UNIT: 'UoM', STARTVALUE: 'Startverdi', - WARN_GPIO: 'Advarsel: vær forsiktig ved aktivering av GPIO!', EDIT: 'Endre', SENSOR: 'Sensor', TEMP_SENSOR: 'Temperatursensor', @@ -72,7 +71,7 @@ const no: Translation = { TX_ISSUES: 'Tx problemer - prøv en annen Tx Modus', DISCONNECTED: 'Frakoblet', EMS_SCAN: 'Er du sikker på du vil starte full søking av EMS bussen?', - DATA_TRAFFIC: 'Data Traffic', // TODO translate + DATA_TRAFFIC: 'Data trafikk', EMS_DEVICE: 'EMS Enhet', SUCCESS: 'VELLYKKET', FAIL: 'MISLYKKET', @@ -115,9 +114,9 @@ const no: Translation = { READONLY: 'Aktiver read-only modus (blokker all EMS Tx Skriving)', UNDERCLOCK_CPU: 'Underklokking av prosessorhastighet', REMOTE_TIMEOUT: 'Remote timeout', - REMOTE_TIMEOUT_EN: 'Disable remote control on missing room temperature', // TODO translate - HEATINGOFF: 'Start boiler with forced heating off', // TODO translate - MIN_DURATION: 'Wait time', + REMOTE_TIMEOUT_EN: 'Deaktiver fjernstyring på manglende romtemperatur', + HEATINGOFF: 'Start kjele med tvingt oppvarming av', + MIN_DURATION: 'Ventetid', ENABLE_SHOWER_TIMER: 'Aktiver Dusjtimer', ENABLE_SHOWER_ALERT: 'Aktiver Dusj-varsling', TRIGGER_TIME: 'Aktiveringstid', @@ -153,7 +152,7 @@ const no: Translation = { SET_ALL: 'sett alle', OPTIONS: 'Alternativ', NAME: 'Navn', - CUSTOMIZATIONS_RESET: 'Er du sikker på att du vil fjerne tilpassninger inkludert innstillinger for Temperatur og Analoge sensorer?', + CUSTOMIZATIONS_RESET: 'Er du sikker på att du vil fjerne tilpassninger?', SUPPORT_INFORMATION: 'Supportinformasjon', HELP_INFORMATION_1: 'Besøk wiki for instruksjoner for å konfigurere EMS-ESP', HELP_INFORMATION_2: 'For community-support besøk vår Discord-server', @@ -162,6 +161,7 @@ const no: Translation = { UPLOAD: 'Opplasning', DOWNLOAD: '{{N|n|n}}edlasting', INSTALL: 'Installer', + REINSTALL: 'Ominstaller', ABORTED: 'avbrutt', FAILED: 'feilet', SUCCESSFUL: 'vellykket', @@ -174,9 +174,9 @@ const no: Translation = { FACTORY_RESET: 'Sett tilbake til fabrikkinstilling', SYSTEM_FACTORY_TEXT: 'Enhet har blitt satt tilbake til fabrikkinstilling og vil restarte', SYSTEM_FACTORY_TEXT_DIALOG: 'Er du sikker på at du vil resette enheten til fabrikkinstillinger?', - AVAILABLE_VERSION: 'Latest Available Versions', // TODO translate - STABLE: 'Stable', // TODO translate - DEVELOPMENT: 'Development', + AVAILABLE_VERSION: 'Tilgjengelige versjoner', + STABLE: 'Stabil', + DEVELOPMENT: 'Utvikling', UPTIME: 'System Oppetid', FREE_MEMORY: 'Ledig Memory', PSRAM: 'PSRAM (Størrelse / Ledig)', @@ -185,9 +185,10 @@ const no: Translation = { FILESYSTEM: 'File System (Brukt / Ledig)', BUFFER_SIZE: 'Max Buffer Størrelse', COMPACT: 'Komprimere', - DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', // TODO translate - UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', // TODO translate - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + DOWNLOAD_SETTINGS_TEXT: 'Lag en sikkerhetskopi av dine konfigurasjon og innstillinger', + DOWNLOAD_SETTINGS_TEXT2: 'Eksporter alle data', + UPLOAD_TEXT: 'Last opp en ny firmware fil (.bin) eller en sikkerhetskopi fil (.json)', + UPLOAD_DROP_TEXT: 'Dropp en firmware fil (.bin) eller klikk her', ERROR: 'Ukjent feil, prøv igjen', TIME_SET: 'Still in tid', MANAGE_USERS: 'Administrer Brukere', @@ -223,7 +224,7 @@ const no: Translation = { MQTT_INT_THERMOSTATS: 'Termostat', MQTT_INT_SOLAR: 'Solpaneler', MQTT_INT_MIXER: 'Blandeventil', - MQTT_INT_WATER: 'Water Modules', // TODO translate + MQTT_INT_WATER: 'Vannmoduler', MQTT_QUEUE: 'MQTT Queue', DEFAULT: 'Standard', MQTT_ENTITY_FORMAT: 'Enhets ID format', @@ -260,7 +261,7 @@ const no: Translation = { NETWORK_SCANNER: 'Nettverk Scanner', NETWORK_NO_WIFI: 'Ingen trådløse nett funnet', NETWORK_BLANK_SSID: 'la feltet være blankt for å deaktivisere trådløst nettverk', - NETWORK_BLANK_BSSID: 'leave blank to use only SSID', // TODO translate + NETWORK_BLANK_BSSID: 'la feltet være blankt for å bruke kun SSID', TX_POWER: 'Tx Effekt', HOSTNAME: 'Hostname', NETWORK_DISABLE_SLEEP: 'Hindre at trådløst nettverk går i Sleep Mode', @@ -297,62 +298,65 @@ const no: Translation = { SCHEDULE_TIMER_1: 'ved oppstart', SCHEDULE_TIMER_2: 'hvert minutt', SCHEDULE_TIMER_3: 'hver time', - CUSTOM_ENTITIES: 'Custom Entities', // TODO translate - ENTITIES_HELP_1: 'Fetch custom entities from the EMS bus', // TODO translate - ENTITIES_UPDATED: 'Entities Updated', // TODO translate - WRITEABLE: 'Writeable', // TODO translate - SHOWING: 'Showing', // TODO translate - SEARCH: 'Search', // TODO translate - CERT: 'TLS root certificate (leave blank for insecure)', // TODO translate + CUSTOM_ENTITIES: 'Personlige entiteter', + ENTITIES_HELP_1: 'Hent personlige entiteter fra EMS bussen', + ENTITIES_UPDATED: 'Entiteter oppdatert', + WRITEABLE: 'Skrivbar', + SHOWING: 'Viser', + SEARCH: 'Søk', + CERT: 'TLS rot sertifikat (la feltet stå blankt for usikkert)', ENABLE_TLS: 'Aktiviser TLS', - ON: 'On', // TODO translate - OFF: 'Off', // TODO translate - POLARITY: 'Polarity', // TODO translate - ACTIVEHIGH: 'Active High', // TODO translate - ACTIVELOW: 'Active Low', // TODO translate - UNCHANGED: 'Unchanged', // TODO translate - ALWAYS: 'Always', // TODO translate - ACTIVITY: 'Activity', // TODO translate - CONFIGURE: 'Configure {0}', // TODO translate - SYSTEM_MEMORY: 'System Memory', // TODO translate - APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate - SECURITY_1: 'Add or remove users', // TODO translate - DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate - MODULES: 'Module', // TODO translate + ON: 'På', + OFF: 'Av', + POLARITY: 'Polarity', + ACTIVEHIGH: 'Active High', + ACTIVELOW: 'Active Low', + UNCHANGED: 'Unchanged', + ALWAYS: 'Always', + ACTIVITY: 'Aktivitet', + CONFIGURE: 'Konfigurer {0}', + SYSTEM_MEMORY: 'System Memory', + APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', + SECURITY_1: 'Add or remove users', + DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', + MODULES: 'Modul', MODULES_1: 'Aktiver eller deaktiver eksterne moduler', - MODULES_UPDATED: 'Modules updated', // TODO translate - MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate - MODULES_NONE: 'No external modules detected', // TODO translate - RENAME: 'Rename', // TODO translate + MODULES_UPDATED: 'Moduler oppdatert', + MODULES_DESCRIPTION: 'Klikk på modulen for å aktivere eller deaktivere EMS-ESP biblioteksmoduler', + MODULES_NONE: 'Ingen eksterne moduler funnet', + RENAME: 'Gi nytt navn', ENABLE_MODBUS: 'Aktiver Modbus', - VIEW_LOG: 'View log to diagnose issues', // TODO translate - UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate - SERVICES: 'Services', // TODO translate - ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate - WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate - INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate - UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate - PLEASE_WAIT: 'Please wait', // TODO translate - RESTARTING_PRE: 'Initializing', // TODO translate - RESTARTING_POST: 'Preparing', // TODO translate - AUTO_SCROLL: 'Auto Scroll', // TODO translate - DASHBOARD: 'Dashboard', // TODO translate - DEVELOPER_MODE: 'Developer Mode', // TODO translate - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate - DUPLICATE: 'Duplicate', // TODO translate - UPGRADE: 'Upgrade', // TODO translate - DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', // TODO translate - NO_DATA_1: 'No favorite EMS entities found yet. Use the', // TODO translate - NO_DATA_2: 'module to mark them.', // TODO translate - NO_DATA_3: 'To see all available entities go to', // TODO translate - THIS_VERSION: 'This Version', // TODO translate - PLATFORM: 'Platform', // TODO translate - RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', + VIEW_LOG: 'Se logg for å diagnostisere problemer', + UPLOAD_DRAG: 'dra og slippe en fil her eller klikk for å velge en', + SERVICES: 'Tjenester', + ALLVALUES: 'Alle verdier', + SPECIAL_FUNCTIONS: 'Spesielle funksjoner', + WAIT_FIRMWARE: 'Firmware er i opplasting og installasjon', + INSTALL_VERSION: 'Dette vil {0} versjon {1}. Er du sikker?', + UPDATE_AVAILABLE: 'oppdatering tilgjengelig', + LATEST_VERSION: 'Du bruker den nyeste {0} firmware versjonen', + PLEASE_WAIT: 'Vennligst vent', + RESTARTING_PRE: 'Starte', + RESTARTING_POST: 'Forbereder', + AUTO_SCROLL: 'Automatisk rulling', + DASHBOARD: 'Dashboard', + DEVELOPER_MODE: 'Utvikler modus', + BYTES: 'Bytes', + BITMASK: 'Bitmask', + DUPLICATE: 'Duplikat', + DASHBOARD_1: 'Alle EMS enheter som er aktive og merket som favoritt, pluss alle personlige enheter, planlegg og eksterne sensor data er vist nedenfor.', + NO_DATA_1: 'Ingen favoritte EMS enheter funnet enda. Bruk', + NO_DATA_2: 'modul for å markere dem.', + NO_DATA_3: 'For å se alle tilgjengelige enheter, gå til', + THIS_VERSION: 'Denne versjonen', + PLATFORM: 'Plattform', + RELEASE_TYPE: 'Utgivelses type', + INTERNET_CONNECTION_REQUIRED: 'Internettilkobling kreves for automatisk versjonskontroll og oppgradering', + SWITCH_RELEASE_TYPE: 'Bytt til {0} utgivelse', + FIRMWARE_VERSION_INFO: 'Informasjon om firmwareversjon', + NO_DATA: 'Ingen data', + USER_PROFILE: 'Brukerprofil', + STORED_VERSIONS: 'Lagret versjoner' }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 1a678e045..07b003447 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -40,7 +40,7 @@ const pl: BaseTranslation = { RUN_COMMAND: 'Wykonaj komendę', CHANGE_VALUE: 'Zmiana wartości', CANCEL: 'Anuluj', - RESET: 'Reset{{uj|owanie|}}', + REMOVE_ALL: 'Usuń wszystko', APPLY_CHANGES: 'Zapisz zmiany ({0})', UPDATE: 'Zmień', EXECUTE: 'Wykonaj', @@ -60,7 +60,6 @@ const pl: BaseTranslation = { DUTY_CYCLE: 'Wypełnienie', UNIT: 'J.m.', STARTVALUE: 'Wartość początkowa', - WARN_GPIO: 'Uwaga! Zachowaj ostrożność przypisując GPIO do urządzenia!', EDIT: 'Edycja', SENSOR: '{{c|ustawienia c||ustawień c|}}zujnika', TEMP_SENSOR: 'czujnika temperatury', @@ -72,7 +71,7 @@ const pl: BaseTranslation = { TX_ISSUES: 'problem z zapisem na magistralę EMS, spróbuj wybrać inny "Tryb transmisji (Tx)"', DISCONNECTED: 'brak połączenia', EMS_SCAN: 'Czy na pewno wykonać pełne skanowanie magistrali EMS?', - DATA_TRAFFIC: 'Data Traffic', // TODO translate + DATA_TRAFFIC: 'Ruch Danych', EMS_DEVICE: 'Urządzenie EMS', SUCCESS: 'Udane', FAIL: 'Nieudane', @@ -115,7 +114,7 @@ const pl: BaseTranslation = { READONLY: 'Tryb pracy "tylko do odczytu" (blokuje wszystkie komendy zapisu na magistralę EMS)', UNDERCLOCK_CPU: 'Obniż taktowanie CPU', REMOTE_TIMEOUT: 'Remote timeout', - REMOTE_TIMEOUT_EN: 'Disable remote control on missing room temperature', // TODO translate + REMOTE_TIMEOUT_EN: 'Wyłącz kontrolę zdalną przy braku temperatury pomieszczenia', HEATINGOFF: 'Uruchom kocioł z wymuszonym wyłączonym grzaniem', MIN_DURATION: 'Wait time', ENABLE_SHOWER_TIMER: 'Aktywuj minutnik prysznica', @@ -153,7 +152,7 @@ const pl: BaseTranslation = { SET_ALL: 'Ustaw wszystko jako', OPTIONS: 'Opcje', NAME: '{{Nazwa|nazwa|}}', - CUSTOMIZATIONS_RESET: 'Na pewno chcesz usunąć wszystkie personalizacje łącznie z ustawieniami dla czujników temperatury 1-Wire® i urządzeń podłączonych do EMS-ESP?', + CUSTOMIZATIONS_RESET: 'Na pewno chcesz usunąć wszystkie personalizacje?', SUPPORT_INFORMATION: '{{I|i|}}nformacj{{e|i|}} o systemie', HELP_INFORMATION_1: 'Skorzystaj z wiki w internecie aby uzyskać instrukcje dotyczące konfiguracji EMS-ESP', HELP_INFORMATION_2: 'Dołącz do naszego serwera Discord by komunikować się na żywo ze społecznością', @@ -162,6 +161,7 @@ const pl: BaseTranslation = { UPLOAD: 'Wysyłanie', DOWNLOAD: '{{P|p||P}}obier{{anie|z||z}}', INSTALL: 'Zainstalować', + REINSTALL: 'Zainstalować ponownie', ABORTED: 'zostało przerwane!', FAILED: 'nie powiodł{{o|a|}} się!', SUCCESSFUL: 'powiodło się.', @@ -174,9 +174,9 @@ const pl: BaseTranslation = { FACTORY_RESET: 'Ustawienia fabryczne', SYSTEM_FACTORY_TEXT: 'Interfejs EMS-ESP został przywrócony do ustawień fabrycznych i zostanie teraz ponownie uruchomiony.', SYSTEM_FACTORY_TEXT_DIALOG: 'Na pewno chcesz przywrócić ustawienia fabryczne interfejsu EMS-ESP?', - AVAILABLE_VERSION: 'Latest Available Versions', // TODO translate - STABLE: 'Stable', // TODO translate - DEVELOPMENT: 'Testowe', + AVAILABLE_VERSION: 'Najnowsze dostępne wersje', + STABLE: 'Stabilna', + DEVELOPMENT: 'Testowa', UPTIME: 'Czas działania systemu', FREE_MEMORY: 'Wolne Memory', PSRAM: 'PSRAM (rozmiar / wolne)', @@ -185,9 +185,10 @@ const pl: BaseTranslation = { FILESYSTEM: 'System plików (wykorzystane / wolne)', BUFFER_SIZE: 'Maksymalna pojemność bufora (ilość wpisów)', COMPACT: 'Kompaktowy', - DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', // TODO translate - UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', // TODO translate - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + DOWNLOAD_SETTINGS_TEXT: 'Utwórz kopię swoich ustawień i konfiguracji', + DOWNLOAD_SETTINGS_TEXT2: 'Eksportuj wszystkie dane', + UPLOAD_TEXT: 'Wgraj nowy plik firmware (.bin) lub kopię ustawień (.json)', + UPLOAD_DROP_TEXT: 'Upuść plik firmware .bin lub kliknij tutaj', ERROR: 'Nieoczekiwany błąd, spróbuj ponownie!', TIME_SET: 'Zegar został ustawiony.', MANAGE_USERS: 'Zarządzanie użytkownikami', @@ -318,41 +319,44 @@ const pl: BaseTranslation = { APPLICATION_SETTINGS_1: 'Modyfikacja ustawień aplikacji EMS-ESP', SECURITY_1: 'Dodawanie i usuwanie użytkowników', DOWNLOAD_UPLOAD_1: 'Pobieranie/wysyłanie ustawień i firmware', - MODULES: 'Module', // TODO translate + MODULES: 'Moduł', MODULES_1: 'Aktywuj lub dezaktywuj moduły zewnętrzne', - MODULES_UPDATED: 'Modules updated', // TODO translate - MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate - MODULES_NONE: 'No external modules detected', // TODO translate - RENAME: 'Rename', // TODO translate + MODULES_UPDATED: 'Zaktualizowano moduły', + MODULES_DESCRIPTION: 'Kliknij na moduł aby aktywować lub dezaktywować bibliotekę modułów EMS-ESP', + MODULES_NONE: 'Brak wykrytych modułów zewnętrznych', + RENAME: 'Zmień nazwę', ENABLE_MODBUS: 'Aktywuj Modbus', - VIEW_LOG: 'View log to diagnose issues', // TODO translate - UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate - SERVICES: 'Services', // TODO translate - ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate - WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate - INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate - UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version', // TODO translate - PLEASE_WAIT: 'Please wait', // TODO translate - RESTARTING_PRE: 'Initializing', // TODO translate - RESTARTING_POST: 'Preparing', // TODO translate - AUTO_SCROLL: 'Auto Scroll', // TODO translate - DASHBOARD: 'Dashboard', // TODO translate - DEVELOPER_MODE: 'Developer Mode', // TODO translate - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate - DUPLICATE: 'Duplicate', // TODO translate - UPGRADE: 'Upgrade', // TODO translate - DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', // TODO translate - NO_DATA_1: 'No favorite EMS entities found yet. Use the', // TODO translate - NO_DATA_2: 'module to mark them.', // TODO translate - NO_DATA_3: 'To see all available entities go to', // TODO translate - THIS_VERSION: 'This Version', // TODO translate - PLATFORM: 'Platform', // TODO translate - RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + VIEW_LOG: 'Zdiagnozuj problemy', + UPLOAD_DRAG: 'przeciągnij i upuść plik lub kliknij tutaj', + SERVICES: 'Usługi', + ALLVALUES: 'Wszystkie wartości', + SPECIAL_FUNCTIONS: 'Specjalne funkcje', + WAIT_FIRMWARE: 'Firmware ściąga się i instaluje', + INSTALL_VERSION: 'To zainstaluje wersję {1} {0}. Jesteś pewny?', + UPDATE_AVAILABLE: 'aktualizacja dostępna', + LATEST_VERSION: 'Jesteś używając najnowszej wersji firmware {0}', + PLEASE_WAIT: 'Proszę czekać', + RESTARTING_PRE: 'Uruchamianie', + RESTARTING_POST: 'Przygotowanie', + AUTO_SCROLL: 'Auto Scroll', + DASHBOARD: 'Pulpit', + DEVELOPER_MODE: 'Tryb programisty', + BYTES: 'Bajty', + BITMASK: 'Bit Mask', + DUPLICATE: 'Duplicate', + DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', + NO_DATA_1: 'Brak ulubionych encji EMS. Użyj', + NO_DATA_2: 'moduł do ich oznaczenia.', + NO_DATA_3: 'Aby zobaczyć wszystkie dostępne encje przejdź do', + THIS_VERSION: 'Ta wersja', + PLATFORM: 'Platforma', + RELEASE_TYPE: 'Typ wydania', + INTERNET_CONNECTION_REQUIRED: 'Połączenie internetowe jest wymagane do automatycznej kontroli wersji i aktualizacji', + SWITCH_RELEASE_TYPE: 'Zmień na {0} wydanie', + FIRMWARE_VERSION_INFO: 'Informacje o wersji firmware', + NO_DATA: 'Brak danych', + USER_PROFILE: 'Profil użytkownika', + STORED_VERSIONS: 'Zapisane wersje' }; export default pl; diff --git a/interface/src/i18n/sk/index.ts b/interface/src/i18n/sk/index.ts index 491b6b498..7950f2e05 100644 --- a/interface/src/i18n/sk/index.ts +++ b/interface/src/i18n/sk/index.ts @@ -40,7 +40,7 @@ const sk: Translation = { RUN_COMMAND: 'Volať príkaz', CHANGE_VALUE: 'Zmena hodnoty', CANCEL: 'Zrušiť', - RESET: 'Reset', + REMOVE_ALL: 'Odstrániť všetko', APPLY_CHANGES: 'Aplikovať zmeny ({0})', UPDATE: 'Aktualizovať', EXECUTE: 'Spustiť', @@ -60,7 +60,6 @@ const sk: Translation = { DUTY_CYCLE: 'Pracovný cyklus', UNIT: 'UoM', STARTVALUE: 'Počiatočná hodnota', - WARN_GPIO: 'Upozornenie: Buďte opatrní pri priraďovaní GPIO!', EDIT: 'Editovať', SENSOR: 'Snímač', TEMP_SENSOR: 'Snímač teploty', @@ -153,15 +152,16 @@ const sk: Translation = { SET_ALL: 'nastaviť všetko', OPTIONS: 'Možnosti', NAME: 'Názov', - CUSTOMIZATIONS_RESET: 'Naozaj chcete odstrániť všetky prispôsobenia vrátane vlastných nastavení snímačov teploty a analógových snímačov?', + CUSTOMIZATIONS_RESET: 'Naozaj chcete odstrániť všetky prispôsobenia?', SUPPORT_INFORMATION: 'Informácie pre podporu', - HELP_INFORMATION_1: 'Navštívte online wiki, kde nájdete pokyny na konfiguráciu EMS-ESP', + HELP_INFORMATION_1: 'Navštívte online wiki, kde nájdete pokyny na konfiguráciu EMS-ESP', HELP_INFORMATION_2: 'Pre živý komunitný chat sa pripojte na náš Discord server', HELP_INFORMATION_3: 'Ak chcete požiadať o funkciu alebo nahlásiť chybu', HELP_INFORMATION_4: 'nezabudnite si stiahnuť a pripojiť informácie o vašom systéme, aby ste mohli rýchlejšie reagovať pri nahlasovaní problému', UPLOAD: 'Nahrať', DOWNLOAD: '{{S|s|s}}tiahnuť', INSTALL: 'Inštalovať', + REINSTALL: 'Inštalovať znova', ABORTED: 'zrušené', FAILED: 'chybné', SUCCESSFUL: 'úspešné', @@ -186,8 +186,9 @@ const sk: Translation = { BUFFER_SIZE: 'Buffer-max. veľkosť', COMPACT: 'Kompaktné', DOWNLOAD_SETTINGS_TEXT: 'Vytvorte zálohu svojej konfigurácie a nastavení', + DOWNLOAD_SETTINGS_TEXT2: 'Exportovať všetky dáta', UPLOAD_TEXT: 'Nahrajte nový súbor firmvéru (.bin) alebo súbor zálohy (.json)', - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + UPLOAD_DROP_TEXT: 'Presuňte súbor .bin firmvéru alebo kliknite sem', ERROR: 'Neočakávaná chyba, prosím skúste to znova', TIME_SET: 'Nastavený čas', MANAGE_USERS: 'Správa používateľov', @@ -323,7 +324,7 @@ const sk: Translation = { MODULES_UPDATED: 'Aktualizované moduly', MODULES_DESCRIPTION: 'Kliknutím na modul aktivujete alebo deaktivujete moduly knižnice EMS-ESP', MODULES_NONE: 'Neboli zistené žiadne externé moduly', - RENAME: 'Premenovať', + RENAME: 'Premenovať', ENABLE_MODBUS: 'Povoliť Modbus', VIEW_LOG: 'Zobrazte log na diagnostiku problémov', UPLOAD_DRAG: 'presuňte sem súbor alebo ho kliknutím vyberte', @@ -331,19 +332,18 @@ const sk: Translation = { ALLVALUES: 'Všetky hodnoty', SPECIAL_FUNCTIONS: 'Špeciálne funkcie', WAIT_FIRMWARE: 'Firmvér sa nahráva a inštaluje', - INSTALL_VERSION: 'Týmto sa inštalovať verzia {0}. Si si istý?', - UPGRADE_AVAILABLE: 'K dispozícii je aktualizácia firmvéru!', - LATEST_VERSION: 'Používate poslednú verziu firmvéru', + INSTALL_VERSION: 'Týmto sa {0} verzia {1}. Si si istý?', + UPDATE_AVAILABLE: 'dostupná aktualizácia', + LATEST_VERSION: 'Používate poslednú {0} verziu firmvéru', PLEASE_WAIT: 'Čakajte prosím', - RESTARTING_PRE: 'Prebieha inicializácia', + RESTARTING_PRE: 'Bootovanie', RESTARTING_POST: 'Príprava', AUTO_SCROLL: 'Automatické rolovanie', DASHBOARD: 'Panel', DEVELOPER_MODE: 'Režim vývojára', - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate + BYTES: 'Bytov', + BITMASK: 'Bitová maska', DUPLICATE: 'Duplicitné', - UPGRADE: 'Inovovať', DASHBOARD_1: 'Všetky entity EMS, ktoré sú aktívne a označené ako obľúbené, plus všetky vlastné entity, plány a údaje externých senzorov sú zobrazené nižšie.', NO_DATA_1: 'Nenašli sa žiadne obľúbené entity EMS. Použite', NO_DATA_2: 'modul na ich označenie.', @@ -351,8 +351,12 @@ const sk: Translation = { THIS_VERSION: 'Táto verzia', PLATFORM: 'Platforma', RELEASE_TYPE: 'Typ vydania', - REINSTALL: 'Preinštalovať', INTERNET_CONNECTION_REQUIRED: 'Internetové pripojenie je potrebné pre automatickú kontrolu a aktualizáciu', + SWITCH_RELEASE_TYPE: 'Prepnúť na {0} verziu', + FIRMWARE_VERSION_INFO: 'Informácie o verzii firmware', + NO_DATA: 'Žiadne dáta', + USER_PROFILE: 'Profil používateľa', + STORED_VERSIONS: 'Uložené verzie' }; export default sk; diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index f2527b3b7..a8fd58d23 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -40,7 +40,7 @@ const sv: Translation = { RUN_COMMAND: 'Kör kommando', CHANGE_VALUE: 'Ändra värde', CANCEL: 'Avbryt', - RESET: 'Nollställ', + REMOVE_ALL: 'Ta bort allt', APPLY_CHANGES: 'Utför ändringar ({0})', UPDATE: 'Uppdatera', EXECUTE: 'Utför', @@ -60,7 +60,6 @@ const sv: Translation = { DUTY_CYCLE: 'Pulskvot', UNIT: 'Måttenhet', STARTVALUE: 'Startvärde', - WARN_GPIO: 'Varning: Var försiktig vid aktivering av GPIO!', EDIT: 'Ändra', SENSOR: 'Sensor', TEMP_SENSOR: 'Temperatursensor', @@ -153,7 +152,7 @@ const sv: Translation = { SET_ALL: 'ställ in alla', OPTIONS: 'Alternativ', NAME: 'Namn', - CUSTOMIZATIONS_RESET: 'Är du säker på att du vill ta bort alla anpassningar, inklusive inställningar för Temperatursensorer och Analoga sensorer?', + CUSTOMIZATIONS_RESET: 'Är du säker på att du vill ta bort alla anpassningar?', SUPPORT_INFORMATION: 'Supportinformation', HELP_INFORMATION_1: 'Besök Wikin för instruktioner om hur du kan konfigurera EMS-ESP', HELP_INFORMATION_2: 'För community-support besök vår Discord-server', @@ -162,6 +161,7 @@ const sv: Translation = { UPLOAD: 'Uppladdning', DOWNLOAD: '{{N|n|n}}edladdning', INSTALL: 'Installera', + REINSTALL: 'Återinstallera', ABORTED: 'Avbruten', FAILED: 'Misslyckades', SUCCESSFUL: 'Lyckades', @@ -186,8 +186,9 @@ const sv: Translation = { BUFFER_SIZE: 'Max bufferstorlek', COMPACT: 'Komprimerad', DOWNLOAD_SETTINGS_TEXT: 'Skapa en säkerhetskopia av din konfiguration och inställningar', + DOWNLOAD_SETTINGS_TEXT2: 'Exportera alla data', UPLOAD_TEXT: 'Ladda upp en ny firmwarefil (.bin) eller en säkerhetskopiafil (.json)', - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + UPLOAD_DROP_TEXT: 'Droppa en firmware .bin fil eller klicka här', ERROR: 'Okänt fel, var god försök igen', TIME_SET: 'Ställ in tid', MANAGE_USERS: 'Användare', @@ -331,28 +332,31 @@ const sv: Translation = { ALLVALUES: 'Alla värden', SPECIAL_FUNCTIONS: 'Specialfunktioner', WAIT_FIRMWARE: 'Firmware laddas upp och installeras', - INSTALL_VERSION: 'Det här kommer installera version {0}. Är du säker?', - UPGRADE_AVAILABLE: 'Det finns en tillgänglig firmwareupgradering!', - LATEST_VERSION: 'Du använder den senaste firmwareversionen.', + INSTALL_VERSION: 'Det här kommer {0} version {1}. Är du säker?', + UPDATE_AVAILABLE: 'uppdatering tillgänglig', + LATEST_VERSION: 'Du använder den senaste {0} firmwareversionen.', PLEASE_WAIT: 'Var god vänta', - RESTARTING_PRE: 'Initialiserar', + RESTARTING_PRE: 'Bootar', RESTARTING_POST: 'Förbereder', AUTO_SCROLL: 'Autoskrolla', DASHBOARD: 'Kontrollpanel', DEVELOPER_MODE: 'Utvecklarläge', - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate + BYTES: 'Bytes', + BITMASK: 'Bitmask', DUPLICATE: 'Dublett', - UPGRADE: 'Uppgradera', - DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', // TODO translate - NO_DATA_1: 'No favorite EMS entities found yet. Use the', // TODO translate - NO_DATA_2: 'module to mark them.', // TODO translate - NO_DATA_3: 'To see all available entities go to', // TODO translate - THIS_VERSION: 'This Version', // TODO translate - PLATFORM: 'Platform', // TODO translate - RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate + DASHBOARD_1: 'Alla EMS-enheter som är aktiva och markerade som favorit, plus alla anpassade entiteter, scheman och externa sensor-data visas nedan.', + NO_DATA_1: 'Inga favorit EMS enheter hittade än. Använd', + NO_DATA_2: 'modul för att markera dem.', + NO_DATA_3: 'För att se alla tillgängliga enheter, gå till', + THIS_VERSION: 'Denna version', + PLATFORM: 'Plattform', + RELEASE_TYPE: 'Utgivelsestyp', INTERNET_CONNECTION_REQUIRED: 'Internetanslutning krävs för automatisk version kontroll och uppdatering', + SWITCH_RELEASE_TYPE: 'Byt till {0} utgåva', + FIRMWARE_VERSION_INFO: 'Information om firmwareversion', + NO_DATA: 'Ingen data', + USER_PROFILE: 'Användarprofil', + STORED_VERSIONS: 'Lagrad versioner' }; export default sv; diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index cab051bfb..d931077f1 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -40,10 +40,10 @@ const tr: Translation = { RUN_COMMAND: 'Çalıştırma Komutu', CHANGE_VALUE: 'Değeri Değiştir', CANCEL: 'İptal', - RESET: 'Reset', - APPLY_CHANGES: 'Apply Changes ({0})', + REMOVE_ALL: 'Tümünü Kaldır', + APPLY_CHANGES: 'Değişiklikleri Uygula ({0})', UPDATE: 'Update', - EXECUTE: 'Execute', // TODO translate + EXECUTE: 'Uygulamak', REMOVE: 'Kaldır', PROBLEM_UPDATING: 'Güncelleme Sorunu', PROBLEM_LOADING: 'Yükleme Sorunu', @@ -60,7 +60,6 @@ const tr: Translation = { DUTY_CYCLE: 'Görev Çevrimi', UNIT: 'ÖB', STARTVALUE: 'Başlangıç değeri', - WARN_GPIO: 'Uyarı: bir GPIO atarken dikkatli olun!', EDIT: 'Değiştir', SENSOR: 'Sensör', TEMP_SENSOR: 'Sıcaklık Sensörü', @@ -72,7 +71,7 @@ const tr: Translation = { TX_ISSUES: 'Tx sorunu - başka bir Tx Modu deneyin', DISCONNECTED: 'Bağlantı kesildi', EMS_SCAN: 'EMS Hattında tam bir cihaz taraması başlatmak istediğinizden emin misiniz?', - DATA_TRAFFIC: 'Data Traffic', // TODO translate + DATA_TRAFFIC: 'Veri trafiği', EMS_DEVICE: 'EMS Cihazı', SUCCESS: 'BAŞARILI', FAIL: 'HATA', @@ -115,8 +114,8 @@ const tr: Translation = { READONLY: 'Salt okunur modu devreye al (bütün giden EMS Tx Yazma komutlarını engeller)', UNDERCLOCK_CPU: 'İşlemci hızını düşür', REMOTE_TIMEOUT: 'Remote timeout', - REMOTE_TIMEOUT_EN: 'Disable remote on missing room temperature', // TODO translate - HEATINGOFF: 'Start boiler with forced heating off', // TODO translate + REMOTE_TIMEOUT_EN: 'Disable remote on missing room temperature', + HEATINGOFF: 'Start boiler with forced heating off', MIN_DURATION: 'Wait time', ENABLE_SHOWER_TIMER: 'Duş Sayacını Devreye Al', ENABLE_SHOWER_ALERT: 'Duş Alarmını Devreye Al', @@ -153,7 +152,7 @@ const tr: Translation = { SET_ALL: 'hepsini ayarla', OPTIONS: 'Seçenekler', NAME: 'İsim', - CUSTOMIZATIONS_RESET: 'Sıcaklık ve Analog Sensörlerin özelleştirilmiş seçenekleri dahil bütün özelleştirmeleri kaldırmak istediğinizden emin misiniz?', + CUSTOMIZATIONS_RESET: 'Bütün özelleştirmeleri kaldırmak istediğinizden emin misiniz?', SUPPORT_INFORMATION: 'Destek Bilgileri', HELP_INFORMATION_1: 'EMS-ESPnin nasıl ayarlanacağı ile ilgili bilgileri edinmek için çevrimiçi WIKI sayfasını ziyaret edin', HELP_INFORMATION_2: 'Canlı topluluk sohbeti için Discord sunucumuza katılın', @@ -162,6 +161,7 @@ const tr: Translation = { UPLOAD: 'Yükleme', DOWNLOAD: '{{İ|i|i}}İndirme', INSTALL: 'Düzenlemek', + REINSTALL: 'Yeniden düzenlemek', ABORTED: 'iptal edildi', FAILED: 'başarısız', SUCCESSFUL: 'başarılı', @@ -174,8 +174,8 @@ const tr: Translation = { FACTORY_RESET: 'Fabrika ayarına dönme', SYSTEM_FACTORY_TEXT: 'Cihaz fabrika ayarlarına döndü ve şimdi yendiden başlatılacak', SYSTEM_FACTORY_TEXT_DIALOG: 'Cihazı fabrika ayarlarına döndürmek istediğinize emin misiniz?', - AVAILABLE_VERSION: 'Latest Available Versions', // TODO translate - STABLE: 'Stable', // TODO translate + AVAILABLE_VERSION: 'En son kullanılabilir sürümler', + STABLE: 'Kararlı', DEVELOPMENT: 'Geliştirme', UPTIME: 'Sistem Çalışma Süresi', FREE_MEMORY: 'Yığın Memory', @@ -185,9 +185,10 @@ const tr: Translation = { FILESYSTEM: 'Dosya Sistemi (Kullanılmış / Boş)', BUFFER_SIZE: 'En fazla bellek boyutu', COMPACT: 'Sıkışık', - DOWNLOAD_SETTINGS_TEXT: 'Create a backup of your configuration and settings', // TODO translate - UPLOAD_TEXT: 'Upload a new firmware file (.bin) or a backup file (.json)', // TODO translate - UPLOAD_DROP_TEXT: 'Drop a firmware .bin file or click here', // TODO translate + DOWNLOAD_SETTINGS_TEXT: 'Yapılandırma ve ayarlarınızın yedekleme yapın', + DOWNLOAD_SETTINGS_TEXT2: 'Tüm verileri dışarı al', + UPLOAD_TEXT: 'Yeni bir firmware dosyası (.bin) veya yedek dosyası (.json) yükle', + UPLOAD_DROP_TEXT: 'Bir firmware .bin dosyası veya buraya tıklayın', ERROR: 'Beklenemedik hata, lütfen tekrar deneyin.', TIME_SET: 'Zaman ayarı', MANAGE_USERS: 'Kullanıcıları yönet', @@ -223,7 +224,7 @@ const tr: Translation = { MQTT_INT_THERMOSTATS: 'Termostatlar', MQTT_INT_SOLAR: 'Güneş Enerjisi Modülleri', MQTT_INT_MIXER: 'Karışım Modülleri', - MQTT_INT_WATER: 'Water Modules', // TODO translate + MQTT_INT_WATER: 'Su Modülleri', MQTT_QUEUE: 'MQTT Sırası', DEFAULT: 'Varsayılan', MQTT_ENTITY_FORMAT: 'Varlık Kimlik biçimi', @@ -260,7 +261,7 @@ const tr: Translation = { NETWORK_SCANNER: 'Ağ Tarayıcısı', NETWORK_NO_WIFI: 'Hiçbir Kablosuz Ağ bulunamadı', NETWORK_BLANK_SSID: 'Kablosuz ağı devre dışı bırakmak için boş bırakın', - NETWORK_BLANK_BSSID: 'leave blank to use only SSID', // TODO translate + NETWORK_BLANK_BSSID: 'sadece SSID kullanmak için boş bırakın', TX_POWER: 'Aktarım gücü', HOSTNAME: 'Ana Makine Adı', NETWORK_DISABLE_SLEEP: 'Kablosuz uyku modunu devre dışına al', @@ -280,79 +281,82 @@ const tr: Translation = { ENTITY: 'varlık', MIN: 'min', MAX: 'maks', - BLOCK_NAVIGATE_1: 'You have unsaved changes', // TODO translate - BLOCK_NAVIGATE_2: 'If you navigate to a different page, your unsaved changes will be lost. Are you sure you want to leave this page?', // TODO translate - STAY: 'Stay', // TODO translate - LEAVE: 'Leave', // TODO translate - SCHEDULER: 'Scheduler', // TODO translate - SCHEDULER_HELP_1: 'Automate commands by adding scheduled events below. Set a unique Name to enable/disable activation via API/MQTT', // TODO translate - SCHEDULER_HELP_2: 'Use 00:00 to trigger once on start-up', // TODO translate - SCHEDULE: 'Schedule', // TODO translate - TIME: 'Time', // TODO translate - TIMER: 'Timer', // TODO translate + BLOCK_NAVIGATE_1: 'Değiştirilmişleriniz var', + BLOCK_NAVIGATE_2: 'Farklı bir sayfaya geçerseniz değiştirilmişleriniz kaybolacak. Bu sayfadan çıkmak istediğinize emin misiniz?', + STAY: 'Kal', + LEAVE: 'Çık', + SCHEDULER: 'Zamanlayıcı', + SCHEDULER_HELP_1: 'Komutları zamanlayarak otomatikleştirin. Benzersiz bir ad belirtin API/MQTT aracılığıyla etkinleştirmek/devre dışı bırakma', + SCHEDULER_HELP_2: 'Başlangıçta bir kere tetiklemek için 00:00 kullanın', + SCHEDULE: 'Zamanlama', + TIME: 'Zaman', + TIMER: 'Zamanlayıcı', ONCHANGE: 'Değişimde', - CONDITION: 'Durum', // TODO translate - IMMEDIATE: 'hemen', // TODO translate - SCHEDULE_UPDATED: 'Schedule updated', // TODO translate - SCHEDULE_TIMER_1: 'on startup', // TODO translate - SCHEDULE_TIMER_2: 'every minute', // TODO translate - SCHEDULE_TIMER_3: 'every hour', // TODO translate - CUSTOM_ENTITIES: 'Custom Entities', // TODO translate - ENTITIES_HELP_1: 'Fetch custom entities from the EMS bus', // TODO translate - ENTITIES_UPDATED: 'Entities Updated', // TODO translate - WRITEABLE: 'Writeable', // TODO translate - SHOWING: 'Showing', // TODO translate - SEARCH: 'Search', // TODO translate - CERT: 'TLS root certificate (leave blank for insecure)', + CONDITION: 'Durum', + IMMEDIATE: 'hemen', + SCHEDULE_UPDATED: 'Zamanlama güncellendi', + SCHEDULE_TIMER_1: 'Başlangıçta', + SCHEDULE_TIMER_2: 'her dakikada', + SCHEDULE_TIMER_3: 'her saatte', + CUSTOM_ENTITIES: 'Özel Varlıklar', + ENTITIES_HELP_1: 'Özel varlıkları EMS hattından alın', + ENTITIES_UPDATED: 'Varlıklar güncellendi', + WRITEABLE: 'Yazılabilir', + SHOWING: 'Görüntüleniyor', + SEARCH: 'Ara', + CERT: 'TLS kök sertifikası (güvenli olmayan için boş bırakın)', ENABLE_TLS: 'TLS deveye al', - ON: 'On', // TODO translate - OFF: 'Off', // TODO translate - POLARITY: 'Polarity', // TODO translate - ACTIVEHIGH: 'Active High', // TODO translate - ACTIVELOW: 'Active Low', // TODO translate - UNCHANGED: 'Unchanged', // TODO translate - ALWAYS: 'Always', // TODO translate - ACTIVITY: 'Activity', // TODO translate - CONFIGURE: 'Configure {0}', // TODO translate - SYSTEM_MEMORY: 'System Memory', // TODO translate - APPLICATION_SETTINGS_1: 'Modify EMS-ESP Application Settings', // TODO translate - SECURITY_1: 'Add or remove users', // TODO translate - DOWNLOAD_UPLOAD_1: 'Download and Upload Settings and Firmware', // TODO translate - MODULES: 'Module', // TODO translate + ON: 'On', + OFF: 'Off', + POLARITY: 'Polarity', + ACTIVEHIGH: 'Aktif Yüksek', + ACTIVELOW: 'Aktif Düşük', + UNCHANGED: 'Değiştirilmedi', + ALWAYS: 'Her zaman', + ACTIVITY: 'Faaliyet', + CONFIGURE: 'Yapılandır {0}', + SYSTEM_MEMORY: 'Sistem Belleği', + APPLICATION_SETTINGS_1: 'EMS-ESP Uygulama Ayarlarını Değiştir', + SECURITY_1: 'Kullanıcıları ekle veya kaldır', + DOWNLOAD_UPLOAD_1: 'Ayarları ve firmware dosyasını indir ve yükle', + MODULES: 'Modül', MODULES_1: 'Harici modülleri etkinleştirin veya devre dışı bırakın', - MODULES_UPDATED: 'Modules updated', // TODO translate - MODULES_DESCRIPTION: 'Click on the Module to activate or de-activate EMS-ESP library modules', // TODO translate - MODULES_NONE: 'No external modules detected', // TODO translate - RENAME: 'Rename', // TODO translate - ENABLE_MODBUS: 'Enable Modbus', // TODO translate - VIEW_LOG: 'View log to diagnose issues', // TODO translate - UPLOAD_DRAG: 'drag and drop a file here or click to select one', // TODO translate - SERVICES: 'Services', // TODO translate - ALLVALUES: 'All Values', // TODO translate - SPECIAL_FUNCTIONS: 'Special Functions', // TODO translate - WAIT_FIRMWARE: 'Firmware is uploading and installing', // TODO translate - INSTALL_VERSION: 'This will install version {0}. Are you sure?', // TODO translate - UPGRADE_AVAILABLE: 'There is a firmware upgrade available!', // TODO translate - LATEST_VERSION: 'You are using the latest firmware version.', // TODO translate - PLEASE_WAIT: 'Please wait', // TODO translate - RESTARTING_PRE: 'Initializing', // TODO translate - RESTARTING_POST: 'Preparing', // TODO translate - AUTO_SCROLL: 'Auto Scroll', // TODO translate - DASHBOARD: 'Dashboard', // TODO translate - DEVELOPER_MODE: 'Developer Mode', // TODO translate - BYTES: 'Bytes', // TODO translate - BITMASK: 'Bit Mask',// TODO translate - DUPLICATE: 'Duplicate', // TODO translate - UPGRADE: 'Upgrade', // TODO translate - DASHBOARD_1: 'All EMS entities that are active and marked as Favorite, plus all Custom Entities, Schedules and external Sensors data are displayed below.', // TODO translate - NO_DATA_1: 'No favorite EMS entities found yet. Use the', // TODO translate - NO_DATA_2: 'module to mark them.', // TODO translate - NO_DATA_3: 'To see all available entities go to', // TODO translate - THIS_VERSION: 'This Version', // TODO translate - PLATFORM: 'Platform', // TODO translate - RELEASE_TYPE: 'Release Type', // TODO translate - REINSTALL: 'Re-install', // TODO translate - INTERNET_CONNECTION_REQUIRED: 'Internet connection required for automatic version checking and upgrading', // TODO translate + MODULES_UPDATED: 'Modülleri güncellendi', + MODULES_DESCRIPTION: 'Modüle tıklayarak etkinleştirin veya devre dışı bırakın EMS-ESP kütüphane modülleri', + MODULES_NONE: 'Hiçbir harici modül tespit edilmedi', + RENAME: 'Yeniden Adlandır', + ENABLE_MODBUS: 'Modbus\'ı etkinleştir', + VIEW_LOG: 'Sorunu tanımlamak için günlüğü görüntüleyin', + UPLOAD_DRAG: 'Bir dosya buraya sürükleyip bırakın veya seçmek için tıklayın', + SERVICES: 'Hizmetler', + ALLVALUES: 'Tüm Değerler', + SPECIAL_FUNCTIONS: 'Özel Fonksiyonlar', + WAIT_FIRMWARE: 'Firmware yükleniyor ve yükleniyor', + INSTALL_VERSION: 'Bu {0} sürümü {1} yükleyecek. Emin misiniz?', + UPDATE_AVAILABLE: 'güncellendi!', + LATEST_VERSION: 'En son {0} firmware sürümünü kullanıyorsunuz.', + PLEASE_WAIT: 'Lütfen bekleyin', + RESTARTING_PRE: 'Yükleniyor', + RESTARTING_POST: 'Hazırlanıyor', + AUTO_SCROLL: 'Otomatik kaydırma', + DASHBOARD: 'Kontrol Paneli', + DEVELOPER_MODE: 'Geliştirici Modu', + BYTES: 'Bayt', + BITMASK: 'Bit Maskesi', + DUPLICATE: 'Çift', + DASHBOARD_1: 'Tüm aktif ve Favori olarak işaretlenmiş EMS varlıkları, artı tüm özel varlıklar, zamanlayıcılar ve harici sensör verileri aşağıda görüntüleniyor.', + NO_DATA_1: 'Henüz bir favori EMS varlığı bulunamadı. Kullanın', + NO_DATA_2: 'modülünü kullanın.', + NO_DATA_3: 'Tüm kullanılabilir varlıkları görmek için git', + THIS_VERSION: 'Bu Sürüm', + PLATFORM: 'Platforma', + RELEASE_TYPE: 'Sürüm Tipi', + INTERNET_CONNECTION_REQUIRED: 'Otomatik sürüm kontrolü ve güncelleme için internet bağlantısı gereklidir', + SWITCH_RELEASE_TYPE: '{0} sürümüne geç', + FIRMWARE_VERSION_INFO: 'Firmware Sürüm Bilgisi', + NO_DATA: 'Hiçbir veri yok', + USER_PROFILE: 'Kullanıcı Profili', + STORED_VERSIONS: 'Kaydedilmiş Sürümler' }; export default tr; diff --git a/interface/src/index.tsx b/interface/src/index.tsx index 57ae0fb7d..f3420463d 100644 --- a/interface/src/index.tsx +++ b/interface/src/index.tsx @@ -4,16 +4,112 @@ import { Route, RouterProvider, createBrowserRouter, - createRoutesFromElements + createRoutesFromElements, + useRouteError } from 'react-router'; import App from 'App'; +const errorPageStyles = { + container: { + display: 'flex', + flexDirection: 'column' as const, + alignItems: 'center', + justifyContent: 'center', + minHeight: '100vh', + padding: '2rem', + textAlign: 'center' as const, + backgroundColor: '#1e1e1e', + color: '#eee' + }, + logo: { + width: '100px', + height: '100px', + marginBottom: '2rem' + }, + title: { + fontSize: '2rem', + margin: '0 0 1rem 0', + color: '#90CAF9', + fontWeight: 500 as const + }, + status: { + color: '#2196f3', + fontSize: '1.5rem', + fontWeight: 400 as const, + margin: '0 0 1rem 0' + }, + message: { + fontFamily: 'monospace, monospace', + fontSize: '1.1rem', + color: '#9e9e9e', + maxWidth: '600px', + margin: '0 0 2rem 0' + }, + message2: { + fontSize: '1.1rem', + color: '#2196f3', + maxWidth: '600px', + margin: '0 0 2rem 0' + } +}; +interface ErrorWithStatus { + status?: number | string; + statusText?: string; + message?: string; +} + +function isErrorWithDetails(error: unknown): error is ErrorWithStatus { + return typeof error === 'object' && error !== null; +} + +function getErrorStatus(error: unknown): string { + if (isErrorWithDetails(error) && 'status' in error && error.status != null) { + return String(error.status); + } + return 'Error'; +} + +function getErrorMessage(error: unknown): string { + if (!isErrorWithDetails(error)) { + return 'Something went wrong'; + } + return error.statusText || error.message || 'Something went wrong'; +} + +// Custom Error Component +function ErrorPage() { + const error = useRouteError(); + + return ( +
+ ); +} + const router = createBrowserRouter( - createRoutesFromElements(} />) + createRoutesFromElements( + } errorElement={} /> + ) ); -createRoot(document.getElementById('root') as HTMLElement).render( +createRoot(document.getElementById('root')!).render( diff --git a/interface/src/types/index.ts b/interface/src/types/index.ts index 420f7e2bf..8c2f8760c 100644 --- a/interface/src/types/index.ts +++ b/interface/src/types/index.ts @@ -1,8 +1,9 @@ export * from './ap'; +export * from './features'; export * from './me'; export * from './mqtt'; +export * from './network'; export * from './ntp'; export * from './security'; export * from './signin'; export * from './system'; -export * from './network'; diff --git a/interface/src/types/network.ts b/interface/src/types/network.ts index f771f34c4..9aef2621b 100644 --- a/interface/src/types/network.ts +++ b/interface/src/types/network.ts @@ -54,6 +54,7 @@ export interface NetworkSettingsType { enableMDNS: boolean; enableCORS: boolean; CORSOrigin: string; + [key: string]: unknown; } export interface WiFiNetworkList { diff --git a/interface/src/types/system.ts b/interface/src/types/system.ts index d43eb2310..b68ce3ce1 100644 --- a/interface/src/types/system.ts +++ b/interface/src/types/system.ts @@ -2,13 +2,15 @@ import type { busConnectionStatus } from 'app/main/types'; import type { NetworkConnectionStatus } from './network'; +// match SYSTEM_STATUS in System.h export enum SystemStatusCodes { SYSTEM_STATUS_NORMAL = 0, SYSTEM_STATUS_PENDING_UPLOAD = 1, SYSTEM_STATUS_UPLOADING = 100, SYSTEM_STATUS_ERROR_UPLOAD = 3, SYSTEM_STATUS_PENDING_RESTART = 4, - SYSTEM_STATUS_RESTART_REQUESTED = 5 + SYSTEM_STATUS_RESTART_REQUESTED = 5, + SYSTEM_STATUS_INVALID_GPIO = 6 } export interface SystemStatus { @@ -50,7 +52,14 @@ export interface SystemStatus { model: string; has_loader: boolean; has_partition: boolean; - status: number; // SystemStatusCodes which matches SYSTEM_STATUS in System.h + partitions: { + partition: string; + version: string; + size: number; + install_date?: string; + }[]; + status: number; // System Status Codes which matches SYSTEM_STATUS in System.h + developer_mode: boolean; temperature?: number; } diff --git a/interface/src/utils/binding.ts b/interface/src/utils/binding.ts index 54c52e38e..0a4d272ba 100644 --- a/interface/src/utils/binding.ts +++ b/interface/src/utils/binding.ts @@ -1,60 +1,88 @@ -export const numberValue = (value?: number) => { - if (value !== undefined) { - return isNaN(value) ? '' : value.toString(); - } - return ''; -}; +/** + * Converts a number value to a string for input fields. + * Returns empty string for undefined or NaN values. + */ +export const numberValue = (value?: number): string => + value === undefined || isNaN(value) ? '' : String(value); -export const extractEventValue = (event: React.ChangeEvent) => { - switch (event.target.type) { - case 'number': - return event.target.valueAsNumber; - case 'checkbox': - return event.target.checked; - default: - return event.target.value; +/** + * Extracts the appropriate value from an input event based on input type. + */ +export const extractEventValue = ( + event: React.ChangeEvent +): string | number | boolean => { + const { type, checked, value } = event.target; + + if (type === 'number') { + if (value === '') return NaN; + + const normalizedValue = value.replace(',', '.'); + + // For incomplete number entries, keep the raw string to allow smooth typing + // This includes: "0.", "1.0", "0.00", "-", "-.", "-.5", etc. + const endsWithDecimalAndZeros = /\.\d*0$/.test(normalizedValue); + const isIncomplete = + normalizedValue.endsWith('.') || + normalizedValue === '-' || + normalizedValue === '-.' || + normalizedValue === '-0' || + endsWithDecimalAndZeros; + + if (isIncomplete) { + return normalizedValue; + } + + const parsedValue = parseFloat(normalizedValue); + return parsedValue; } + if (type === 'checkbox') return checked; + return value; }; type UpdateEntity = (state: (prevState: Readonly) => S) => void; +/** + * Creates an event handler that updates an entity's state based on input changes. + */ export const updateValue = - (updateEntity: UpdateEntity) => - (event: React.ChangeEvent) => { + >(updateEntity: UpdateEntity) => + (event: React.ChangeEvent): void => { + const { name } = event.target; + const value = extractEventValue(event); + updateEntity((prevState) => ({ ...prevState, - [event.target.name]: extractEventValue(event) + [name]: value })); }; +/** + * Creates an event handler that tracks dirty flags for modified fields. + * Optimized to minimize state updates and unnecessary array operations. + */ export const updateValueDirty = - ( - origData, + >( + origData: T, dirtyFlags: string[], setDirtyFlags: React.Dispatch>, - updateDataValue: (unknown) => void + updateDataValue: (updater: (prevState: T) => T) => void ) => - (event: React.ChangeEvent) => { - const updated_value = extractEventValue(event); - const name = event.target.name; + (event: React.ChangeEvent): void => { + const { name } = event.target; + const updatedValue = extractEventValue(event); - updateDataValue((prevState: unknown) => ({ - ...(prevState as Record), - [name]: updated_value + updateDataValue((prevState) => ({ + ...prevState, + [name]: updatedValue })); - const arr: string[] = dirtyFlags; + const isDirty = origData[name] !== updatedValue; + const wasDirty = dirtyFlags.includes(name); - if ((origData as Record)[name] !== updated_value) { - if (!arr.includes(name)) { - arr.push(name); - } - } else { - const startIndex = arr.indexOf(name); - if (startIndex !== -1) { - arr.splice(startIndex, 1); - } + // Only update dirty flags if the state changed + if (isDirty !== wasDirty) { + setDirtyFlags( + isDirty ? [...dirtyFlags, name] : dirtyFlags.filter((f) => f !== name) + ); } - - setDirtyFlags(arr); }; diff --git a/interface/src/utils/file.ts b/interface/src/utils/file.ts index d6d5df4d5..547a30cad 100644 --- a/interface/src/utils/file.ts +++ b/interface/src/utils/file.ts @@ -1,11 +1,28 @@ -export const saveFile = (json: unknown, filename: string, extension: string) => { - const anchor = document.createElement('a'); - anchor.href = URL.createObjectURL( - new Blob([JSON.stringify(json, null, 2)], { - type: 'text/plain' - }) - ); - anchor.download = 'emsesp_' + filename + extension; - anchor.click(); - URL.revokeObjectURL(anchor.href); +export const saveFile = ( + json: unknown, + filename: string, + extension: string +): void => { + try { + const blob = new Blob([JSON.stringify(json, null, 2)], { + type: 'application/json' + }); + const url = URL.createObjectURL(blob); + const anchor = document.createElement('a'); + anchor.href = url; + anchor.download = `emsesp_${filename}${extension}`; + + // Trigger download + document.body.appendChild(anchor); + anchor.click(); + document.body.removeChild(anchor); + + // Delay revocation to ensure download starts properly + setTimeout(() => { + URL.revokeObjectURL(url); + }, 100); + } catch (error) { + console.error('Failed to save file:', error); + throw new Error(`Unable to save file: ${filename}${extension}`); + } }; diff --git a/interface/src/utils/time.ts b/interface/src/utils/time.ts index 8189fef84..9ccadb5c6 100644 --- a/interface/src/utils/time.ts +++ b/interface/src/utils/time.ts @@ -1,18 +1,187 @@ -const LOCALE_FORMAT = new Intl.DateTimeFormat([...window.navigator.languages], { - day: 'numeric', - month: 'short', - year: 'numeric', - hour: 'numeric', - minute: 'numeric', - second: 'numeric', - hour12: false -}); +// Cache for formatters to avoid recreation (with size limits to prevent memory leaks) +const MAX_CACHE_SIZE = 50; +const formatterCache = new Map(); +const rtfCache = new Map(); -export const formatDateTime = (dateTime: string) => - LOCALE_FORMAT.format(new Date(dateTime.substring(0, 19))); +// Pre-computed constants +const MS_TO_MINUTES = 60000; // 60 * 1000 +const TIME_DIVISIONS = [ + { amount: 60, name: 'seconds' as const }, + { amount: 60, name: 'minutes' as const }, + { amount: 24, name: 'hours' as const }, + { amount: 7, name: 'days' as const }, + { amount: 4.34524, name: 'weeks' as const }, + { amount: 12, name: 'months' as const }, + { amount: Number.POSITIVE_INFINITY, name: 'years' as const } +] as const; -export const formatLocalDateTime = (date: Date) => - new Date(date.getTime() - date.getTimezoneOffset() * 60000) - .toISOString() - .slice(0, -1) - .substring(0, 19); +// Cached navigator languages to avoid repeated array spreads +let cachedLanguages: readonly string[] | null = null; + +/** + * Get navigator languages with caching + */ +function getNavigatorLanguages(): readonly string[] { + if (!cachedLanguages) { + cachedLanguages = window.navigator.languages; + } + return cachedLanguages; +} + +/** + * Create a fast cache key from DateTimeFormat options + */ +function createFormatterKey(options: Intl.DateTimeFormatOptions): string { + // Build key from most common properties for better performance than JSON.stringify + return `${options.day}-${options.month}-${options.year}-${options.hour}-${options.minute}-${options.second}-${options.hour12}`; +} + +/** + * Get or create a cached DateTimeFormat instance with LRU-like cache management + */ +function getDateTimeFormatter( + options: Intl.DateTimeFormatOptions +): Intl.DateTimeFormat { + const key = createFormatterKey(options); + + if (formatterCache.has(key)) { + // Move to end for LRU behavior + const formatter = formatterCache.get(key)!; + formatterCache.delete(key); + formatterCache.set(key, formatter); + return formatter; + } + + // Limit cache size + if (formatterCache.size >= MAX_CACHE_SIZE) { + const firstKey = formatterCache.keys().next().value; + if (firstKey) { + formatterCache.delete(firstKey); + } + } + + const formatter = new Intl.DateTimeFormat(getNavigatorLanguages(), options); + formatterCache.set(key, formatter); + return formatter; +} + +/** + * Get or create a cached RelativeTimeFormat instance with cache size management + */ +function getRelativeTimeFormatter(locale: string): Intl.RelativeTimeFormat { + if (rtfCache.has(locale)) { + // Move to end for LRU behavior + const formatter = rtfCache.get(locale)!; + rtfCache.delete(locale); + rtfCache.set(locale, formatter); + return formatter; + } + + // Limit cache size + if (rtfCache.size >= MAX_CACHE_SIZE) { + const firstKey = rtfCache.keys().next().value; + if (firstKey) { + rtfCache.delete(firstKey); + } + } + + const formatter = new Intl.RelativeTimeFormat(locale, { numeric: 'auto' }); + rtfCache.set(locale, formatter); + return formatter; +} + +/** + * Format a date as relative time (e.g., "2 hours ago", "in 3 days") + */ +function formatTimeAgo(locale: string, date: Date): string { + const now = Date.now(); + const targetTime = date.getTime(); + let duration = (targetTime - now) / 1000; + + const rtf = getRelativeTimeFormatter(locale); + + // Find the appropriate time division + for (const division of TIME_DIVISIONS) { + if (Math.abs(duration) < division.amount) { + return rtf.format(Math.round(duration), division.name); + } + duration /= division.amount; + } + + // This should never be reached due to POSITIVE_INFINITY in divisions + return rtf.format(Math.round(duration), 'years'); +} + +/** + * Format a date-time string to locale-specific format + */ +export const formatDateTime = (dateTime: string): string => { + if (!dateTime || typeof dateTime !== 'string') { + return 'Invalid date'; + } + + try { + // Extract only the first 19 characters (YYYY-MM-DDTHH:mm:ss) + const cleanDateTime = dateTime.substring(0, 19); + const date = new Date(cleanDateTime); + + if (isNaN(date.getTime())) { + return 'Invalid date'; + } + + const formatter = getDateTimeFormatter({ + day: 'numeric', + month: 'short', + year: 'numeric', + hour: 'numeric', + minute: 'numeric', + second: 'numeric', + hour12: false + }); + + return formatter.format(date); + } catch (error) { + console.warn('Error formatting date:', error); + return 'Invalid date'; + } +}; + +/** + * Convert a Date object to local date-time string (ISO format without timezone) + */ +export const formatLocalDateTime = (date: Date): string => { + if (!(date instanceof Date) || isNaN(date.getTime())) { + return 'Invalid date'; + } + + // Calculate local time offset using pre-computed constant + const offsetMs = date.getTimezoneOffset() * MS_TO_MINUTES; + const localTime = date.getTime() - offsetMs; + + // Convert to ISO string and remove timezone info + return new Date(localTime).toISOString().slice(0, 19); +}; + +/** + * Format a date with both short date format and relative time + */ +export const prettyDateTime = (locale: string, date: Date): string => { + if (!(date instanceof Date) || isNaN(date.getTime())) { + return 'Invalid date'; + } + + if (!locale || typeof locale !== 'string') { + locale = 'en'; + } + + const shortFormatter = getDateTimeFormatter({ + day: 'numeric', + month: 'short', + year: 'numeric' + }); + + const shortDate = shortFormatter.format(date); + const relativeTime = formatTimeAgo(locale, date); + + return `${shortDate} (${relativeTime})`; +}; diff --git a/interface/src/utils/useInterval.ts b/interface/src/utils/useInterval.ts index e319b4896..82cbaaf1e 100644 --- a/interface/src/utils/useInterval.ts +++ b/interface/src/utils/useInterval.ts @@ -2,24 +2,43 @@ import { useEffect, useRef } from 'react'; const DEFAULT_DELAY = 3000; -// adapted from https://www.joshwcomeau.com/snippets/react-hooks/use-interval/ -export const useInterval = (callback: () => void, delay: number = DEFAULT_DELAY) => { - const intervalRef = useRef(null); - const savedCallback = useRef<() => void>(callback); +/** + * Custom hook for setting up an interval with proper cleanup + * Adapted from https://www.joshwcomeau.com/snippets/react-hooks/use-interval/ + * + * @param callback - Function to be called at each interval + * @param delay - Delay in milliseconds (default: 3000ms) + * @param immediate - If true, executes callback immediately on mount (default: false) + * @returns Reference to the interval ID + */ +export const useInterval = ( + callback: () => void, + delay: number = DEFAULT_DELAY, + immediate = false +) => { + const intervalRef = useRef | null>(null); + const savedCallback = useRef(callback); + // Remember the latest callback without resetting the interval useEffect(() => { savedCallback.current = callback; }, [callback]); useEffect(() => { const tick = () => savedCallback.current(); - intervalRef.current = window.setInterval(tick, delay); + + // Execute immediately if requested + if (immediate) { + tick(); + } + + intervalRef.current = setInterval(tick, delay); return () => { - if (intervalRef.current !== null) { - window.clearInterval(intervalRef.current); + if (intervalRef.current) { + clearInterval(intervalRef.current); } }; - }, [delay]); + }, [delay, immediate]); return intervalRef; }; diff --git a/interface/src/utils/usePersistState.ts b/interface/src/utils/usePersistState.ts index 86cc4ae93..2a627a852 100644 --- a/interface/src/utils/usePersistState.ts +++ b/interface/src/utils/usePersistState.ts @@ -4,23 +4,38 @@ export const usePersistState = ( initial_value: T, id: string ): [T, (new_state: T) => void] => { - // Set initial value + // Set initial value - only computed once on mount const _initial_value = useMemo(() => { - const local_storage_value_str = localStorage.getItem('state:' + id); - // If there is a value stored in localStorage, use that - if (local_storage_value_str) { - return JSON.parse(local_storage_value_str) as T; + try { + const local_storage_value_str = localStorage.getItem(`state:${id}`); + // If there is a value stored in localStorage, use that + if (local_storage_value_str) { + return JSON.parse(local_storage_value_str) as T; + } + } catch (error) { + // If parsing fails, fall back to initial_value + console.warn( + `Failed to parse localStorage value for key "state:${id}"`, + error + ); } // Otherwise use initial_value that was passed to the function return initial_value; - }, []); + }, [id]); // initial_value intentionally omitted - only read on first mount const [state, setState] = useState(_initial_value); useEffect(() => { - const state_str = JSON.stringify(state); // Stringified state - localStorage.setItem('state:' + id, state_str); // Set stringified state as item in localStorage - }, [state]); + try { + const state_str = JSON.stringify(state); + localStorage.setItem(`state:${id}`, state_str); + } catch (error) { + console.warn( + `Failed to save state to localStorage for key "state:${id}"`, + error + ); + } + }, [state, id]); return [state, setState]; }; diff --git a/interface/src/utils/useRest.ts b/interface/src/utils/useRest.ts index fcc9fc54c..0d57abff9 100644 --- a/interface/src/utils/useRest.ts +++ b/interface/src/utils/useRest.ts @@ -1,4 +1,4 @@ -import { useState } from 'react'; +import { useCallback, useMemo, useState } from 'react'; import { useBlocker } from 'react-router'; import { toast } from 'react-toastify'; @@ -11,10 +11,12 @@ export interface RestRequestOptions { update: (value: D) => Method; } +const REBOOT_ERROR_MESSAGE = 'Reboot required'; + export const useRest = ({ read, update }: RestRequestOptions) => { const { LL } = useI18nContext(); const [errorMessage, setErrorMessage] = useState(); - const [restartNeeded, setRestartNeeded] = useState(false); + const [restartNeeded, setRestartNeeded] = useState(false); const [origData, setOrigData] = useState(); const [dirtyFlags, setDirtyFlags] = useState([]); const blocker = useBlocker(dirtyFlags.length !== 0); @@ -35,48 +37,78 @@ export const useRest = ({ read, update }: RestRequestOptions) => { setDirtyFlags([]); }); - const updateDataValue = (new_data: D) => { - updateData({ data: new_data }); - }; + const updateDataValue = useCallback( + (new_data: D) => updateData({ data: new_data }), + [updateData] + ); - const loadData = async () => { + const loadData = useCallback(async () => { setDirtyFlags([]); setErrorMessage(undefined); - await readData().catch((error: Error) => { - toast.error(error.message); - setErrorMessage(error.message); - }); - }; - - const saveData = async () => { - if (!data) { - return; + try { + await readData(); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + toast.error(message); + setErrorMessage(message); } + }, [readData]); + + const saveData = useCallback(async () => { + if (!data) return; + + // Reset states before saving setRestartNeeded(false); setErrorMessage(undefined); - setDirtyFlags([]); - setOrigData(data as D); - await writeData(data as D).catch((error: Error) => { - if (error.message === 'Reboot required') { + + try { + await writeData(data as D); + // Only update origData on successful save (dirtyFlags cleared by onSuccess handler) + setOrigData(data as D); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + + if (message === REBOOT_ERROR_MESSAGE) { setRestartNeeded(true); - } else { - toast.error(error.message); - setErrorMessage(error.message); + return; // Early return - save succeeded but needs reboot } - }); - }; - return { - loadData, - saveData, - saving: saving as boolean, - updateDataValue, - data: data as D, // Explicitly define the type of 'data' - origData: origData as D, // Explicitly define the type of 'origData' to 'D' - dirtyFlags, - setDirtyFlags, - setOrigData, - blocker, - errorMessage, - restartNeeded - } as const; + + // Restore original data on validation error + if (origData) { + updateData({ data: origData }); + } + toast.error(message); + setErrorMessage(message); + setDirtyFlags([]); // Clear flags so user can retry + } + }, [data, writeData, origData, updateData]); + + return useMemo( + () => ({ + loadData, + saveData, + saving: !!saving, + updateDataValue, + data: data as D, + origData: origData as D, + dirtyFlags, + setDirtyFlags, + setOrigData, + blocker, + errorMessage, + restartNeeded + }), + [ + loadData, + saveData, + saving, + updateDataValue, + data, + origData, + dirtyFlags, + blocker, + errorMessage, + restartNeeded + ] + ); }; diff --git a/interface/src/validators/ap.ts b/interface/src/validators/ap.ts index 5a1514909..4aa5638a2 100644 --- a/interface/src/validators/ap.ts +++ b/interface/src/validators/ap.ts @@ -4,6 +4,42 @@ import type { APSettingsType } from 'types'; import { IP_ADDRESS_VALIDATOR } from './shared'; +// Reusable validation rules +const IP_FIELD_RULE = (fieldName: string) => [ + { required: true, message: `${fieldName} is required` }, + IP_ADDRESS_VALIDATOR +]; + +const SSID_RULES = [ + { required: true, message: 'Please provide an SSID' }, + { type: 'string' as const, max: 32, message: 'SSID must be 32 characters or less' } +]; + +const PASSWORD_RULES = [ + { required: true, message: 'Please provide an access point password' }, + { + type: 'string' as const, + min: 8, + max: 64, + message: 'Password must be 8-64 characters' + } +]; + +const CHANNEL_RULES = [ + { required: true, message: 'Please provide a network channel' }, + { type: 'number' as const, message: 'Channel must be between 1 and 14' } +]; + +const MAX_CLIENTS_RULES = [ + { required: true, message: 'Please specify a value for max clients' }, + { + type: 'number' as const, + min: 1, + max: 9, + message: 'Max clients must be between 1 and 9' + } +]; + export const createAPSettingsValidator = (apSettings: APSettingsType) => new Schema({ provision_mode: { @@ -11,47 +47,12 @@ export const createAPSettingsValidator = (apSettings: APSettingsType) => message: 'Please provide a provision mode' }, ...(isAPEnabled(apSettings) && { - ssid: [ - { required: true, message: 'Please provide an SSID' }, - { - type: 'string', - max: 32, - message: 'SSID must be 32 characters or less' - } - ], - password: [ - { required: true, message: 'Please provide an access point password' }, - { - type: 'string', - min: 8, - max: 64, - message: 'Password must be 8-64 characters' - } - ], - channel: [ - { required: true, message: 'Please provide a network channel' }, - { type: 'number', message: 'Channel must be between 1 and 14' } - ], - max_clients: [ - { required: true, message: 'Please specify a value for max clients' }, - { - type: 'number', - min: 1, - max: 9, - message: 'Max clients must be between 1 and 9' - } - ], - local_ip: [ - { required: true, message: 'Local IP address is required' }, - IP_ADDRESS_VALIDATOR - ], - gateway_ip: [ - { required: true, message: 'Gateway IP address is required' }, - IP_ADDRESS_VALIDATOR - ], - subnet_mask: [ - { required: true, message: 'Subnet mask is required' }, - IP_ADDRESS_VALIDATOR - ] + ssid: SSID_RULES, + password: PASSWORD_RULES, + channel: CHANNEL_RULES, + max_clients: MAX_CLIENTS_RULES, + local_ip: IP_FIELD_RULE('Local IP address'), + gateway_ip: IP_FIELD_RULE('Gateway IP address'), + subnet_mask: IP_FIELD_RULE('Subnet mask') }) }); diff --git a/interface/src/validators/mqtt.ts b/interface/src/validators/mqtt.ts index c90d3c23a..c3ffc92f2 100644 --- a/interface/src/validators/mqtt.ts +++ b/interface/src/validators/mqtt.ts @@ -3,35 +3,57 @@ import type { MqttSettingsType } from 'types'; import { IP_OR_HOSTNAME_VALIDATOR } from './shared'; +// Constants for validation ranges +const PORT_MIN = 0; +const PORT_MAX = 65535; +const KEEP_ALIVE_MIN = 1; +const KEEP_ALIVE_MAX = 86400; +const HEARTBEAT_MIN = 10; +const HEARTBEAT_MAX = 86400; + +// Reusable validator rules +const REQUIRED_HOST_VALIDATOR = [ + { required: true, message: 'Host is required' }, + IP_OR_HOSTNAME_VALIDATOR +]; + +const REQUIRED_BASE_VALIDATOR = [{ required: true, message: 'Base is required' }]; + +const PORT_VALIDATOR = [ + { required: true, message: 'Port is required' }, + { + type: 'number' as const, + min: PORT_MIN, + max: PORT_MAX, + message: `Port must be between ${PORT_MIN} and ${PORT_MAX}` + } +]; + +const createNumberValidator = (fieldName: string, min: number, max: number) => [ + { required: true, message: `${fieldName} is required` }, + { + type: 'number' as const, + min, + max, + message: `${fieldName} must be between ${min} and ${max}` + } +]; + export const createMqttSettingsValidator = (mqttSettings: MqttSettingsType) => new Schema({ ...(mqttSettings.enabled && { - host: [ - { required: true, message: 'Host is required' }, - IP_OR_HOSTNAME_VALIDATOR - ], - base: { required: true, message: 'Base is required' }, - port: [ - { required: true, message: 'Port is required' }, - { type: 'number', min: 0, max: 65535, message: 'Invalid Port' } - ], - keep_alive: [ - { required: true, message: 'Keep alive is required' }, - { - type: 'number', - min: 1, - max: 86400, - message: 'Keep alive must be between 1 and 86400' - } - ], - publish_time_heartbeat: [ - { required: true, message: 'Heartbeat is required' }, - { - type: 'number', - min: 10, - max: 86400, - message: 'Heartbeat must be between 10 and 86400' - } - ] + host: REQUIRED_HOST_VALIDATOR, + base: REQUIRED_BASE_VALIDATOR, + port: PORT_VALIDATOR, + keep_alive: createNumberValidator( + 'Keep alive', + KEEP_ALIVE_MIN, + KEEP_ALIVE_MAX + ), + publish_time_heartbeat: createNumberValidator( + 'Heartbeat', + HEARTBEAT_MIN, + HEARTBEAT_MAX + ) }) }); diff --git a/interface/src/validators/network.ts b/interface/src/validators/network.ts index 4f5f8e866..5a4cb87dc 100644 --- a/interface/src/validators/network.ts +++ b/interface/src/validators/network.ts @@ -3,6 +3,23 @@ import type { NetworkSettingsType } from 'types'; import { HOSTNAME_VALIDATOR, IP_ADDRESS_VALIDATOR } from './shared'; +// Reusable validator rules +const REQUIRED_IP_VALIDATOR = (fieldName: string) => [ + { required: true, message: `${fieldName} is required` }, + IP_ADDRESS_VALIDATOR +]; + +const OPTIONAL_IP_VALIDATOR = [IP_ADDRESS_VALIDATOR]; + +// Helper to create static IP validation rules +const createStaticIpRules = () => ({ + local_ip: REQUIRED_IP_VALIDATOR('Local IP'), + gateway_ip: REQUIRED_IP_VALIDATOR('Gateway IP'), + subnet_mask: REQUIRED_IP_VALIDATOR('Subnet mask'), + dns_ip_1: OPTIONAL_IP_VALIDATOR, + dns_ip_2: OPTIONAL_IP_VALIDATOR +}); + export const createNetworkSettingsValidator = ( networkSettings: NetworkSettingsType ) => @@ -17,29 +34,16 @@ export const createNetworkSettingsValidator = ( message: 'BSSID must be 17 characters or empty' } ], - password: { - type: 'string', - max: 64, - message: 'Password must be 64 characters or less' - }, + password: [ + { + type: 'string', + max: 64, + message: 'Password must be 64 characters or less' + } + ], hostname: [ { required: true, message: 'Hostname is required' }, HOSTNAME_VALIDATOR ], - ...(networkSettings.static_ip_config && { - local_ip: [ - { required: true, message: 'Local IP is required' }, - IP_ADDRESS_VALIDATOR - ], - gateway_ip: [ - { required: true, message: 'Gateway IP is required' }, - IP_ADDRESS_VALIDATOR - ], - subnet_mask: [ - { required: true, message: 'Subnet mask is required' }, - IP_ADDRESS_VALIDATOR - ], - dns_ip_1: IP_ADDRESS_VALIDATOR, - dns_ip_2: IP_ADDRESS_VALIDATOR - }) + ...(networkSettings.static_ip_config && createStaticIpRules()) }); diff --git a/interface/src/validators/ntp.ts b/interface/src/validators/ntp.ts index 81aad6932..e59329b12 100644 --- a/interface/src/validators/ntp.ts +++ b/interface/src/validators/ntp.ts @@ -7,8 +7,5 @@ export const NTP_SETTINGS_VALIDATOR = new Schema({ { required: true, message: 'Server is required' }, IP_OR_HOSTNAME_VALIDATOR ], - tz_label: { - required: true, - message: 'Time zone is required' - } + tz_label: [{ required: true, message: 'Time zone is required' }] }); diff --git a/interface/src/validators/security.ts b/interface/src/validators/security.ts index c57de6b6a..109aa045e 100644 --- a/interface/src/validators/security.ts +++ b/interface/src/validators/security.ts @@ -2,25 +2,34 @@ import Schema from 'async-validator'; import type { InternalRuleItem } from 'async-validator'; import type { UserType } from 'types'; +const USERNAME_PATTERN = /^[a-zA-Z0-9_\\.]{1,24}$/; +const JWT_SECRET_MAX_LENGTH = 64; +const PASSWORD_MAX_LENGTH = 64; + export const SECURITY_SETTINGS_VALIDATOR = new Schema({ jwt_secret: [ { required: true, message: 'JWT secret is required' }, { type: 'string', min: 1, - max: 64, - message: 'JWT secret must be between 1 and 64 characters' + max: JWT_SECRET_MAX_LENGTH, + message: `JWT secret must be between 1 and ${JWT_SECRET_MAX_LENGTH} characters` } ] }); +/** + * Creates a validator to ensure username uniqueness + * @param users - Array of existing users to check against + * @returns Validator rule for unique username + */ export const createUniqueUsernameValidator = (users: UserType[]) => ({ validator( - rule: InternalRuleItem, + _rule: InternalRuleItem, username: string, callback: (error?: string) => void ) { - if (username && users.find((u) => u.username === username)) { + if (username && users.some((u) => u.username === username)) { callback('Username already in use'); } else { callback(); @@ -28,13 +37,19 @@ export const createUniqueUsernameValidator = (users: UserType[]) => ({ } }); +/** + * Creates a validator schema for user creation/editing + * @param users - Array of existing users for uniqueness check + * @param creating - Whether this is for creating a new user (enables uniqueness check) + * @returns Schema validator for user data + */ export const createUserValidator = (users: UserType[], creating: boolean) => new Schema({ username: [ { required: true, message: 'Username is required' }, { type: 'string', - pattern: /^[a-zA-Z0-9_\\.]{1,24}$/, + pattern: USERNAME_PATTERN, message: "Must be 1-24 characters: alphanumeric, '_' or '.'" }, ...(creating ? [createUniqueUsernameValidator(users)] : []) @@ -44,8 +59,8 @@ export const createUserValidator = (users: UserType[], creating: boolean) => { type: 'string', min: 1, - max: 64, - message: 'Password must be 1-64 characters' + max: PASSWORD_MAX_LENGTH, + message: `Password must be 1-${PASSWORD_MAX_LENGTH} characters` } ] }); diff --git a/interface/src/validators/shared.ts b/interface/src/validators/shared.ts index c3237327b..d1132d184 100644 --- a/interface/src/validators/shared.ts +++ b/interface/src/validators/shared.ts @@ -7,66 +7,54 @@ export const validate = ( options?: ValidateOption ): Promise => new Promise((resolve, reject) => { - void validator.validate(source, options || {}, (errors, fieldErrors) => { - if (errors) { - reject(fieldErrors as Error); - } else { - resolve(source as T); - } + void validator.validate(source, options ?? {}, (errors, fieldErrors) => { + errors ? reject(fieldErrors as Error) : resolve(source as T); }); }); -// updated to support both IPv4 and IPv6 -const IP_ADDRESS_REGEXP = - /((^\s*((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))\s*$)|(^\s*((([0-9a-f]{1,4}:){7}([0-9a-f]{1,4}|:))|(([0-9a-f]{1,4}:){6}(:[0-9a-f]{1,4}|((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){5}(((:[0-9a-f]{1,4}){1,2})|:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3})|:))|(([0-9a-f]{1,4}:){4}(((:[0-9a-f]{1,4}){1,3})|((:[0-9a-f]{1,4})?:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){3}(((:[0-9a-f]{1,4}){1,4})|((:[0-9a-f]{1,4}){0,2}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){2}(((:[0-9a-f]{1,4}){1,5})|((:[0-9a-f]{1,4}){0,3}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(([0-9a-f]{1,4}:){1}(((:[0-9a-f]{1,4}){1,6})|((:[0-9a-f]{1,4}){0,4}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:))|(:(((:[0-9a-f]{1,4}){1,7})|((:[0-9a-f]{1,4}){0,5}:((25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}))|:)))(%.+)?\s*$))/; +// IPv4 pattern: matches 0.0.0.0 to 255.255.255.255 +const IPV4_PATTERN = + /^((25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$/; -const isValidIpAddress = (value: string) => IP_ADDRESS_REGEXP.test(value); +// IPv6 pattern: matches full and compressed IPv6 addresses (including IPv4-mapped) +const IPV6_PATTERN = + /^(([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,7}:|([0-9a-f]{1,4}:){1,6}:[0-9a-f]{1,4}|([0-9a-f]{1,4}:){1,5}(:[0-9a-f]{1,4}){1,2}|([0-9a-f]{1,4}:){1,4}(:[0-9a-f]{1,4}){1,3}|([0-9a-f]{1,4}:){1,3}(:[0-9a-f]{1,4}){1,4}|([0-9a-f]{1,4}:){1,2}(:[0-9a-f]{1,4}){1,5}|[0-9a-f]{1,4}:((:[0-9a-f]{1,4}){1,6})|:((:[0-9a-f]{1,4}){1,7}|:)|::)$/i; -export const IP_ADDRESS_VALIDATOR = { +// Hostname pattern: RFC 1123 compliant (max 200 chars) +const HOSTNAME_PATTERN = + /^(?=.{1,200}$)(([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])\.)*([a-z0-9]|[a-z0-9][a-z0-9-]*[a-z0-9])$/i; + +const isValidIpAddress = (value: string): boolean => + IPV4_PATTERN.test(value.trim()) || IPV6_PATTERN.test(value.trim()); + +const isValidHostname = (value: string): boolean => + HOSTNAME_PATTERN.test(value.trim()); + +// Factory function to create validators with consistent structure +const createValidator = ( + validatorFn: (value: string) => boolean, + errorMessage: string +) => ({ validator( - rule: InternalRuleItem, + _rule: InternalRuleItem, value: string, callback: (error?: string) => void ) { - if (value && !isValidIpAddress(value)) { - callback('Must be an IP address'); - } else { - callback(); - } + callback(value && !validatorFn(value) ? errorMessage : undefined); } -}; +}); -const HOSTNAME_LENGTH_REGEXP = /^.{0,200}$/; -const HOSTNAME_PATTERN_REGEXP = - /^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])$/; +export const IP_ADDRESS_VALIDATOR = createValidator( + isValidIpAddress, + 'Must be an IP address' +); -const isValidHostname = (value: string) => - HOSTNAME_LENGTH_REGEXP.test(value) && HOSTNAME_PATTERN_REGEXP.test(value); +export const HOSTNAME_VALIDATOR = createValidator( + isValidHostname, + 'Must be a valid hostname' +); -export const HOSTNAME_VALIDATOR = { - validator( - rule: InternalRuleItem, - value: string, - callback: (error?: string) => void - ) { - if (value && !isValidHostname(value)) { - callback('Must be a valid hostname'); - } else { - callback(); - } - } -}; - -export const IP_OR_HOSTNAME_VALIDATOR = { - validator( - rule: InternalRuleItem, - value: string, - callback: (error?: string) => void - ) { - if (value && !(isValidIpAddress(value) || isValidHostname(value))) { - callback('Must be a valid IP address or hostname'); - } else { - callback(); - } - } -}; +export const IP_OR_HOSTNAME_VALIDATOR = createValidator( + (value) => isValidIpAddress(value) || isValidHostname(value), + 'Must be a valid IP address or hostname' +); diff --git a/interface/tsconfig.json b/interface/tsconfig.json index 3e8dfeb47..f10d8a42a 100644 --- a/interface/tsconfig.json +++ b/interface/tsconfig.json @@ -1,31 +1,109 @@ { "compilerOptions": { - "target": "ESNext", + // Target modern browsers for better performance + "target": "ES2022", "useDefineForClassFields": true, - "lib": ["DOM", "DOM.Iterable", "ESNext"], - "types": ["node"], + + // Optimized library selection + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "types": ["node", "vite/client"], + + // JavaScript handling "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": false, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "composite": true, + "checkJs": false, + + // Module system optimized for Vite "module": "ESNext", "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "resolveJsonModule": true, "isolatedModules": true, + + // Emit configuration "noEmit": true, - "useUnknownInCatchVariables": false, + "declaration": false, + "declarationMap": false, + "sourceMap": false, + + // React/JSX configuration "jsx": "react-jsx", - "noImplicitAny": false, - "baseUrl": "src", + "jsxImportSource": "react", + + // Strict type checking for better code quality + "strict": true, + "noImplicitAny": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "strictBindCallApply": true, + "strictPropertyInitialization": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "exactOptionalPropertyTypes": true, + + // Additional checks + "forceConsistentCasingInFileNames": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "useUnknownInCatchVariables": true, + + // Performance optimizations + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "incremental": true, + "tsBuildInfoFile": ".tsbuildinfo", + "assumeChangesOnlyAffectDirectDependencies": true, + + // Path mapping for cleaner imports + "baseUrl": ".", "paths": { - "@": ["src"], - "@/*": ["src/*"] + "@/*": ["src/*"], + "@/components/*": ["src/components/*"], + "@/utils/*": ["src/utils/*"], + "@/types/*": ["src/types/*"], + "@/hooks/*": ["src/hooks/*"], + "@/services/*": ["src/services/*"], + "@/assets/*": ["src/assets/*"], + // Support for bare imports from src directory + "App": ["src/App"], + "AppRouting": ["src/AppRouting"], + "CustomTheme": ["src/CustomTheme"], + "SignIn": ["src/SignIn"], + "AuthenticatedRouting": ["src/AuthenticatedRouting"], + "env": ["src/env"], + "components": ["src/components"], + "contexts": ["src/contexts"], + "i18n": ["src/i18n"], + "utils": ["src/utils"], + "validators": ["src/validators"], + "types": ["src/types"], + "api": ["src/api"], + "app": ["src/app"], + // Wildcard patterns for subdirectories + "components/*": ["src/components/*"], + "contexts/*": ["src/contexts/*"], + "i18n/*": ["src/i18n/*"], + "utils/*": ["src/utils/*"], + "validators/*": ["src/validators/*"], + "types/*": ["src/types/*"], + "api/*": ["src/api/*"], + "app/*": ["src/app/*"] } }, - "include": ["src/**/*", "vite.config.ts"], - "exclude": ["node_modules", "dist"] + "include": ["src/**/*", "vite.config.ts", "progmem-generator.js"], + "exclude": [ + "node_modules", + "dist", + "build", + ".tsbuildinfo", + "**/*.test.ts", + "**/*.test.tsx", + "**/*.spec.ts", + "**/*.spec.tsx" + ], + "ts-node": { + "esm": true + } } diff --git a/interface/vite.config.ts b/interface/vite.config.ts index b6eb7eb02..d73dc869f 100644 --- a/interface/vite.config.ts +++ b/interface/vite.config.ts @@ -1,131 +1,317 @@ import preact from '@preact/preset-vite'; +import fs from 'fs'; +import path from 'path'; import { visualizer } from 'rollup-plugin-visualizer'; -import { defineConfig } from 'vite'; +import { Plugin, defineConfig } from 'vite'; import viteImagemin from 'vite-plugin-imagemin'; import viteTsconfigPaths from 'vite-tsconfig-paths'; +import zlib from 'zlib'; +// @ts-expect-error - mock server doesn't have type declarations import mockServer from '../mock-api/mockServer.js'; -export default defineConfig(({ command, mode }) => { - if (command === 'serve') { - console.log('Preparing for standalone build with server, mode=' + mode); - return { - plugins: [preact(), viteTsconfigPaths(), mockServer()], - server: { - open: true, - port: mode == 'production' ? 4173 : 3000, - proxy: { - '/api': { - target: 'http://localhost:3080', - changeOrigin: true, - secure: false - }, - '/rest': 'http://localhost:3080', - '/gh': 'http://localhost:3080' // mock for GitHub API +// Constants +const KB_DIVISOR = 1024; +const REPEAT_CHAR = '='; +const REPEAT_COUNT = 50; +const DEFAULT_OUT_DIR = 'dist'; +const ES_TARGET = 'es2020'; +const CHUNK_SIZE_WARNING_LIMIT = 512; +const ASSETS_INLINE_LIMIT = 4096; + +// Common resolve aliases +const RESOLVE_ALIASES = { + react: 'preact/compat', + 'react-dom': 'preact/compat', + 'react/jsx-runtime': 'preact/jsx-runtime' +}; + +// Common resolve extensions - prioritize TypeScript/React files for Windows compatibility +const RESOLVE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js', '.mjs', '.json']; + +// Bundle file interface +interface BundleFile { + name: string; + size: number; + gzipSize: number; +} + +// Plugin to display bundle size information +const bundleSizeReporter = (): Plugin => { + return { + name: 'bundle-size-reporter', + // eslint-disable-next-line @typescript-eslint/no-explicit-any + writeBundle(options: any, bundle: any) { + console.log('\n📦 Bundle Size Report:'); + console.log(REPEAT_CHAR.repeat(REPEAT_COUNT)); + + const files: BundleFile[] = []; + const outDir = options.dir || DEFAULT_OUT_DIR; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-argument + const bundleEntries: Array<[string, any]> = Object.entries(bundle); + for (const [fileName, chunk] of bundleEntries) { + if (chunk?.type === 'chunk' || chunk?.type === 'asset') { + // eslint-disable-next-line @typescript-eslint/no-unsafe-argument + const filePath = path.join(outDir, fileName); + try { + const stats = fs.statSync(filePath); + const size = stats.size; + const fileContent = fs.readFileSync(filePath); + const gzipSize = zlib.gzipSync(fileContent).length; + + files.push({ name: fileName, size, gzipSize }); + } catch (error) { + console.warn(`Could not read file ${fileName}:`, error); + } } } - }; - } - if (mode === 'hosted') { - console.log('Preparing for hosted build'); - return { - plugins: [preact(), viteTsconfigPaths()], - build: { - chunkSizeWarningLimit: 1024 + files.sort((a, b) => b.size - a.size); + + // files.forEach((file) => { + // const sizeKB = (file.size / KB_DIVISOR).toFixed(2); + // const gzipKB = (file.gzipSize / KB_DIVISOR).toFixed(2); + // console.log( + // `📄 ${file.name.padEnd(30)} ${sizeKB.padStart(8)} KB (${gzipKB} KB gzipped)` + // ); + // }); + + const totalSize = files.reduce((sum, file) => sum + file.size, 0); + const totalGzipSize = files.reduce((sum, file) => sum + file.gzipSize, 0); + const compressionRatio = ((totalSize - totalGzipSize) / totalSize) * 100; + + console.log(REPEAT_CHAR.repeat(REPEAT_COUNT)); + console.log(`📊 Total Bundle Size: ${(totalSize / KB_DIVISOR).toFixed(2)} KB`); + console.log( + `🗜️ Total Gzipped Size: ${(totalGzipSize / KB_DIVISOR).toFixed(2)} KB` + ); + console.log(`📈 Compression Ratio: ${compressionRatio.toFixed(1)}%`); + console.log(REPEAT_CHAR.repeat(REPEAT_COUNT)); + } + }; +}; + +// Common preact plugin config +const createPreactPlugin = (devToolsEnabled: boolean) => + preact({ + devToolsEnabled, + prefreshEnabled: false + }); + +// Common base plugins +const createBasePlugins = ( + devToolsEnabled: boolean, + includeBundleReporter = true +) => { + const plugins = [ + createPreactPlugin(devToolsEnabled), + viteTsconfigPaths({ + projects: ['./tsconfig.json'] + }) + ]; + if (includeBundleReporter) { + plugins.push(bundleSizeReporter()); + } + return plugins; +}; + +// Manual chunk splitting strategy +const createManualChunks = (detailed = false) => { + return (id: string): string | undefined => { + if (id.includes('node_modules')) { + if (id.includes('preact')) return '@preact'; + if (detailed) { + if (id.includes('react-router')) return '@react-router'; + if (id.includes('@mui/material')) return '@mui-material'; + if (id.includes('@mui/icons-material')) return '@mui-icons'; + if (id.includes('alova')) return '@alova'; + if (id.includes('typesafe-i18n')) return '@i18n'; + if (id.includes('react-toastify')) return '@toastify'; + if (id.includes('@table-library')) return '@table-library'; + if (id.includes('uuid')) return '@uuid'; + if (id.includes('axios') || id.includes('fetch')) return '@http'; + if (id.includes('lodash') || id.includes('ramda')) return '@utils'; } - }; - } + return 'vendor'; + } + if (detailed) { + if (id.includes('components/')) return 'components'; + if (id.includes('app/')) return 'app'; + if (id.includes('utils/')) return 'utils'; + if (id.includes('api/')) return 'api'; + } + return undefined; + }; +}; - console.log('Preparing for production, optimized build'); +// Common build base configuration +const createBaseBuildConfig = () => ({ + target: ES_TARGET, + chunkSizeWarningLimit: CHUNK_SIZE_WARNING_LIMIT, + cssMinify: true, + assetsInlineLimit: ASSETS_INLINE_LIMIT +}); - return { - plugins: [ - preact(), - viteTsconfigPaths(), - { - ...viteImagemin({ - verbose: false, - gifsicle: { - optimizationLevel: 7, - interlaced: false - }, - optipng: { - optimizationLevel: 7 - }, - mozjpeg: { - quality: 20 - }, - pngquant: { - quality: [0.8, 0.9], - speed: 4 - }, - svgo: { - plugins: [ - { - name: 'removeViewBox' - }, - { - name: 'removeEmptyAttrs', - active: false - } - ] +// Terser options for hosted builds +const createHostedTerserOptions = () => ({ + compress: { + passes: 3, + drop_console: true, + drop_debugger: true, + dead_code: true, + unused: true + }, + mangle: { + toplevel: true + }, + ecma: 2020 as const +}); + +// Terser options for production builds +const createProductionTerserOptions = () => ({ + compress: { + passes: 6, + arrows: true, + drop_console: true, + drop_debugger: true, + sequences: true + }, + mangle: { + toplevel: true, + module: true + }, + ecma: 2020 as const, + enclose: false, + keep_classnames: false, + keep_fnames: false, + ie8: false, + module: false, + safari10: false, + toplevel: true +}); + +// Image optimization plugin +const imageOptimizationPlugin = { + ...viteImagemin({ + verbose: false, + gifsicle: { + optimizationLevel: 7, + interlaced: false + }, + optipng: { + optimizationLevel: 7 + }, + mozjpeg: { + quality: 20 + }, + pngquant: { + quality: [0.8, 0.9], + speed: 4 + }, + svgo: { + plugins: [ + { name: 'removeViewBox' }, + { name: 'removeEmptyAttrs', active: false } + ] + } + }), + enforce: 'pre' as const +}; + +export default defineConfig( + ({ command, mode }: { command: string; mode: string }) => { + if (command === 'serve') { + console.log(`Preparing for standalone build with server, mode=${mode}`); + return { + plugins: [...createBasePlugins(true, true), mockServer()], + resolve: { + alias: RESOLVE_ALIASES, + extensions: RESOLVE_EXTENSIONS + }, + server: { + open: true, + port: mode === 'production' ? 4173 : 3000, + proxy: { + '/api': { + target: 'http://localhost:3080', + changeOrigin: true, + secure: false + }, + '/rest': 'http://localhost:3080', + '/gh': 'http://localhost:3080' } - }), - enforce: 'pre' - }, - visualizer({ - template: 'treemap', // or sunburst - open: false, - gzipSize: true, - brotliSize: true, - filename: '../analyse.html' // will be saved in project's root - }) - ], - - build: { - // target: 'es2022', - chunkSizeWarningLimit: 1024, - minify: 'terser', - terserOptions: { - compress: { - passes: 4, - arrows: true, - drop_console: true, - drop_debugger: true, - sequences: true }, - mangle: { - // toplevel: true - // module: true - // properties: { - // regex: /^_/ - // } - }, - ecma: 5, - enclose: false, - keep_classnames: false, - keep_fnames: false, - ie8: false, - module: false, - nameCache: null, - safari10: false, - toplevel: false - }, + build: { + target: ES_TARGET, + minify: false, + sourcemap: true + } + }; + } - rollupOptions: { - output: { - manualChunks(id: string) { - if (id.includes('node_modules')) { - // creating a chunk to react routes deps. Reducing the vendor chunk size - if (id.includes('react-router')) { - return '@react-router'; - } - return 'vendor'; + if (mode === 'hosted') { + console.log('Preparing for hosted build'); + return { + plugins: createBasePlugins(false, true), + resolve: { + alias: RESOLVE_ALIASES, + extensions: RESOLVE_EXTENSIONS + }, + build: { + ...createBaseBuildConfig(), + minify: 'terser' as const, + terserOptions: createHostedTerserOptions(), + rollupOptions: { + treeshake: { + moduleSideEffects: false + }, + output: { + manualChunks: createManualChunks(false) } } } - } + }; } - }; -}); + + console.log('Preparing for production, optimized build'); + + return { + plugins: [ + ...createBasePlugins(false, true), + imageOptimizationPlugin, + visualizer({ + template: 'treemap', + open: false, + gzipSize: true, + brotliSize: true, + filename: '../analyse.html' + }) + ], + resolve: { + alias: RESOLVE_ALIASES, + extensions: RESOLVE_EXTENSIONS + }, + build: { + ...createBaseBuildConfig(), + minify: 'terser' as const, + terserOptions: createProductionTerserOptions(), + rollupOptions: { + treeshake: { + moduleSideEffects: false, + propertyReadSideEffects: false, + tryCatchDeoptimization: false, + unknownGlobalSideEffects: false + }, + output: { + chunkFileNames: 'assets/[name]-[hash].js', + entryFileNames: 'assets/[name]-[hash].js', + assetFileNames: 'assets/[name]-[hash].[ext]', + manualChunks: createManualChunks(true), + sourcemap: false + } + } + } + }; + } +); diff --git a/interface/yarn.lock b/interface/yarn.lock deleted file mode 100644 index e29cf72d8..000000000 --- a/interface/yarn.lock +++ /dev/null @@ -1,7077 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10c0 - -"@alova/adapter-xhr@npm:2.1.1": - version: 2.1.1 - resolution: "@alova/adapter-xhr@npm:2.1.1" - dependencies: - "@alova/shared": "npm:1.1.2" - peerDependencies: - alova: ^3.0.20 - checksum: 10c0/31e5ea726e7b64e3def8a507b7a03afe86331643c96af22129a1a202626b862eb3953fee9c2e29ca7b095a952e1a0e7d10fc98dd307f400e747121b582b9c776 - languageName: node - linkType: hard - -"@alova/shared@npm:1.1.2": - version: 1.1.2 - resolution: "@alova/shared@npm:1.1.2" - checksum: 10c0/faa1f909255bd214570868a89bf29051fb3c80ccb818467a2a26e05309540acb688f59f6deb37679da9ec0e65f5782db125d76b4980d7e3a366d212f6b9e4219 - languageName: node - linkType: hard - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/81d63cca5443e0f0c72ae18b544cc28c7c0ec2cea46e7cb888bb0e0f411a1191d0d6b7af798d54e30777d8d1488b2ec0732aac2be342d3d7d3ffd271c6f489ed - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.26.2": - version: 7.26.2 - resolution: "@babel/code-frame@npm:7.26.2" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.9" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10c0/7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.26.5": - version: 7.26.8 - resolution: "@babel/compat-data@npm:7.26.8" - checksum: 10c0/66408a0388c3457fff1c2f6c3a061278dd7b3d2f0455ea29bb7b187fa52c60ae8b4054b3c0a184e21e45f0eaac63cf390737bc7504d1f4a088a6e7f652c068ca - languageName: node - linkType: hard - -"@babel/core@npm:^7.22.1, @babel/core@npm:^7.26.10": - version: 7.26.10 - resolution: "@babel/core@npm:7.26.10" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.10" - "@babel/helper-compilation-targets": "npm:^7.26.5" - "@babel/helper-module-transforms": "npm:^7.26.0" - "@babel/helpers": "npm:^7.26.10" - "@babel/parser": "npm:^7.26.10" - "@babel/template": "npm:^7.26.9" - "@babel/traverse": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10c0/e046e0e988ab53841b512ee9d263ca409f6c46e2a999fe53024688b92db394346fa3aeae5ea0866331f62133982eee05a675d22922a4603c3f603aa09a581d62 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.26.10, @babel/generator@npm:^7.26.5": - version: 7.26.10 - resolution: "@babel/generator@npm:7.26.10" - dependencies: - "@babel/parser": "npm:^7.26.10" - "@babel/types": "npm:^7.26.10" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10c0/88b3b3ea80592fc89349c4e1a145e1386e4042866d2507298adf452bf972f68d13bf699a845e6ab8c028bd52c2247013eb1221b86e1db5c9779faacba9c4b10e - languageName: node - linkType: hard - -"@babel/helper-annotate-as-pure@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-annotate-as-pure@npm:7.25.9" - dependencies: - "@babel/types": "npm:^7.25.9" - checksum: 10c0/095b6ba50489d797733abebc4596a81918316a99e3632755c9f02508882912b00c2ae5e468532a25a5c2108d109ddbe9b7da78333ee7cc13817fc50c00cf06fe - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.26.5": - version: 7.26.5 - resolution: "@babel/helper-compilation-targets@npm:7.26.5" - dependencies: - "@babel/compat-data": "npm:^7.26.5" - "@babel/helper-validator-option": "npm:^7.25.9" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10c0/9da5c77e5722f1a2fcb3e893049a01d414124522bbf51323bb1a0c9dcd326f15279836450fc36f83c9e8a846f3c40e88be032ed939c5a9840922bed6073edfb4 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.16.7, @babel/helper-module-imports@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-module-imports@npm:7.25.9" - dependencies: - "@babel/traverse": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - checksum: 10c0/078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.26.0": - version: 7.26.0 - resolution: "@babel/helper-module-transforms@npm:7.26.0" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - "@babel/traverse": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.25.9": - version: 7.26.5 - resolution: "@babel/helper-plugin-utils@npm:7.26.5" - checksum: 10c0/cdaba71d4b891aa6a8dfbe5bac2f94effb13e5fa4c2c487667fdbaa04eae059b78b28d85a885071f45f7205aeb56d16759e1bed9c118b94b16e4720ef1ab0f65 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-string-parser@npm:7.25.9" - checksum: 10c0/7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-identifier@npm:7.25.9" - checksum: 10c0/4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/helper-validator-option@npm:7.25.9" - checksum: 10c0/27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.26.10": - version: 7.26.10 - resolution: "@babel/helpers@npm:7.26.10" - dependencies: - "@babel/template": "npm:^7.26.9" - "@babel/types": "npm:^7.26.10" - checksum: 10c0/f99e1836bcffce96db43158518bb4a24cf266820021f6461092a776cba2dc01d9fc8b1b90979d7643c5c2ab7facc438149064463a52dd528b21c6ab32509784f - languageName: node - linkType: hard - -"@babel/parser@npm:^7.26.10, @babel/parser@npm:^7.26.7, @babel/parser@npm:^7.26.9": - version: 7.26.10 - resolution: "@babel/parser@npm:7.26.10" - dependencies: - "@babel/types": "npm:^7.26.10" - bin: - parser: ./bin/babel-parser.js - checksum: 10c0/c47f5c0f63cd12a663e9dc94a635f9efbb5059d98086a92286d7764357c66bceba18ccbe79333e01e9be3bfb8caba34b3aaebfd8e62c3d5921c8cf907267be75 - languageName: node - linkType: hard - -"@babel/plugin-syntax-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" - dependencies: - "@babel/helper-plugin-utils": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx-development@npm:^7.22.5": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx-development@npm:7.25.9" - dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/c0b92ff9eb029620abf320ff74aae182cea87524723d740fb48a4373d0d16bddf5edbe1116e7ba341332a5337e55c2ceaee8b8cad5549e78af7f4b3cfe77debb - languageName: node - linkType: hard - -"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.25.9": - version: 7.25.9 - resolution: "@babel/plugin-transform-react-jsx@npm:7.25.9" - dependencies: - "@babel/helper-annotate-as-pure": "npm:^7.25.9" - "@babel/helper-module-imports": "npm:^7.25.9" - "@babel/helper-plugin-utils": "npm:^7.25.9" - "@babel/plugin-syntax-jsx": "npm:^7.25.9" - "@babel/types": "npm:^7.25.9" - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 10c0/5c9947e8ed141f7606f54da3e05eea1074950c5b8354c39df69cb7f43cb5a83c6c9d7973b24bc3d89341c8611f8ad50830a98ab10d117d850e6bdd8febdce221 - languageName: node - linkType: hard - -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.26.0, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.8.7": - version: 7.26.10 - resolution: "@babel/runtime@npm:7.26.10" - dependencies: - regenerator-runtime: "npm:^0.14.0" - checksum: 10c0/6dc6d88c7908f505c4f7770fb4677dfa61f68f659b943c2be1f2a99cb6680343462867abf2d49822adc435932919b36c77ac60125793e719ea8745f2073d3745 - languageName: node - linkType: hard - -"@babel/template@npm:^7.26.9": - version: 7.26.9 - resolution: "@babel/template@npm:7.26.9" - dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/parser": "npm:^7.26.9" - "@babel/types": "npm:^7.26.9" - checksum: 10c0/019b1c4129cc01ad63e17529089c2c559c74709d225f595eee017af227fee11ae8a97a6ab19ae6768b8aa22d8d75dcb60a00b28f52e9fa78140672d928bc1ae9 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.10, @babel/traverse@npm:^7.26.7": - version: 7.26.10 - resolution: "@babel/traverse@npm:7.26.10" - dependencies: - "@babel/code-frame": "npm:^7.26.2" - "@babel/generator": "npm:^7.26.10" - "@babel/parser": "npm:^7.26.10" - "@babel/template": "npm:^7.26.9" - "@babel/types": "npm:^7.26.10" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10c0/4e86bb4e3c30a6162bb91df86329df79d96566c3e2d9ccba04f108c30473a3a4fd360d9990531493d90f6a12004f10f616bf9b9229ca30c816b708615e9de2ac - languageName: node - linkType: hard - -"@babel/types@npm:^7.25.9, @babel/types@npm:^7.26.10, @babel/types@npm:^7.26.7, @babel/types@npm:^7.26.9": - version: 7.26.10 - resolution: "@babel/types@npm:7.26.10" - dependencies: - "@babel/helper-string-parser": "npm:^7.25.9" - "@babel/helper-validator-identifier": "npm:^7.25.9" - checksum: 10c0/7a7f83f568bfc3dfabfaf9ae3a97ab5c061726c0afa7dcd94226d4f84a81559da368ed79671e3a8039d16f12476cf110381a377ebdea07587925f69628200dac - languageName: node - linkType: hard - -"@emotion/babel-plugin@npm:^11.13.5": - version: 11.13.5 - resolution: "@emotion/babel-plugin@npm:11.13.5" - dependencies: - "@babel/helper-module-imports": "npm:^7.16.7" - "@babel/runtime": "npm:^7.18.3" - "@emotion/hash": "npm:^0.9.2" - "@emotion/memoize": "npm:^0.9.0" - "@emotion/serialize": "npm:^1.3.3" - babel-plugin-macros: "npm:^3.1.0" - convert-source-map: "npm:^1.5.0" - escape-string-regexp: "npm:^4.0.0" - find-root: "npm:^1.1.0" - source-map: "npm:^0.5.7" - stylis: "npm:4.2.0" - checksum: 10c0/8ccbfec7defd0e513cb8a1568fa179eac1e20c35fda18aed767f6c59ea7314363ebf2de3e9d2df66c8ad78928dc3dceeded84e6fa8059087cae5c280090aeeeb - languageName: node - linkType: hard - -"@emotion/cache@npm:^11.13.5, @emotion/cache@npm:^11.14.0": - version: 11.14.0 - resolution: "@emotion/cache@npm:11.14.0" - dependencies: - "@emotion/memoize": "npm:^0.9.0" - "@emotion/sheet": "npm:^1.4.0" - "@emotion/utils": "npm:^1.4.2" - "@emotion/weak-memoize": "npm:^0.4.0" - stylis: "npm:4.2.0" - checksum: 10c0/3fa3e7a431ab6f8a47c67132a00ac8358f428c1b6c8421d4b20de9df7c18e95eec04a5a6ff5a68908f98d3280044f247b4965ac63df8302d2c94dba718769724 - languageName: node - linkType: hard - -"@emotion/hash@npm:^0.9.2": - version: 0.9.2 - resolution: "@emotion/hash@npm:0.9.2" - checksum: 10c0/0dc254561a3cc0a06a10bbce7f6a997883fd240c8c1928b93713f803a2e9153a257a488537012efe89dbe1246f2abfe2add62cdb3471a13d67137fcb808e81c2 - languageName: node - linkType: hard - -"@emotion/is-prop-valid@npm:^1.3.0": - version: 1.3.1 - resolution: "@emotion/is-prop-valid@npm:1.3.1" - dependencies: - "@emotion/memoize": "npm:^0.9.0" - checksum: 10c0/123215540c816ff510737ec68dcc499c53ea4deb0bb6c2c27c03ed21046e2e69f6ad07a7a174d271c6cfcbcc9ea44e1763e0cf3875c92192f7689216174803cd - languageName: node - linkType: hard - -"@emotion/memoize@npm:^0.9.0": - version: 0.9.0 - resolution: "@emotion/memoize@npm:0.9.0" - checksum: 10c0/13f474a9201c7f88b543e6ea42f55c04fb2fdc05e6c5a3108aced2f7e7aa7eda7794c56bba02985a46d8aaa914fcdde238727a98341a96e2aec750d372dadd15 - languageName: node - linkType: hard - -"@emotion/react@npm:^11.14.0": - version: 11.14.0 - resolution: "@emotion/react@npm:11.14.0" - dependencies: - "@babel/runtime": "npm:^7.18.3" - "@emotion/babel-plugin": "npm:^11.13.5" - "@emotion/cache": "npm:^11.14.0" - "@emotion/serialize": "npm:^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" - "@emotion/utils": "npm:^1.4.2" - "@emotion/weak-memoize": "npm:^0.4.0" - hoist-non-react-statics: "npm:^3.3.1" - peerDependencies: - react: ">=16.8.0" - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/d0864f571a9f99ec643420ef31fde09e2006d3943a6aba079980e4d5f6e9f9fecbcc54b8f617fe003c00092ff9d5241179149ffff2810cb05cf72b4620cfc031 - languageName: node - linkType: hard - -"@emotion/serialize@npm:^1.3.3": - version: 1.3.3 - resolution: "@emotion/serialize@npm:1.3.3" - dependencies: - "@emotion/hash": "npm:^0.9.2" - "@emotion/memoize": "npm:^0.9.0" - "@emotion/unitless": "npm:^0.10.0" - "@emotion/utils": "npm:^1.4.2" - csstype: "npm:^3.0.2" - checksum: 10c0/b28cb7de59de382021de2b26c0c94ebbfb16967a1b969a56fdb6408465a8993df243bfbd66430badaa6800e1834724e84895f5a6a9d97d0d224de3d77852acb4 - languageName: node - linkType: hard - -"@emotion/sheet@npm:^1.4.0": - version: 1.4.0 - resolution: "@emotion/sheet@npm:1.4.0" - checksum: 10c0/3ca72d1650a07d2fbb7e382761b130b4a887dcd04e6574b2d51ce578791240150d7072a9bcb4161933abbcd1e38b243a6fb4464a7fe991d700c17aa66bb5acc7 - languageName: node - linkType: hard - -"@emotion/styled@npm:^11.14.0": - version: 11.14.0 - resolution: "@emotion/styled@npm:11.14.0" - dependencies: - "@babel/runtime": "npm:^7.18.3" - "@emotion/babel-plugin": "npm:^11.13.5" - "@emotion/is-prop-valid": "npm:^1.3.0" - "@emotion/serialize": "npm:^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks": "npm:^1.2.0" - "@emotion/utils": "npm:^1.4.2" - peerDependencies: - "@emotion/react": ^11.0.0-rc.0 - react: ">=16.8.0" - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/20aa5c488e4edecf63659212fc5ba1ccff2d3a66593fc8461de7cd5fe9192a741db357ffcd270a455bd61898d7f37cd5c84b4fd2b7974dade712badf7860ca9c - languageName: node - linkType: hard - -"@emotion/unitless@npm:^0.10.0": - version: 0.10.0 - resolution: "@emotion/unitless@npm:0.10.0" - checksum: 10c0/150943192727b7650eb9a6851a98034ddb58a8b6958b37546080f794696141c3760966ac695ab9af97efe10178690987aee4791f9f0ad1ff76783cdca83c1d49 - languageName: node - linkType: hard - -"@emotion/use-insertion-effect-with-fallbacks@npm:^1.2.0": - version: 1.2.0 - resolution: "@emotion/use-insertion-effect-with-fallbacks@npm:1.2.0" - peerDependencies: - react: ">=16.8.0" - checksum: 10c0/074dbc92b96bdc09209871070076e3b0351b6b47efefa849a7d9c37ab142130767609ca1831da0055988974e3b895c1de7606e4c421fecaa27c3e56a2afd3b08 - languageName: node - linkType: hard - -"@emotion/utils@npm:^1.4.2": - version: 1.4.2 - resolution: "@emotion/utils@npm:1.4.2" - checksum: 10c0/7d0010bf60a2a8c1a033b6431469de4c80e47aeb8fd856a17c1d1f76bbc3a03161a34aeaa78803566e29681ca551e7bf9994b68e9c5f5c796159923e44f78d9a - languageName: node - linkType: hard - -"@emotion/weak-memoize@npm:^0.4.0": - version: 0.4.0 - resolution: "@emotion/weak-memoize@npm:0.4.0" - checksum: 10c0/64376af11f1266042d03b3305c30b7502e6084868e33327e944b539091a472f089db307af69240f7188f8bc6b319276fd7b141a36613f1160d73d12a60f6ca1a - languageName: node - linkType: hard - -"@esbuild/aix-ppc64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/aix-ppc64@npm:0.25.1" - conditions: os=aix & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/android-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/android-arm64@npm:0.25.1" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/android-arm@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/android-arm@npm:0.25.1" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@esbuild/android-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/android-x64@npm:0.25.1" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/darwin-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/darwin-arm64@npm:0.25.1" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/darwin-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/darwin-x64@npm:0.25.1" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/freebsd-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/freebsd-arm64@npm:0.25.1" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/freebsd-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/freebsd-x64@npm:0.25.1" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/linux-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-arm64@npm:0.25.1" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/linux-arm@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-arm@npm:0.25.1" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"@esbuild/linux-ia32@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-ia32@npm:0.25.1" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.14.54": - version: 0.14.54 - resolution: "@esbuild/linux-loong64@npm:0.14.54" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-loong64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-loong64@npm:0.25.1" - conditions: os=linux & cpu=loong64 - languageName: node - linkType: hard - -"@esbuild/linux-mips64el@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-mips64el@npm:0.25.1" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"@esbuild/linux-ppc64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-ppc64@npm:0.25.1" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"@esbuild/linux-riscv64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-riscv64@npm:0.25.1" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"@esbuild/linux-s390x@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-s390x@npm:0.25.1" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"@esbuild/linux-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/linux-x64@npm:0.25.1" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/netbsd-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/netbsd-arm64@npm:0.25.1" - conditions: os=netbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/netbsd-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/netbsd-x64@npm:0.25.1" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/openbsd-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/openbsd-arm64@npm:0.25.1" - conditions: os=openbsd & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/openbsd-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/openbsd-x64@npm:0.25.1" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/sunos-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/sunos-x64@npm:0.25.1" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"@esbuild/win32-arm64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/win32-arm64@npm:0.25.1" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@esbuild/win32-ia32@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/win32-ia32@npm:0.25.1" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@esbuild/win32-x64@npm:0.25.1": - version: 0.25.1 - resolution: "@esbuild/win32-x64@npm:0.25.1" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.5.1 - resolution: "@eslint-community/eslint-utils@npm:4.5.1" - dependencies: - eslint-visitor-keys: "npm:^3.4.3" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10c0/b520ae1b7bd04531a5c5da2021071815df4717a9f7d13720e3a5ddccf5c9c619532039830811fcbae1c2f1c9d133e63af2435ee69e0fc0fabbd6d928c6800fb2 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1": - version: 4.12.1 - resolution: "@eslint-community/regexpp@npm:4.12.1" - checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 - languageName: node - linkType: hard - -"@eslint/config-array@npm:^0.19.2": - version: 0.19.2 - resolution: "@eslint/config-array@npm:0.19.2" - dependencies: - "@eslint/object-schema": "npm:^2.1.6" - debug: "npm:^4.3.1" - minimatch: "npm:^3.1.2" - checksum: 10c0/dd68da9abb32d336233ac4fe0db1e15a0a8d794b6e69abb9e57545d746a97f6f542496ff9db0d7e27fab1438546250d810d90b1904ac67677215b8d8e7573f3d - languageName: node - linkType: hard - -"@eslint/config-helpers@npm:^0.2.0": - version: 0.2.0 - resolution: "@eslint/config-helpers@npm:0.2.0" - checksum: 10c0/743a64653e13177029108f57ab47460ded08e3412c86216a14b7e8ab2dc79c2b64be45bf55c5ef29f83692a707dc34cf1e9217e4b8b4b272a0d9b691fdaf6a2a - languageName: node - linkType: hard - -"@eslint/core@npm:^0.12.0": - version: 0.12.0 - resolution: "@eslint/core@npm:0.12.0" - dependencies: - "@types/json-schema": "npm:^7.0.15" - checksum: 10c0/d032af81195bb28dd800c2b9617548c6c2a09b9490da3c5537fd2a1201501666d06492278bb92cfccac1f7ac249e58601dd87f813ec0d6a423ef0880434fa0c3 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^3.3.1": - version: 3.3.1 - resolution: "@eslint/eslintrc@npm:3.3.1" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^10.0.1" - globals: "npm:^14.0.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41 - languageName: node - linkType: hard - -"@eslint/js@npm:9.23.0, @eslint/js@npm:^9.23.0": - version: 9.23.0 - resolution: "@eslint/js@npm:9.23.0" - checksum: 10c0/4e70869372b6325389e0ab51cac6d3062689807d1cef2c3434857571422ce11dde3c62777af85c382b9f94d937127598d605d2086787f08611351bf99faded81 - languageName: node - linkType: hard - -"@eslint/object-schema@npm:^2.1.6": - version: 2.1.6 - resolution: "@eslint/object-schema@npm:2.1.6" - checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56 - languageName: node - linkType: hard - -"@eslint/plugin-kit@npm:^0.2.7": - version: 0.2.7 - resolution: "@eslint/plugin-kit@npm:0.2.7" - dependencies: - "@eslint/core": "npm:^0.12.0" - levn: "npm:^0.4.1" - checksum: 10c0/0a1aff1ad63e72aca923217e556c6dfd67d7cd121870eb7686355d7d1475d569773528a8b2111b9176f3d91d2ea81f7413c34600e8e5b73d59e005d70780b633 - languageName: node - linkType: hard - -"@humanfs/core@npm:^0.19.1": - version: 0.19.1 - resolution: "@humanfs/core@npm:0.19.1" - checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 - languageName: node - linkType: hard - -"@humanfs/node@npm:^0.16.6": - version: 0.16.6 - resolution: "@humanfs/node@npm:0.16.6" - dependencies: - "@humanfs/core": "npm:^0.19.1" - "@humanwhocodes/retry": "npm:^0.3.0" - checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10c0/909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.3.0": - version: 0.3.1 - resolution: "@humanwhocodes/retry@npm:0.3.1" - checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b - languageName: node - linkType: hard - -"@humanwhocodes/retry@npm:^0.4.2": - version: 0.4.2 - resolution: "@humanwhocodes/retry@npm:0.4.2" - checksum: 10c0/0235525d38f243bee3bf8b25ed395fbf957fb51c08adae52787e1325673071abe856c7e18e530922ed2dd3ce12ed82ba01b8cee0279ac52a3315fcdc3a69ef0c - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10c0/b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e - languageName: node - linkType: hard - -"@isaacs/fs-minipass@npm:^4.0.0": - version: 4.0.1 - resolution: "@isaacs/fs-minipass@npm:4.0.1" - dependencies: - minipass: "npm:^7.0.4" - checksum: 10c0/c25b6dc1598790d5b55c0947a9b7d111cfa92594db5296c3b907e2f533c033666f692a3939eadac17b1c7c40d362d0b0635dc874cbfe3e70db7c2b07cc97a5d2 - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.8 - resolution: "@jridgewell/gen-mapping@npm:0.3.8" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10c0/c668feaf86c501d7c804904a61c23c67447b2137b813b9ce03eca82cb9d65ac7006d766c218685d76e3d72828279b6ee26c347aa1119dab23fbaf36aed51585a - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10c0/d502e6fb516b35032331406d4e962c21fe77cdf1cbdb49c6142bcbd9e30507094b18972778a6e27cbad756209cfe34b1a27729e6fa08a2eb92b33943f680cf1e - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10c0/2a5aa7b4b5c3464c895c802d8ae3f3d2b92fcbe84ad12f8d0bfbb1f5ad006717e7577ee1fd2eac00c088abe486c7adb27976f45d2941ff6b0b92b2c3302c60f4 - languageName: node - linkType: hard - -"@jridgewell/source-map@npm:^0.3.3": - version: 0.3.6 - resolution: "@jridgewell/source-map@npm:0.3.6" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - checksum: 10c0/6a4ecc713ed246ff8e5bdcc1ef7c49aaa93f7463d948ba5054dda18b02dcc6a055e2828c577bcceee058f302ce1fc95595713d44f5c45e43d459f88d267f2f04 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10c0/3d1ce6ebc69df9682a5a8896b414c6537e428a1d68b02fcc8363b04284a8ca0df04d0ee3013132252ab14f2527bc13bea6526a912ecb5658f0e39fd2860b4df4 - languageName: node - linkType: hard - -"@mui/core-downloads-tracker@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/core-downloads-tracker@npm:6.4.8" - checksum: 10c0/400284ecfa4c5584148409c09b4fc7be7a59505876e41caa0d7d1b2571df43cc6857a3cc34ce61d658892b7d268ba10572b8f51f0d015a9b74a40bdbba50eca6 - languageName: node - linkType: hard - -"@mui/icons-material@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/icons-material@npm:6.4.8" - dependencies: - "@babel/runtime": "npm:^7.26.0" - peerDependencies: - "@mui/material": ^6.4.8 - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/5043f3dc013c8a5edcde71432f81a6adeb66ebeb31e9840f2734ef7cd2608e8f9b6200b03b2b6e22001b4b86a647df5ac10231795a307cb359e2bfe0166d9783 - languageName: node - linkType: hard - -"@mui/material@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/material@npm:6.4.8" - dependencies: - "@babel/runtime": "npm:^7.26.0" - "@mui/core-downloads-tracker": "npm:^6.4.8" - "@mui/system": "npm:^6.4.8" - "@mui/types": "npm:~7.2.24" - "@mui/utils": "npm:^6.4.8" - "@popperjs/core": "npm:^2.11.8" - "@types/react-transition-group": "npm:^4.4.12" - clsx: "npm:^2.1.1" - csstype: "npm:^3.1.3" - prop-types: "npm:^15.8.1" - react-is: "npm:^19.0.0" - react-transition-group: "npm:^4.4.5" - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@mui/material-pigment-css": ^6.4.8 - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@mui/material-pigment-css": - optional: true - "@types/react": - optional: true - checksum: 10c0/9604e11cbb862cdc4219f6973023ad126296ac1421cfd661db09a1bac296cfb6c3c81643790944ba9037555581ff8d590bfab4d6c60cec3ec6f56868579eb7af - languageName: node - linkType: hard - -"@mui/private-theming@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/private-theming@npm:6.4.8" - dependencies: - "@babel/runtime": "npm:^7.26.0" - "@mui/utils": "npm:^6.4.8" - prop-types: "npm:^15.8.1" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/5acc9ad80d70757d31e6f95e833833826c1885ef90b6ae5de5cfe2883c4b276427efb5b0ba0bba0eb37fe80e5a7ae91c2d193807f32812c30be4d53d6ee9eb18 - languageName: node - linkType: hard - -"@mui/styled-engine@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/styled-engine@npm:6.4.8" - dependencies: - "@babel/runtime": "npm:^7.26.0" - "@emotion/cache": "npm:^11.13.5" - "@emotion/serialize": "npm:^1.3.3" - "@emotion/sheet": "npm:^1.4.0" - csstype: "npm:^3.1.3" - prop-types: "npm:^15.8.1" - peerDependencies: - "@emotion/react": ^11.4.1 - "@emotion/styled": ^11.3.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - checksum: 10c0/25731348f3bd1767d2528419671c3b6e75911a6fdb1f71f94b1fa009b95c3a6875bd38727a93f32edbf1ed2c1ab4c08433aaee0b136b45d3dd01e223fa025422 - languageName: node - linkType: hard - -"@mui/system@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/system@npm:6.4.8" - dependencies: - "@babel/runtime": "npm:^7.26.0" - "@mui/private-theming": "npm:^6.4.8" - "@mui/styled-engine": "npm:^6.4.8" - "@mui/types": "npm:~7.2.24" - "@mui/utils": "npm:^6.4.8" - clsx: "npm:^2.1.1" - csstype: "npm:^3.1.3" - prop-types: "npm:^15.8.1" - peerDependencies: - "@emotion/react": ^11.5.0 - "@emotion/styled": ^11.3.0 - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@emotion/react": - optional: true - "@emotion/styled": - optional: true - "@types/react": - optional: true - checksum: 10c0/72cc6ce2a6695b2487fc0308ae04d93a3a3f7d5abf15c830bffb2ec9aac473167ab4f2b147035a2442d9f1dd5f5936f2aa71d7fa95afbddc195c442882920b73 - languageName: node - linkType: hard - -"@mui/types@npm:~7.2.24": - version: 7.2.24 - resolution: "@mui/types@npm:7.2.24" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/7756339cae70e9b684c4311924e4e3882f908552b69c434b4d13faf2f5908ce72fe889a31890257c5ad42a085207be7c1661981dfc683293e90ac6dfac3759d0 - languageName: node - linkType: hard - -"@mui/utils@npm:^6.4.8": - version: 6.4.8 - resolution: "@mui/utils@npm:6.4.8" - dependencies: - "@babel/runtime": "npm:^7.26.0" - "@mui/types": "npm:~7.2.24" - "@types/prop-types": "npm:^15.7.14" - clsx: "npm:^2.1.1" - prop-types: "npm:^15.8.1" - react-is: "npm:^19.0.0" - peerDependencies: - "@types/react": ^17.0.0 || ^18.0.0 || ^19.0.0 - react: ^17.0.0 || ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - "@types/react": - optional: true - checksum: 10c0/df2392c3a2bb5a9549eec9b897ec418d40d41f74f8317ccc0e86c6973358d0ede46e10927581415c9d265067739be3a5b7ce3ec8027375bf526cdaa2a8560862 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10c0/732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10c0/88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10c0/db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^3.0.0": - version: 3.0.0 - resolution: "@npmcli/agent@npm:3.0.0" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10c0/efe37b982f30740ee77696a80c196912c274ecd2cb243bc6ae7053a50c733ce0f6c09fda085145f33ecf453be19654acca74b69e81eaad4c90f00ccffe2f9271 - languageName: node - linkType: hard - -"@npmcli/fs@npm:^4.0.0": - version: 4.0.0 - resolution: "@npmcli/fs@npm:4.0.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10c0/c90935d5ce670c87b6b14fab04a965a3b8137e585f8b2a6257263bd7f97756dd736cb165bb470e5156a9e718ecd99413dccc54b1138c1a46d6ec7cf325982fe5 - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10c0/5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd - languageName: node - linkType: hard - -"@popperjs/core@npm:^2.11.8": - version: 2.11.8 - resolution: "@popperjs/core@npm:2.11.8" - checksum: 10c0/4681e682abc006d25eb380d0cf3efc7557043f53b6aea7a5057d0d1e7df849a00e281cd8ea79c902a35a414d7919621fc2ba293ecec05f413598e0b23d5a1e63 - languageName: node - linkType: hard - -"@preact/compat@npm:^18.3.1": - version: 18.3.1 - resolution: "@preact/compat@npm:18.3.1" - peerDependencies: - preact: "*" - checksum: 10c0/7997c4b761098c9ff6ca3850362784982a4e0b3fee847eda7c1f2e5e8211cc55a1fa1ed4e91711ac8c197a1096335b0f019fa8eeb86a9ed738c0bf6e7647ceb2 - languageName: node - linkType: hard - -"@preact/preset-vite@npm:^2.10.1": - version: 2.10.1 - resolution: "@preact/preset-vite@npm:2.10.1" - dependencies: - "@babel/plugin-transform-react-jsx": "npm:^7.22.15" - "@babel/plugin-transform-react-jsx-development": "npm:^7.22.5" - "@prefresh/vite": "npm:^2.4.1" - "@rollup/pluginutils": "npm:^4.1.1" - babel-plugin-transform-hook-names: "npm:^1.0.2" - debug: "npm:^4.3.4" - kolorist: "npm:^1.8.0" - vite-prerender-plugin: "npm:^0.5.3" - peerDependencies: - "@babel/core": 7.x - vite: 2.x || 3.x || 4.x || 5.x || 6.x - checksum: 10c0/29ee1414acd920a961b9590de9800478155282fc16db05be5e427300bd29979607ba80b3f4a5f30c52d86d924de433529f63aa96c1a966685e73a43fc4a9974c - languageName: node - linkType: hard - -"@prefresh/babel-plugin@npm:0.5.1": - version: 0.5.1 - resolution: "@prefresh/babel-plugin@npm:0.5.1" - checksum: 10c0/f9153c210427adbddb4403502f8fa845f6207516de2d162f5d550683a87173dc3eaabc6be2bb4f1206b882cdd23339f2092567be8d09794a3d06a5626942b1e4 - languageName: node - linkType: hard - -"@prefresh/core@npm:^1.5.1": - version: 1.5.3 - resolution: "@prefresh/core@npm:1.5.3" - peerDependencies: - preact: ^10.0.0 - checksum: 10c0/402e2d39fecdea6963326c952513c21aaaed215c6066e55708bca725025638911068bac09d6a6d9a044f6093827d6cf23b063651806ddc9d4aa977015f5c713e - languageName: node - linkType: hard - -"@prefresh/utils@npm:^1.2.0": - version: 1.2.0 - resolution: "@prefresh/utils@npm:1.2.0" - checksum: 10c0/38cdc6cbb5e18df36996161214eb1097db3361cb0b6402a8012cbe500ba8fb5bcbdc39a687d3b6d67e99f6c340ed77d59f27ab167dfc1655eb4d783740d87d52 - languageName: node - linkType: hard - -"@prefresh/vite@npm:^2.4.1": - version: 2.4.7 - resolution: "@prefresh/vite@npm:2.4.7" - dependencies: - "@babel/core": "npm:^7.22.1" - "@prefresh/babel-plugin": "npm:0.5.1" - "@prefresh/core": "npm:^1.5.1" - "@prefresh/utils": "npm:^1.2.0" - "@rollup/pluginutils": "npm:^4.2.1" - peerDependencies: - preact: ^10.4.0 - vite: ">=2.0.0" - checksum: 10c0/50ff4dae837ca1484d7cdeac692a1656d7e3bf5eac61ffd872a06af61108466aae45a636245d1fd6374f087c1d53cc9b60d92a8d5f250d71c6d9d009a153e157 - languageName: node - linkType: hard - -"@rollup/pluginutils@npm:^4.1.1, @rollup/pluginutils@npm:^4.2.1": - version: 4.2.1 - resolution: "@rollup/pluginutils@npm:4.2.1" - dependencies: - estree-walker: "npm:^2.0.1" - picomatch: "npm:^2.2.2" - checksum: 10c0/3ee56b2c8f1ed8dfd0a92631da1af3a2dfdd0321948f089b3752b4de1b54dc5076701eadd0e5fc18bd191b77af594ac1db6279e83951238ba16bf8a414c64c48 - languageName: node - linkType: hard - -"@rollup/rollup-android-arm-eabi@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.36.0" - conditions: os=android & cpu=arm - languageName: node - linkType: hard - -"@rollup/rollup-android-arm64@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-android-arm64@npm:4.36.0" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-arm64@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.36.0" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-darwin-x64@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.36.0" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-arm64@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.36.0" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-freebsd-x64@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.36.0" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-gnueabihf@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.36.0" - conditions: os=linux & cpu=arm & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm-musleabihf@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.36.0" - conditions: os=linux & cpu=arm & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-gnu@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.36.0" - conditions: os=linux & cpu=arm64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-arm64-musl@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.36.0" - conditions: os=linux & cpu=arm64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-linux-loongarch64-gnu@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.36.0" - conditions: os=linux & cpu=loong64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.36.0" - conditions: os=linux & cpu=ppc64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-riscv64-gnu@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.36.0" - conditions: os=linux & cpu=riscv64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-s390x-gnu@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.36.0" - conditions: os=linux & cpu=s390x & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-gnu@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.36.0" - conditions: os=linux & cpu=x64 & libc=glibc - languageName: node - linkType: hard - -"@rollup/rollup-linux-x64-musl@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.36.0" - conditions: os=linux & cpu=x64 & libc=musl - languageName: node - linkType: hard - -"@rollup/rollup-win32-arm64-msvc@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.36.0" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"@rollup/rollup-win32-ia32-msvc@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.36.0" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"@rollup/rollup-win32-x64-msvc@npm:4.36.0": - version: 4.36.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.36.0" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"@sindresorhus/is@npm:^0.7.0": - version: 0.7.0 - resolution: "@sindresorhus/is@npm:0.7.0" - checksum: 10c0/c5b483cfa36556326267d525504dfadced0cc3516c2014bbe1c60377ca8e778cd74de26b24666a818ab41da2660bb80d61f545e93be3471f5d022a9999ed5bb9 - languageName: node - linkType: hard - -"@table-library/react-table-library@npm:4.1.12": - version: 4.1.12 - resolution: "@table-library/react-table-library@npm:4.1.12" - dependencies: - clsx: "npm:1.1.1" - react-virtualized-auto-sizer: "npm:1.0.7" - react-window: "npm:1.8.7" - peerDependencies: - "@emotion/react": ">= 11" - react: ">=16.8.0" - react-dom: ">=16.8.0" - checksum: 10c0/a20da02bcab45dcc2d4c2f973e8e453253652f9681019dfdd9ea24b464b84602fd8173686a3a5b2f698c110fb9aaad54fafe2dface0dc5337e01c89b8345a392 - languageName: node - linkType: hard - -"@trivago/prettier-plugin-sort-imports@npm:^5.2.2": - version: 5.2.2 - resolution: "@trivago/prettier-plugin-sort-imports@npm:5.2.2" - dependencies: - "@babel/generator": "npm:^7.26.5" - "@babel/parser": "npm:^7.26.7" - "@babel/traverse": "npm:^7.26.7" - "@babel/types": "npm:^7.26.7" - javascript-natural-sort: "npm:^0.7.1" - lodash: "npm:^4.17.21" - peerDependencies: - "@vue/compiler-sfc": 3.x - prettier: 2.x - 3.x - prettier-plugin-svelte: 3.x - svelte: 4.x || 5.x - peerDependenciesMeta: - "@vue/compiler-sfc": - optional: true - prettier-plugin-svelte: - optional: true - svelte: - optional: true - checksum: 10c0/2a4f0464f1f5a294bcd34558fb053f8263f0c62c4a7fcdd3ce40c9822a68ac8b4d951700ab6d01eb3919efe0ed44e4191997edd494d59679b22db1c0db00474e - languageName: node - linkType: hard - -"@trysound/sax@npm:0.2.0": - version: 0.2.0 - resolution: "@trysound/sax@npm:0.2.0" - checksum: 10c0/44907308549ce775a41c38a815f747009ac45929a45d642b836aa6b0a536e4978d30b8d7d680bbd116e9dd73b7dbe2ef0d1369dcfc2d09e83ba381e485ecbe12 - languageName: node - linkType: hard - -"@types/cookie@npm:^0.6.0": - version: 0.6.0 - resolution: "@types/cookie@npm:0.6.0" - checksum: 10c0/5b326bd0188120fb32c0be086b141b1481fec9941b76ad537f9110e10d61ee2636beac145463319c71e4be67a17e85b81ca9e13ceb6e3bb63b93d16824d6c149 - languageName: node - linkType: hard - -"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.6": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 10c0/cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a - languageName: node - linkType: hard - -"@types/formidable@npm:^3": - version: 3.4.5 - resolution: "@types/formidable@npm:3.4.5" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/733dc59d4d12152ba5fb70751184812345ff08691864dd9b1b7626b9d40045a306021b9721495cafb56cd375da54fecaaebdada98fc390b7406ebb81efe0bfbe - languageName: node - linkType: hard - -"@types/glob@npm:^7.1.1": - version: 7.2.0 - resolution: "@types/glob@npm:7.2.0" - dependencies: - "@types/minimatch": "npm:*" - "@types/node": "npm:*" - checksum: 10c0/a8eb5d5cb5c48fc58c7ca3ff1e1ddf771ee07ca5043da6e4871e6757b4472e2e73b4cfef2644c38983174a4bc728c73f8da02845c28a1212f98cabd293ecae98 - languageName: node - linkType: hard - -"@types/imagemin-gifsicle@npm:^7.0.1": - version: 7.0.4 - resolution: "@types/imagemin-gifsicle@npm:7.0.4" - dependencies: - "@types/imagemin": "npm:*" - checksum: 10c0/6c2e71b8be7035eca61c8d02f8d28c0c215d13fdddfc13c4cb2e1e4a567aa8e999a174019303c1a22f56fafc22d92ebebfa74e1740f33394087f3eb7fd89f34d - languageName: node - linkType: hard - -"@types/imagemin-jpegtran@npm:^5.0.1": - version: 5.0.4 - resolution: "@types/imagemin-jpegtran@npm:5.0.4" - dependencies: - "@types/imagemin": "npm:*" - checksum: 10c0/f175a092dcf922c83d9f617f39a67091757720c4970379283380e1d3610f634fa753c86781e0fe0185843bc536a901ae866d56f71972973109284e231b430ad1 - languageName: node - linkType: hard - -"@types/imagemin-mozjpeg@npm:^8.0.1": - version: 8.0.4 - resolution: "@types/imagemin-mozjpeg@npm:8.0.4" - dependencies: - "@types/imagemin": "npm:*" - checksum: 10c0/d08028d0f0e17be8febb44c31fc567bc8f6bc15fd63ec58d5944a51fbcc0635de7ed97df67bc371fde0869b7520bd9da3ee9eb1b6664a8046444bdce1510bf56 - languageName: node - linkType: hard - -"@types/imagemin-optipng@npm:^5.2.1": - version: 5.2.4 - resolution: "@types/imagemin-optipng@npm:5.2.4" - dependencies: - "@types/imagemin": "npm:*" - checksum: 10c0/6cb62161e52f40ab50cee016e6f4bb6d71c9948d7b9e7df749f0c5da6bb5c8d73910abc661d74720df18e7489c44ba683d52801d66d82158e615135b8dc65510 - languageName: node - linkType: hard - -"@types/imagemin-svgo@npm:^10.0.0": - version: 10.0.5 - resolution: "@types/imagemin-svgo@npm:10.0.5" - dependencies: - "@types/imagemin": "npm:*" - "@types/svgo": "npm:2" - checksum: 10c0/ed793ec98748c6ffe410bc9594e286955d44b305fcbcb223b238f6535bb98b7d1eb90ba0f92072e9fb7a08e099b5f3f7642ed29d8382e4a027030493882d77c5 - languageName: node - linkType: hard - -"@types/imagemin-webp@npm:^7.0.0": - version: 7.0.3 - resolution: "@types/imagemin-webp@npm:7.0.3" - dependencies: - "@types/imagemin": "npm:*" - checksum: 10c0/7de67329d5305c6f30c00048986318f6f31af45ceaec35c81508064547ce565c226c95c0fbe290df29ccbcb676649e034e28144f4832299586d1f6c0a24148b8 - languageName: node - linkType: hard - -"@types/imagemin@npm:*": - version: 9.0.1 - resolution: "@types/imagemin@npm:9.0.1" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/0f5edd5e1b39c132424f2e2c29c8a713d9c813bb99f8dcf987b5b56ff85989412d4b77ac99b1b7794050e7bde4ff82d885eb87bbf135ac2a02e1096eeb3b18eb - languageName: node - linkType: hard - -"@types/imagemin@npm:^7.0.1": - version: 7.0.1 - resolution: "@types/imagemin@npm:7.0.1" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/843a83ac6299949a65b547dc2f3f01fe677d85e739f722f73459739dc2f5549c3e47d5b43bad8d3861677d536bbda0213e9b2a4b88f7cb73f1739e81f984c002 - languageName: node - linkType: hard - -"@types/json-schema@npm:^7.0.15": - version: 7.0.15 - resolution: "@types/json-schema@npm:7.0.15" - checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db - languageName: node - linkType: hard - -"@types/keyv@npm:^3.1.1": - version: 3.1.4 - resolution: "@types/keyv@npm:3.1.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/ff8f54fc49621210291f815fe5b15d809fd7d032941b3180743440bd507ecdf08b9e844625fa346af568c84bf34114eb378dcdc3e921a08ba1e2a08d7e3c809c - languageName: node - linkType: hard - -"@types/minimatch@npm:*": - version: 5.1.2 - resolution: "@types/minimatch@npm:5.1.2" - checksum: 10c0/83cf1c11748891b714e129de0585af4c55dd4c2cafb1f1d5233d79246e5e1e19d1b5ad9e8db449667b3ffa2b6c80125c429dbee1054e9efb45758dbc4e118562 - languageName: node - linkType: hard - -"@types/node@npm:*, @types/node@npm:^22.13.11": - version: 22.13.11 - resolution: "@types/node@npm:22.13.11" - dependencies: - undici-types: "npm:~6.20.0" - checksum: 10c0/f6ee33d36372242535c38640fe7550a6640d8a775ec19b55bfc11775b521cba072d892ca92a912332ce01b317293d645c1bf767f3f882ec719f2404a3d2a5b96 - languageName: node - linkType: hard - -"@types/parse-json@npm:^4.0.0": - version: 4.0.2 - resolution: "@types/parse-json@npm:4.0.2" - checksum: 10c0/b1b863ac34a2c2172fbe0807a1ec4d5cb684e48d422d15ec95980b81475fac4fdb3768a8b13eef39130203a7c04340fc167bae057c7ebcafd7dec9fe6c36aeb1 - languageName: node - linkType: hard - -"@types/prop-types@npm:^15.7.14": - version: 15.7.14 - resolution: "@types/prop-types@npm:15.7.14" - checksum: 10c0/1ec775160bfab90b67a782d735952158c7e702ca4502968aa82565bd8e452c2de8601c8dfe349733073c31179116cf7340710160d3836aa8a1ef76d1532893b1 - languageName: node - linkType: hard - -"@types/react-dom@npm:^19.0.4": - version: 19.0.4 - resolution: "@types/react-dom@npm:19.0.4" - peerDependencies: - "@types/react": ^19.0.0 - checksum: 10c0/4e71853919b94df9e746a4bd73f8180e9ae13016333ce9c543dcba9f4f4c8fe6e28b038ca6ee61c24e291af8e03ca3bc5ded17c46dee938fcb32d71186fda7a3 - languageName: node - linkType: hard - -"@types/react-transition-group@npm:^4.4.12": - version: 4.4.12 - resolution: "@types/react-transition-group@npm:4.4.12" - peerDependencies: - "@types/react": "*" - checksum: 10c0/0441b8b47c69312c89ec0760ba477ba1a0808a10ceef8dc1c64b1013ed78517332c30f18681b0ec0b53542731f1ed015169fed1d127cc91222638ed955478ec7 - languageName: node - linkType: hard - -"@types/react@npm:^19.0.12": - version: 19.0.12 - resolution: "@types/react@npm:19.0.12" - dependencies: - csstype: "npm:^3.0.2" - checksum: 10c0/c814b6af5c0fbcf5c65d031b1c9bf98c5b857e015254d95811f2851b27b869c3d31c6f35dab127dc6921a3dbda0b0622c6323d493a14b31b231a6a58c41c5e84 - languageName: node - linkType: hard - -"@types/responselike@npm:^1.0.0": - version: 1.0.3 - resolution: "@types/responselike@npm:1.0.3" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/a58ba341cb9e7d74f71810a88862da7b2a6fa42e2a1fc0ce40498f6ea1d44382f0640117057da779f74c47039f7166bf48fad02dc876f94e005c7afa50f5e129 - languageName: node - linkType: hard - -"@types/svgo@npm:2, @types/svgo@npm:^2.6.1": - version: 2.6.4 - resolution: "@types/svgo@npm:2.6.4" - dependencies: - "@types/node": "npm:*" - checksum: 10c0/cc148fc6c0b734c88f0db0753692560f930c20ac5f3739b6147143bebb5007357bc0f8a82f9d9d0bddedca70b713e8e16530b036546a095084ee8c43911432a0 - languageName: node - linkType: hard - -"@typescript-eslint/eslint-plugin@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.27.0" - dependencies: - "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.27.0" - "@typescript-eslint/type-utils": "npm:8.27.0" - "@typescript-eslint/utils": "npm:8.27.0" - "@typescript-eslint/visitor-keys": "npm:8.27.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.3.1" - natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^2.0.1" - peerDependencies: - "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/95bbab011bfe51ca657ff346e4c6cac25652c88e5188a5e74d14372dba45c3d7aa713f4c90f80ebc885d77a8be89e131e8b77c096145c90da6c251a475b125fc - languageName: node - linkType: hard - -"@typescript-eslint/parser@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/parser@npm:8.27.0" - dependencies: - "@typescript-eslint/scope-manager": "npm:8.27.0" - "@typescript-eslint/types": "npm:8.27.0" - "@typescript-eslint/typescript-estree": "npm:8.27.0" - "@typescript-eslint/visitor-keys": "npm:8.27.0" - debug: "npm:^4.3.4" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/2ada98167ca5a474544fada7658d7c8d54ea4dfdd692e3d30d18b5531e50d7308a5b09d23dca651f9fe841f96075ccd18643431f4b61d0e4e7e7ccde888258e8 - languageName: node - linkType: hard - -"@typescript-eslint/scope-manager@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/scope-manager@npm:8.27.0" - dependencies: - "@typescript-eslint/types": "npm:8.27.0" - "@typescript-eslint/visitor-keys": "npm:8.27.0" - checksum: 10c0/d87daeffb81f4e70f168c38f01c667713bda71c4545e28fcdf0792378fb3df171894ef77854c5c1a5e5a22c784ee1ccea2dd856b5baf825840710a6a74c14ac9 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/type-utils@npm:8.27.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:8.27.0" - "@typescript-eslint/utils": "npm:8.27.0" - debug: "npm:^4.3.4" - ts-api-utils: "npm:^2.0.1" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/f38cdc660ebcb3b71496182b9ea52301ab08a4f062558aa7061a5f0b759ae3e8f68ae250a29e74251cb52c6c56733d7dabed7002b993544cbe0933bb75d67a57 - languageName: node - linkType: hard - -"@typescript-eslint/types@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/types@npm:8.27.0" - checksum: 10c0/9c5f2ba816a9baea5982feeadebe4d19f4df77ddb025a7b2307f9e1e6914076b63cbad81f7f915814e64b4d915052cf27bd79ce3e5a831340cb5ab244133941b - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.27.0" - dependencies: - "@typescript-eslint/types": "npm:8.27.0" - "@typescript-eslint/visitor-keys": "npm:8.27.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.0.1" - peerDependencies: - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/c04d602825ff2a7b2a89746a68b32f7052fb4ce3d2355d1f4e6f43fd064f17c3b44fb974c98838a078fdebdc35152d2ab0af34663dfca99db7a790bd3fc5d8ac - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/utils@npm:8.27.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.27.0" - "@typescript-eslint/types": "npm:8.27.0" - "@typescript-eslint/typescript-estree": "npm:8.27.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/dcfd5f2c17f1a33061e3ec70d0946ff23a4238aabacae3d85087165beccedf84fb8506d30848f2470e3b60ab98b230aef79c6e8b4c5d39648a37ac559ac5b1e0 - languageName: node - linkType: hard - -"@typescript-eslint/visitor-keys@npm:8.27.0": - version: 8.27.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.27.0" - dependencies: - "@typescript-eslint/types": "npm:8.27.0" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/d86fd4032db07123816aab3a6b8b53f840387385ab2a4d8f96b22fc76b5438fb27ac8dc42b63caf23f3d265c33e9075dbf1ce8d31f939df12f5cd077d3b10295 - languageName: node - linkType: hard - -"EMS-ESP@workspace:.": - version: 0.0.0-use.local - resolution: "EMS-ESP@workspace:." - dependencies: - "@alova/adapter-xhr": "npm:2.1.1" - "@babel/core": "npm:^7.26.10" - "@emotion/react": "npm:^11.14.0" - "@emotion/styled": "npm:^11.14.0" - "@eslint/js": "npm:^9.23.0" - "@mui/icons-material": "npm:^6.4.8" - "@mui/material": "npm:^6.4.8" - "@preact/compat": "npm:^18.3.1" - "@preact/preset-vite": "npm:^2.10.1" - "@table-library/react-table-library": "npm:4.1.12" - "@trivago/prettier-plugin-sort-imports": "npm:^5.2.2" - "@types/formidable": "npm:^3" - "@types/node": "npm:^22.13.11" - "@types/react": "npm:^19.0.12" - "@types/react-dom": "npm:^19.0.4" - alova: "npm:3.2.10" - async-validator: "npm:^4.2.5" - concurrently: "npm:^9.1.2" - eslint: "npm:^9.23.0" - eslint-config-prettier: "npm:^10.1.1" - formidable: "npm:^3.5.2" - jwt-decode: "npm:^4.0.0" - mime-types: "npm:^2.1.35" - preact: "npm:^10.26.4" - prettier: "npm:^3.5.3" - react: "npm:^19.0.0" - react-dom: "npm:^19.0.0" - react-icons: "npm:^5.5.0" - react-router: "npm:^7.4.0" - react-toastify: "npm:^11.0.5" - rollup-plugin-visualizer: "npm:^5.14.0" - terser: "npm:^5.39.0" - typesafe-i18n: "npm:^5.26.2" - typescript: "npm:^5.8.2" - typescript-eslint: "npm:8.27.0" - vite: "npm:^6.2.2" - vite-plugin-imagemin: "npm:^0.6.1" - vite-tsconfig-paths: "npm:^5.1.4" - languageName: unknown - linkType: soft - -"abbrev@npm:^3.0.0": - version: 3.0.0 - resolution: "abbrev@npm:3.0.0" - checksum: 10c0/049704186396f571650eb7b22ed3627b77a5aedf98bb83caf2eac81ca2a3e25e795394b0464cfb2d6076df3db6a5312139eac5b6a126ca296ac53c5008069c28 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10c0/4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 - languageName: node - linkType: hard - -"acorn@npm:^8.14.0, acorn@npm:^8.8.2": - version: 8.14.1 - resolution: "acorn@npm:8.14.1" - bin: - acorn: bin/acorn - checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 - languageName: node - linkType: hard - -"agent-base@npm:^7.1.0, agent-base@npm:^7.1.2": - version: 7.1.3 - resolution: "agent-base@npm:7.1.3" - checksum: 10c0/6192b580c5b1d8fb399b9c62bf8343d76654c2dd62afcb9a52b2cf44a8b6ace1e3b704d3fe3547d91555c857d3df02603341ff2cb961b9cfe2b12f9f3c38ee11 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10c0/41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 - languageName: node - linkType: hard - -"alova@npm:3.2.10": - version: 3.2.10 - resolution: "alova@npm:3.2.10" - dependencies: - "@alova/shared": "npm:1.1.2" - rate-limiter-flexible: "npm:^5.0.3" - checksum: 10c0/c559252ee8544c4cb286386b3d641bdb1105d69c183d214df99934a5c93185fc6da512198e9258bc6fcdd78af327a1100cb66f2bb1f1b617ee056b0aa57c5286 - languageName: node - linkType: hard - -"ansi-regex@npm:^2.0.0": - version: 2.1.1 - resolution: "ansi-regex@npm:2.1.1" - checksum: 10c0/78cebaf50bce2cb96341a7230adf28d804611da3ce6bf338efa7b72f06cc6ff648e29f80cd95e582617ba58d5fdbec38abfeed3500a98bce8381a9daec7c548b - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10c0/9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10c0/a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc - languageName: node - linkType: hard - -"ansi-styles@npm:^2.2.1": - version: 2.2.1 - resolution: "ansi-styles@npm:2.2.1" - checksum: 10c0/7c68aed4f1857389e7a12f85537ea5b40d832656babbf511cc7ecd9efc52889b9c3e5653a71a6aade783c3c5e0aa223ad4ff8e83c27ac8a666514e6c79068cab - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10c0/895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10c0/5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c - languageName: node - linkType: hard - -"arch@npm:^2.1.0": - version: 2.2.0 - resolution: "arch@npm:2.2.0" - checksum: 10c0/4ceaf8d8207817c216ebc4469742052cb0a097bc45d9b7fcd60b7507220da545a28562ab5bdd4dfe87921bb56371a0805da4e10d704e01f93a15f83240f1284c - languageName: node - linkType: hard - -"archive-type@npm:^4.0.0": - version: 4.0.0 - resolution: "archive-type@npm:4.0.0" - dependencies: - file-type: "npm:^4.2.0" - checksum: 10c0/ea51af0b8e3b374f79ba1921486145e03e2c6cae4e100b686173c1edc93db62d51695296a6252755257c23762cb1503dc82b6c9c320b85c51f71fd36851e10ed - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10c0/c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e - languageName: node - linkType: hard - -"array-find-index@npm:^1.0.1": - version: 1.0.2 - resolution: "array-find-index@npm:1.0.2" - checksum: 10c0/86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 10c0/429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 - languageName: node - linkType: hard - -"asap@npm:^2.0.0": - version: 2.0.6 - resolution: "asap@npm:2.0.6" - checksum: 10c0/c6d5e39fe1f15e4b87677460bd66b66050cd14c772269cee6688824c1410a08ab20254bb6784f9afb75af9144a9f9a7692d49547f4d19d715aeb7c0318f3136d - languageName: node - linkType: hard - -"async-validator@npm:^4.2.5": - version: 4.2.5 - resolution: "async-validator@npm:4.2.5" - checksum: 10c0/0ec09ee388aae5f6b037a320049a369b681ca9b341b28e2693e50e89b5c4c64c057a2c57f9fc1c18dd020823809d8af4b72b278e0a7a872c9e3accd5c4c3ce3a - languageName: node - linkType: hard - -"babel-plugin-macros@npm:^3.1.0": - version: 3.1.0 - resolution: "babel-plugin-macros@npm:3.1.0" - dependencies: - "@babel/runtime": "npm:^7.12.5" - cosmiconfig: "npm:^7.0.0" - resolve: "npm:^1.19.0" - checksum: 10c0/c6dfb15de96f67871d95bd2e8c58b0c81edc08b9b087dc16755e7157f357dc1090a8dc60ebab955e92587a9101f02eba07e730adc253a1e4cf593ca3ebd3839c - languageName: node - linkType: hard - -"babel-plugin-transform-hook-names@npm:^1.0.2": - version: 1.0.2 - resolution: "babel-plugin-transform-hook-names@npm:1.0.2" - peerDependencies: - "@babel/core": ^7.12.10 - checksum: 10c0/517b85fe0611d742b3fffad5d0e119fcbd29bf69f95c6970b9ede4cb66453c7106a2d3bf048b35255b78a9d6a9565ad37e73b46c0be1fe557e941c792fad79f0 - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10c0/9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee - languageName: node - linkType: hard - -"base64-js@npm:^1.3.1": - version: 1.5.1 - resolution: "base64-js@npm:1.5.1" - checksum: 10c0/f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf - languageName: node - linkType: hard - -"bin-build@npm:^3.0.0": - version: 3.0.0 - resolution: "bin-build@npm:3.0.0" - dependencies: - decompress: "npm:^4.0.0" - download: "npm:^6.2.2" - execa: "npm:^0.7.0" - p-map-series: "npm:^1.0.0" - tempfile: "npm:^2.0.0" - checksum: 10c0/61da6d06d1577cf0f0a60873afae91cfcca35d284768c54674539636f59ab4d988a191de7ed668b6cb7688cfc8e7ed954e468e5fb5771194b10c014430a57eb2 - languageName: node - linkType: hard - -"bin-check@npm:^4.1.0": - version: 4.1.0 - resolution: "bin-check@npm:4.1.0" - dependencies: - execa: "npm:^0.7.0" - executable: "npm:^4.1.0" - checksum: 10c0/b1ad144672ab033af879bb493011f694ef11e7c1a250ce15cbdbbc2e5e6feb114046943927654b5ac3d1ce668cff01ec3b6b2703e367f357b1f918b480020d86 - languageName: node - linkType: hard - -"bin-version-check@npm:^4.0.0": - version: 4.0.0 - resolution: "bin-version-check@npm:4.0.0" - dependencies: - bin-version: "npm:^3.0.0" - semver: "npm:^5.6.0" - semver-truncate: "npm:^1.1.2" - checksum: 10c0/f08bd70be3dd96380f43bd5fc842a8101e50e896439a3f59131c71ae5db7f7d6a7cbb83d45e01ea110a8fb4cdecd587afe619fecbe2754eddc56b32afd1ba21f - languageName: node - linkType: hard - -"bin-version@npm:^3.0.0": - version: 3.1.0 - resolution: "bin-version@npm:3.1.0" - dependencies: - execa: "npm:^1.0.0" - find-versions: "npm:^3.0.0" - checksum: 10c0/d337f7e891296ab6b8dc9f92705cd609e04377fb3147f4f99b35482d307ce02432fc91855f38836dd593661bf165e8dfdebb45a4325b72c41a1c30ec81de0a07 - languageName: node - linkType: hard - -"bin-wrapper@npm:^4.0.0, bin-wrapper@npm:^4.0.1": - version: 4.1.0 - resolution: "bin-wrapper@npm:4.1.0" - dependencies: - bin-check: "npm:^4.1.0" - bin-version-check: "npm:^4.0.0" - download: "npm:^7.1.0" - import-lazy: "npm:^3.1.0" - os-filter-obj: "npm:^2.0.0" - pify: "npm:^4.0.1" - checksum: 10c0/5ac8439b1fd366d54322236198644062fed3df973b09e2300ef65001c1fad5628f6e5aece7cd28ea459b3b000dd09173b672a521ef4e27b4a3a620df765de8cc - languageName: node - linkType: hard - -"bl@npm:^1.0.0": - version: 1.2.3 - resolution: "bl@npm:1.2.3" - dependencies: - readable-stream: "npm:^2.3.5" - safe-buffer: "npm:^5.1.1" - checksum: 10c0/ee6478864d3b1295614f269f3fbabeb2362a2f2fc7f8dc2f6c1f944a278d84e0572ecefd6d0b0736d7418763f98dc3b2738253191ea9e98e4b08de211cfac0a6 - languageName: node - linkType: hard - -"boolbase@npm:^1.0.0": - version: 1.0.0 - resolution: "boolbase@npm:1.0.0" - checksum: 10c0/e4b53deb4f2b85c52be0e21a273f2045c7b6a6ea002b0e139c744cb6f95e9ec044439a52883b0d74dedd1ff3da55ed140cfdddfed7fb0cccbed373de5dce1bcf - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10c0/695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10c0/b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f - languageName: node - linkType: hard - -"braces@npm:^3.0.3": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10c0/7c6dfd30c338d2997ba77500539227b9d1f85e388a5f43220865201e407e076783d0881f2d297b9f80951b4c957fcf0b51c1d2d24227631643c3f7c284b0aa04 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.24.4 - resolution: "browserslist@npm:4.24.4" - dependencies: - caniuse-lite: "npm:^1.0.30001688" - electron-to-chromium: "npm:^1.5.73" - node-releases: "npm:^2.0.19" - update-browserslist-db: "npm:^1.1.1" - bin: - browserslist: cli.js - checksum: 10c0/db7ebc1733cf471e0b490b4f47e3e2ea2947ce417192c9246644e92c667dd56a71406cc58f62ca7587caf828364892e9952904a02b7aead752bc65b62a37cfe9 - languageName: node - linkType: hard - -"buffer-alloc-unsafe@npm:^1.1.0": - version: 1.1.0 - resolution: "buffer-alloc-unsafe@npm:1.1.0" - checksum: 10c0/06b9298c9369621a830227c3797ceb3ff5535e323946d7b39a7398fed8b3243798259b3c85e287608c5aad35ccc551cec1a0a5190cc8f39652e8eee25697fc9c - languageName: node - linkType: hard - -"buffer-alloc@npm:^1.2.0": - version: 1.2.0 - resolution: "buffer-alloc@npm:1.2.0" - dependencies: - buffer-alloc-unsafe: "npm:^1.1.0" - buffer-fill: "npm:^1.0.0" - checksum: 10c0/09d87dd53996342ccfbeb2871257d8cdb25ce9ee2259adc95c6490200cd6e528c5fbae8f30bcc323fe8d8efb0fe541e4ac3bbe9ee3f81c6b7c4b27434cc02ab4 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 10c0/cb0a8ddf5cf4f766466db63279e47761eb825693eeba6a5a95ee4ec8cb8f81ede70aa7f9d8aeec083e781d47154290eb5d4d26b3f7a465ec57fb9e7d59c47150 - languageName: node - linkType: hard - -"buffer-fill@npm:^1.0.0": - version: 1.0.0 - resolution: "buffer-fill@npm:1.0.0" - checksum: 10c0/55b5654fbbf2d7ceb4991bb537f5e5b5b5b9debca583fee416a74fcec47c16d9e7a90c15acd27577da7bd750b7fa6396e77e7c221e7af138b6d26242381c6e4d - languageName: node - linkType: hard - -"buffer-from@npm:^1.0.0": - version: 1.1.2 - resolution: "buffer-from@npm:1.1.2" - checksum: 10c0/124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 - languageName: node - linkType: hard - -"buffer@npm:^5.2.1": - version: 5.7.1 - resolution: "buffer@npm:5.7.1" - dependencies: - base64-js: "npm:^1.3.1" - ieee754: "npm:^1.1.13" - checksum: 10c0/27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e - languageName: node - linkType: hard - -"cacache@npm:^19.0.1": - version: 19.0.1 - resolution: "cacache@npm:19.0.1" - dependencies: - "@npmcli/fs": "npm:^4.0.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^7.0.2" - ssri: "npm:^12.0.0" - tar: "npm:^7.4.3" - unique-filename: "npm:^4.0.0" - checksum: 10c0/01f2134e1bd7d3ab68be851df96c8d63b492b1853b67f2eecb2c37bb682d37cb70bb858a16f2f0554d3c0071be6dfe21456a1ff6fa4b7eed996570d6a25ffe9c - languageName: node - linkType: hard - -"cacheable-request@npm:^2.1.1": - version: 2.1.4 - resolution: "cacheable-request@npm:2.1.4" - dependencies: - clone-response: "npm:1.0.2" - get-stream: "npm:3.0.0" - http-cache-semantics: "npm:3.8.1" - keyv: "npm:3.0.0" - lowercase-keys: "npm:1.0.0" - normalize-url: "npm:2.0.1" - responselike: "npm:1.0.2" - checksum: 10c0/41ae13b3cd0ec2c68598b53f2b61b16eee2cb49f9dfa3fb156a0408644ef0d73d49c2f8d86faf32f9866536fe34908810fc695b05e055c4b12459f6be413e6c5 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10c0/fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 - languageName: node - linkType: hard - -"camelcase-keys@npm:^2.0.0": - version: 2.1.0 - resolution: "camelcase-keys@npm:2.1.0" - dependencies: - camelcase: "npm:^2.0.0" - map-obj: "npm:^1.0.0" - checksum: 10c0/d9431f8b5ac52644cfc45377c0d3897f045137d645c8890bd2bfb48c282d22e76644974198dbba3a2d96b33f9bf3af07aacb712b0dd6d2671330a7e2531b72f9 - languageName: node - linkType: hard - -"camelcase@npm:^2.0.0": - version: 2.1.1 - resolution: "camelcase@npm:2.1.1" - checksum: 10c0/610db65fa7dd50a400525ec2188fd65a1939dda4afe5de7d08608670013269c3743c3737fb0f138d1df8aa74e257cc83e3b756e776b604af16dac297b4a0d054 - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001688": - version: 1.0.30001706 - resolution: "caniuse-lite@npm:1.0.30001706" - checksum: 10c0/b502d0a509611fd5b009e1123d482e983696984b6b749c3f485fd8d02cc58376c59cf0bb15f22fa2d337da104970edd27dd525d4663cebc728e26ac4adedff0d - languageName: node - linkType: hard - -"caw@npm:^2.0.0, caw@npm:^2.0.1": - version: 2.0.1 - resolution: "caw@npm:2.0.1" - dependencies: - get-proxy: "npm:^2.0.0" - isurl: "npm:^1.0.0-alpha5" - tunnel-agent: "npm:^0.6.0" - url-to-options: "npm:^1.0.1" - checksum: 10c0/ba9f6560920be553451298e34d417a4e47e914f0feefbd45acf66471d3d989f669379d04b2e76d29dbca7a923b0b94b988aab7e8512b915a74b1affe7160b2e7 - languageName: node - linkType: hard - -"chalk@npm:^1.0.0": - version: 1.1.3 - resolution: "chalk@npm:1.1.3" - dependencies: - ansi-styles: "npm:^2.2.1" - escape-string-regexp: "npm:^1.0.2" - has-ansi: "npm:^2.0.0" - strip-ansi: "npm:^3.0.0" - supports-color: "npm:^2.0.0" - checksum: 10c0/28c3e399ec286bb3a7111fd4225ebedb0d7b813aef38a37bca7c498d032459c265ef43404201d5fbb8d888d29090899c95335b4c0cda13e8b126ff15c541cef8 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - -"chownr@npm:^3.0.0": - version: 3.0.0 - resolution: "chownr@npm:3.0.0" - checksum: 10c0/43925b87700f7e3893296c8e9c56cc58f926411cce3a6e5898136daaf08f08b9a8eb76d37d3267e707d0dcc17aed2e2ebdf5848c0c3ce95cf910a919935c1b10 - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 - languageName: node - linkType: hard - -"clone-response@npm:1.0.2": - version: 1.0.2 - resolution: "clone-response@npm:1.0.2" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 10c0/96f3527ef86d0c322e0a5188d929ab78ddbc3238d47ccbb00f8abb02b02e4ef70339646ec73d657383ffbdb1f0cfef6a937062d4f701ca6f84cee7a37114007f - languageName: node - linkType: hard - -"clsx@npm:1.1.1": - version: 1.1.1 - resolution: "clsx@npm:1.1.1" - checksum: 10c0/5c34e1d5623e3dce0dbf22eedd4f3cc7cd0dee6b1b1ef3ad49d042c9d86372a1dc7788c2ca3213ec08e65ad0e91572ae7cb77183a478c9977bd5327e8f43ffe5 - languageName: node - linkType: hard - -"clsx@npm:^2.1.1": - version: 2.1.1 - resolution: "clsx@npm:2.1.1" - checksum: 10c0/c4c8eb865f8c82baab07e71bfa8897c73454881c4f99d6bc81585aecd7c441746c1399d08363dc096c550cceaf97bd4ce1e8854e1771e9998d9f94c4fe075839 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10c0/37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10c0/a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 - languageName: node - linkType: hard - -"commander@npm:^2.20.0, commander@npm:^2.8.1": - version: 2.20.3 - resolution: "commander@npm:2.20.3" - checksum: 10c0/74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 - languageName: node - linkType: hard - -"commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 10c0/8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10c0/c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f - languageName: node - linkType: hard - -"concurrently@npm:^9.1.2": - version: 9.1.2 - resolution: "concurrently@npm:9.1.2" - dependencies: - chalk: "npm:^4.1.2" - lodash: "npm:^4.17.21" - rxjs: "npm:^7.8.1" - shell-quote: "npm:^1.8.1" - supports-color: "npm:^8.1.1" - tree-kill: "npm:^1.2.2" - yargs: "npm:^17.7.2" - bin: - conc: dist/bin/concurrently.js - concurrently: dist/bin/concurrently.js - checksum: 10c0/88e00269366aa885ca2b97fd53b04e7af2b0f31774d991bfc0e88c0de61cdebdf115ddacc9c897fbd1f1b90369014637fa77045a171d072a75693332b36dcc70 - languageName: node - linkType: hard - -"config-chain@npm:^1.1.11": - version: 1.1.13 - resolution: "config-chain@npm:1.1.13" - dependencies: - ini: "npm:^1.3.4" - proto-list: "npm:~1.2.1" - checksum: 10c0/39d1df18739d7088736cc75695e98d7087aea43646351b028dfabd5508d79cf6ef4c5bcd90471f52cd87ae470d1c5490c0a8c1a292fbe6ee9ff688061ea0963e - languageName: node - linkType: hard - -"console-stream@npm:^0.1.1": - version: 0.1.1 - resolution: "console-stream@npm:0.1.1" - checksum: 10c0/ad09613cb1b24a48de2a10a181830b6485377475242e7ce1e60be4d34f1ee111d375d900cf8f789db59133da15784275413e9e74759fecaaa4a9a1df2d4bec8c - languageName: node - linkType: hard - -"content-disposition@npm:^0.5.2": - version: 0.5.4 - resolution: "content-disposition@npm:0.5.4" - dependencies: - safe-buffer: "npm:5.2.1" - checksum: 10c0/bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb - languageName: node - linkType: hard - -"convert-source-map@npm:^1.5.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: 10c0/281da55454bf8126cbc6625385928c43479f2060984180c42f3a86c8b8c12720a24eac260624a7d1e090004028d2dee78602330578ceec1a08e27cb8bb0a8a5b - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10c0/8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b - languageName: node - linkType: hard - -"cookie@npm:^1.0.1": - version: 1.0.2 - resolution: "cookie@npm:1.0.2" - checksum: 10c0/fd25fe79e8fbcfcaf6aa61cd081c55d144eeeba755206c058682257cb38c4bd6795c6620de3f064c740695bb65b7949ebb1db7a95e4636efb8357a335ad3f54b - languageName: node - linkType: hard - -"core-util-is@npm:~1.0.0": - version: 1.0.3 - resolution: "core-util-is@npm:1.0.3" - checksum: 10c0/90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 - languageName: node - linkType: hard - -"cosmiconfig@npm:^7.0.0": - version: 7.1.0 - resolution: "cosmiconfig@npm:7.1.0" - dependencies: - "@types/parse-json": "npm:^4.0.0" - import-fresh: "npm:^3.2.1" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - yaml: "npm:^1.10.0" - checksum: 10c0/b923ff6af581638128e5f074a5450ba12c0300b71302398ea38dbeabd33bbcaa0245ca9adbedfcf284a07da50f99ede5658c80bb3e39e2ce770a99d28a21ef03 - languageName: node - linkType: hard - -"cross-spawn@npm:^5.0.1": - version: 5.1.0 - resolution: "cross-spawn@npm:5.1.0" - dependencies: - lru-cache: "npm:^4.0.1" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/1918621fddb9f8c61e02118b2dbf81f611ccd1544ceaca0d026525341832b8511ce2504c60f935dbc06b35e5ef156fe8c1e72708c27dd486f034e9c0e1e07201 - languageName: node - linkType: hard - -"cross-spawn@npm:^6.0.0": - version: 6.0.6 - resolution: "cross-spawn@npm:6.0.6" - dependencies: - nice-try: "npm:^1.0.4" - path-key: "npm:^2.0.1" - semver: "npm:^5.5.0" - shebang-command: "npm:^1.2.0" - which: "npm:^1.2.9" - checksum: 10c0/bf61fb890e8635102ea9bce050515cf915ff6a50ccaa0b37a17dc82fded0fb3ed7af5478b9367b86baee19127ad86af4be51d209f64fd6638c0862dca185fe1d - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 - languageName: node - linkType: hard - -"css-select@npm:^4.1.3": - version: 4.3.0 - resolution: "css-select@npm:4.3.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.0.1" - domhandler: "npm:^4.3.1" - domutils: "npm:^2.8.0" - nth-check: "npm:^2.0.1" - checksum: 10c0/a489d8e5628e61063d5a8fe0fa1cc7ae2478cb334a388a354e91cf2908154be97eac9fa7ed4dffe87a3e06cf6fcaa6016553115335c4fd3377e13dac7bd5a8e1 - languageName: node - linkType: hard - -"css-select@npm:^5.1.0": - version: 5.1.0 - resolution: "css-select@npm:5.1.0" - dependencies: - boolbase: "npm:^1.0.0" - css-what: "npm:^6.1.0" - domhandler: "npm:^5.0.2" - domutils: "npm:^3.0.1" - nth-check: "npm:^2.0.1" - checksum: 10c0/551c60dba5b54054741032c1793b5734f6ba45e23ae9e82761a3c0ed1acbb8cfedfa443aaba3a3c1a54cac12b456d2012a09d2cd5f0e82e430454c1b9d84d500 - languageName: node - linkType: hard - -"css-tree@npm:^1.1.2, css-tree@npm:^1.1.3": - version: 1.1.3 - resolution: "css-tree@npm:1.1.3" - dependencies: - mdn-data: "npm:2.0.14" - source-map: "npm:^0.6.1" - checksum: 10c0/499a507bfa39b8b2128f49736882c0dd636b0cd3370f2c69f4558ec86d269113286b7df469afc955de6a68b0dba00bc533e40022a73698081d600072d5d83c1c - languageName: node - linkType: hard - -"css-what@npm:^6.0.1, css-what@npm:^6.1.0": - version: 6.1.0 - resolution: "css-what@npm:6.1.0" - checksum: 10c0/a09f5a6b14ba8dcf57ae9a59474722e80f20406c53a61e9aedb0eedc693b135113ffe2983f4efc4b5065ae639442e9ae88df24941ef159c218b231011d733746 - languageName: node - linkType: hard - -"csso@npm:^4.2.0": - version: 4.2.0 - resolution: "csso@npm:4.2.0" - dependencies: - css-tree: "npm:^1.1.2" - checksum: 10c0/f8c6b1300efaa0f8855a7905ae3794a29c6496e7f16a71dec31eb6ca7cfb1f058a4b03fd39b66c4deac6cb06bf6b4ba86da7b67d7320389cb9994d52b924b903 - languageName: node - linkType: hard - -"csstype@npm:^3.0.2, csstype@npm:^3.1.3": - version: 3.1.3 - resolution: "csstype@npm:3.1.3" - checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 - languageName: node - linkType: hard - -"currently-unhandled@npm:^0.4.1": - version: 0.4.1 - resolution: "currently-unhandled@npm:0.4.1" - dependencies: - array-find-index: "npm:^1.0.1" - checksum: 10c0/32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c - languageName: node - linkType: hard - -"cwebp-bin@npm:^6.0.0": - version: 6.1.2 - resolution: "cwebp-bin@npm:6.1.2" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.1" - bin: - cwebp: cli.js - checksum: 10c0/87a52666159a3723656349e60925d6dfca0cc02542b68e658a5b357614ef39a2e74f55dd4c5e020f136d55481a6a00ed9aae0fdd84b1c50a5795abacc42b18fd - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.4.0 - resolution: "debug@npm:4.4.0" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10c0/db94f1a182bf886f57b4755f85b3a74c39b5114b9377b7ab375dc2cfa3454f09490cc6c30f829df3fc8042bc8b8995f6567ce5cd96f3bc3688bd24027197d9de - languageName: node - linkType: hard - -"decamelize@npm:^1.1.2": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10c0/85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 - languageName: node - linkType: hard - -"decode-uri-component@npm:^0.2.0": - version: 0.2.2 - resolution: "decode-uri-component@npm:0.2.2" - checksum: 10c0/1f4fa54eb740414a816b3f6c24818fbfcabd74ac478391e9f4e2282c994127db02010ce804f3d08e38255493cfe68608b3f5c8e09fd6efc4ae46c807691f7a31 - languageName: node - linkType: hard - -"decompress-response@npm:^3.2.0, decompress-response@npm:^3.3.0": - version: 3.3.0 - resolution: "decompress-response@npm:3.3.0" - dependencies: - mimic-response: "npm:^1.0.0" - checksum: 10c0/5ffaf1d744277fd51c68c94ddc3081cd011b10b7de06637cccc6ecba137d45304a09ba1a776dee1c47fccc60b4a056c4bc74468eeea798ff1f1fca0024b45c9d - languageName: node - linkType: hard - -"decompress-tar@npm:^4.0.0, decompress-tar@npm:^4.1.0, decompress-tar@npm:^4.1.1": - version: 4.1.1 - resolution: "decompress-tar@npm:4.1.1" - dependencies: - file-type: "npm:^5.2.0" - is-stream: "npm:^1.1.0" - tar-stream: "npm:^1.5.2" - checksum: 10c0/92d86c5dfe2a89f9b5db584668f8ed2a3107339083872c7f78b5f7d55222d954545e018c10346a50991542ad6d1406128bf1c97a24f023810993a1dcfb3c3f21 - languageName: node - linkType: hard - -"decompress-tarbz2@npm:^4.0.0": - version: 4.1.1 - resolution: "decompress-tarbz2@npm:4.1.1" - dependencies: - decompress-tar: "npm:^4.1.0" - file-type: "npm:^6.1.0" - is-stream: "npm:^1.1.0" - seek-bzip: "npm:^1.0.5" - unbzip2-stream: "npm:^1.0.9" - checksum: 10c0/d5ab2c2435a53f45da8348ffdb5ae0a3ff8fec55948b7890a1c55413de4d1e539a22978e7dcd8bd3561985878c9778253fe146cbdea429f04fa4529abb57c54e - languageName: node - linkType: hard - -"decompress-targz@npm:^4.0.0": - version: 4.1.1 - resolution: "decompress-targz@npm:4.1.1" - dependencies: - decompress-tar: "npm:^4.1.1" - file-type: "npm:^5.2.0" - is-stream: "npm:^1.1.0" - checksum: 10c0/42514fb2df6248c56b2b115494b7d1d046bc582e960354ba4faad5792f261782a61d17d9ef53845abe78c0f0ecafc195cb0754c00227fa0bd0642a1bfd8eafad - languageName: node - linkType: hard - -"decompress-unzip@npm:^4.0.1": - version: 4.0.1 - resolution: "decompress-unzip@npm:4.0.1" - dependencies: - file-type: "npm:^3.8.0" - get-stream: "npm:^2.2.0" - pify: "npm:^2.3.0" - yauzl: "npm:^2.4.2" - checksum: 10c0/896f88e1c23b59cdce022227a8910c06158bd4b296c21d61af7167bd50d00e9e4355b605bdbfd7ba75d46ad277d4f881cdd037aec7165a40ccd0ee4ef59443a8 - languageName: node - linkType: hard - -"decompress@npm:^4.0.0, decompress@npm:^4.2.0": - version: 4.2.1 - resolution: "decompress@npm:4.2.1" - dependencies: - decompress-tar: "npm:^4.0.0" - decompress-tarbz2: "npm:^4.0.0" - decompress-targz: "npm:^4.0.0" - decompress-unzip: "npm:^4.0.1" - graceful-fs: "npm:^4.1.10" - make-dir: "npm:^1.0.0" - pify: "npm:^2.3.0" - strip-dirs: "npm:^2.0.0" - checksum: 10c0/6730279fa206aad04a8338a88ab49c596034c502b2d5f23a28d0a28290b82d9217f9e60c8b5739805474ca842fc856e08e2d64ed759f2118c2bcabe42fa9eece - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10c0/7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c - languageName: node - linkType: hard - -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 10c0/db6c63864a9d3b7dc9def55d52764968a5af296de87c1b2cc71d8be8142e445208071953649e0386a8cc37cfcf9a2067a47207f1eb9ff250c2a269658fdae422 - languageName: node - linkType: hard - -"dezalgo@npm:^1.0.4": - version: 1.0.4 - resolution: "dezalgo@npm:1.0.4" - dependencies: - asap: "npm:^2.0.0" - wrappy: "npm:1" - checksum: 10c0/8a870ed42eade9a397e6141fe5c025148a59ed52f1f28b1db5de216b4d57f0af7a257070c3af7ce3d5508c1ce9dd5009028a76f4b2cc9370dc56551d2355fad8 - languageName: node - linkType: hard - -"dir-glob@npm:^3.0.1": - version: 3.0.1 - resolution: "dir-glob@npm:3.0.1" - dependencies: - path-type: "npm:^4.0.0" - checksum: 10c0/dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c - languageName: node - linkType: hard - -"dom-helpers@npm:^5.0.1": - version: 5.2.1 - resolution: "dom-helpers@npm:5.2.1" - dependencies: - "@babel/runtime": "npm:^7.8.7" - csstype: "npm:^3.0.2" - checksum: 10c0/f735074d66dd759b36b158fa26e9d00c9388ee0e8c9b16af941c38f014a37fc80782de83afefd621681b19ac0501034b4f1c4a3bff5caa1b8667f0212b5e124c - languageName: node - linkType: hard - -"dom-serializer@npm:^1.0.1": - version: 1.4.1 - resolution: "dom-serializer@npm:1.4.1" - dependencies: - domelementtype: "npm:^2.0.1" - domhandler: "npm:^4.2.0" - entities: "npm:^2.0.0" - checksum: 10c0/67d775fa1ea3de52035c98168ddcd59418356943b5eccb80e3c8b3da53adb8e37edb2cc2f885802b7b1765bf5022aec21dfc32910d7f9e6de4c3148f095ab5e0 - languageName: node - linkType: hard - -"dom-serializer@npm:^2.0.0": - version: 2.0.0 - resolution: "dom-serializer@npm:2.0.0" - dependencies: - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.2" - entities: "npm:^4.2.0" - checksum: 10c0/d5ae2b7110ca3746b3643d3ef60ef823f5f078667baf530cec096433f1627ec4b6fa8c072f09d079d7cda915fd2c7bc1b7b935681e9b09e591e1e15f4040b8e2 - languageName: node - linkType: hard - -"domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0, domelementtype@npm:^2.3.0": - version: 2.3.0 - resolution: "domelementtype@npm:2.3.0" - checksum: 10c0/686f5a9ef0fff078c1412c05db73a0dce096190036f33e400a07e2a4518e9f56b1e324f5c576a0a747ef0e75b5d985c040b0d51945ce780c0dd3c625a18cd8c9 - languageName: node - linkType: hard - -"domhandler@npm:^4.2.0, domhandler@npm:^4.3.1": - version: 4.3.1 - resolution: "domhandler@npm:4.3.1" - dependencies: - domelementtype: "npm:^2.2.0" - checksum: 10c0/5c199c7468cb052a8b5ab80b13528f0db3d794c64fc050ba793b574e158e67c93f8336e87fd81e9d5ee43b0e04aea4d8b93ed7be4899cb726a1601b3ba18538b - languageName: node - linkType: hard - -"domhandler@npm:^5.0.2, domhandler@npm:^5.0.3": - version: 5.0.3 - resolution: "domhandler@npm:5.0.3" - dependencies: - domelementtype: "npm:^2.3.0" - checksum: 10c0/bba1e5932b3e196ad6862286d76adc89a0dbf0c773e5ced1eb01f9af930c50093a084eff14b8de5ea60b895c56a04d5de8bbc4930c5543d029091916770b2d2a - languageName: node - linkType: hard - -"domutils@npm:^2.8.0": - version: 2.8.0 - resolution: "domutils@npm:2.8.0" - dependencies: - dom-serializer: "npm:^1.0.1" - domelementtype: "npm:^2.2.0" - domhandler: "npm:^4.2.0" - checksum: 10c0/d58e2ae01922f0dd55894e61d18119924d88091837887bf1438f2327f32c65eb76426bd9384f81e7d6dcfb048e0f83c19b222ad7101176ad68cdc9c695b563db - languageName: node - linkType: hard - -"domutils@npm:^3.0.1": - version: 3.2.2 - resolution: "domutils@npm:3.2.2" - dependencies: - dom-serializer: "npm:^2.0.0" - domelementtype: "npm:^2.3.0" - domhandler: "npm:^5.0.3" - checksum: 10c0/47938f473b987ea71cd59e59626eb8666d3aa8feba5266e45527f3b636c7883cca7e582d901531961f742c519d7514636b7973353b648762b2e3bedbf235fada - languageName: node - linkType: hard - -"download@npm:^6.2.2": - version: 6.2.5 - resolution: "download@npm:6.2.5" - dependencies: - caw: "npm:^2.0.0" - content-disposition: "npm:^0.5.2" - decompress: "npm:^4.0.0" - ext-name: "npm:^5.0.0" - file-type: "npm:5.2.0" - filenamify: "npm:^2.0.0" - get-stream: "npm:^3.0.0" - got: "npm:^7.0.0" - make-dir: "npm:^1.0.0" - p-event: "npm:^1.0.0" - pify: "npm:^3.0.0" - checksum: 10c0/46a1f17064968590d72908294ef7875a0e1fcecf9a3a0e2c51f86eee32498dcbf92aec2c976b632e397a69bed86e0a1dac4ddf48aa63895ad7d603745db9e1cb - languageName: node - linkType: hard - -"download@npm:^7.1.0": - version: 7.1.0 - resolution: "download@npm:7.1.0" - dependencies: - archive-type: "npm:^4.0.0" - caw: "npm:^2.0.1" - content-disposition: "npm:^0.5.2" - decompress: "npm:^4.2.0" - ext-name: "npm:^5.0.0" - file-type: "npm:^8.1.0" - filenamify: "npm:^2.0.0" - get-stream: "npm:^3.0.0" - got: "npm:^8.3.1" - make-dir: "npm:^1.2.0" - p-event: "npm:^2.1.0" - pify: "npm:^3.0.0" - checksum: 10c0/19f6a36fdc8fced5c56a6f08572c33d7291fc052ff5fa34846f41dcec8c564bc805ab200f712fecab8556311a7f1ed4811514d8243d1c2d657e5da3fc4a49c12 - languageName: node - linkType: hard - -"duplexer3@npm:^0.1.4": - version: 0.1.5 - resolution: "duplexer3@npm:0.1.5" - checksum: 10c0/02195030d61c4d6a2a34eca71639f2ea5e05cb963490e5bd9527623c2ac7f50c33842a34d14777ea9cbfd9bc2be5a84065560b897d9fabb99346058a5b86ca98 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10c0/26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.73": - version: 1.5.123 - resolution: "electron-to-chromium@npm:1.5.123" - checksum: 10c0/ffaa65e9337f5ba0b51d5709795c3d1074e0cae8efda24116561feed6cedd281f523be50339d991c2fc65344e66e65e7308a157ff87047a8bb4e8008412e9eb1 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10c0/b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10c0/af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10c0/36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 - languageName: node - linkType: hard - -"end-of-stream@npm:^1.0.0, end-of-stream@npm:^1.1.0": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: "npm:^1.4.0" - checksum: 10c0/870b423afb2d54bb8d243c63e07c170409d41e20b47eeef0727547aea5740bd6717aca45597a9f2745525667a6b804c1e7bede41f856818faee5806dd9ff3975 - languageName: node - linkType: hard - -"entities@npm:^2.0.0": - version: 2.2.0 - resolution: "entities@npm:2.2.0" - checksum: 10c0/7fba6af1f116300d2ba1c5673fc218af1961b20908638391b4e1e6d5850314ee2ac3ec22d741b3a8060479911c99305164aed19b6254bde75e7e6b1b2c3f3aa3 - languageName: node - linkType: hard - -"entities@npm:^4.2.0": - version: 4.5.0 - resolution: "entities@npm:4.5.0" - checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10c0/285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10c0/b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 - languageName: node - linkType: hard - -"error-ex@npm:^1.2.0, error-ex@npm:^1.3.1": - version: 1.3.2 - resolution: "error-ex@npm:1.3.2" - dependencies: - is-arrayish: "npm:^0.2.1" - checksum: 10c0/ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce - languageName: node - linkType: hard - -"esbuild-android-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-android-64@npm:0.14.54" - conditions: os=android & cpu=x64 - languageName: node - linkType: hard - -"esbuild-android-arm64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-android-arm64@npm:0.14.54" - conditions: os=android & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-darwin-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-darwin-64@npm:0.14.54" - conditions: os=darwin & cpu=x64 - languageName: node - linkType: hard - -"esbuild-darwin-arm64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-darwin-arm64@npm:0.14.54" - conditions: os=darwin & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-freebsd-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-freebsd-64@npm:0.14.54" - conditions: os=freebsd & cpu=x64 - languageName: node - linkType: hard - -"esbuild-freebsd-arm64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-freebsd-arm64@npm:0.14.54" - conditions: os=freebsd & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-linux-32@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-32@npm:0.14.54" - conditions: os=linux & cpu=ia32 - languageName: node - linkType: hard - -"esbuild-linux-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-64@npm:0.14.54" - conditions: os=linux & cpu=x64 - languageName: node - linkType: hard - -"esbuild-linux-arm64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-arm64@npm:0.14.54" - conditions: os=linux & cpu=arm64 - languageName: node - linkType: hard - -"esbuild-linux-arm@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-arm@npm:0.14.54" - conditions: os=linux & cpu=arm - languageName: node - linkType: hard - -"esbuild-linux-mips64le@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-mips64le@npm:0.14.54" - conditions: os=linux & cpu=mips64el - languageName: node - linkType: hard - -"esbuild-linux-ppc64le@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-ppc64le@npm:0.14.54" - conditions: os=linux & cpu=ppc64 - languageName: node - linkType: hard - -"esbuild-linux-riscv64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-riscv64@npm:0.14.54" - conditions: os=linux & cpu=riscv64 - languageName: node - linkType: hard - -"esbuild-linux-s390x@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-linux-s390x@npm:0.14.54" - conditions: os=linux & cpu=s390x - languageName: node - linkType: hard - -"esbuild-netbsd-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-netbsd-64@npm:0.14.54" - conditions: os=netbsd & cpu=x64 - languageName: node - linkType: hard - -"esbuild-openbsd-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-openbsd-64@npm:0.14.54" - conditions: os=openbsd & cpu=x64 - languageName: node - linkType: hard - -"esbuild-sunos-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-sunos-64@npm:0.14.54" - conditions: os=sunos & cpu=x64 - languageName: node - linkType: hard - -"esbuild-windows-32@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-windows-32@npm:0.14.54" - conditions: os=win32 & cpu=ia32 - languageName: node - linkType: hard - -"esbuild-windows-64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-windows-64@npm:0.14.54" - conditions: os=win32 & cpu=x64 - languageName: node - linkType: hard - -"esbuild-windows-arm64@npm:0.14.54": - version: 0.14.54 - resolution: "esbuild-windows-arm64@npm:0.14.54" - conditions: os=win32 & cpu=arm64 - languageName: node - linkType: hard - -"esbuild@npm:^0.14.14": - version: 0.14.54 - resolution: "esbuild@npm:0.14.54" - dependencies: - "@esbuild/linux-loong64": "npm:0.14.54" - esbuild-android-64: "npm:0.14.54" - esbuild-android-arm64: "npm:0.14.54" - esbuild-darwin-64: "npm:0.14.54" - esbuild-darwin-arm64: "npm:0.14.54" - esbuild-freebsd-64: "npm:0.14.54" - esbuild-freebsd-arm64: "npm:0.14.54" - esbuild-linux-32: "npm:0.14.54" - esbuild-linux-64: "npm:0.14.54" - esbuild-linux-arm: "npm:0.14.54" - esbuild-linux-arm64: "npm:0.14.54" - esbuild-linux-mips64le: "npm:0.14.54" - esbuild-linux-ppc64le: "npm:0.14.54" - esbuild-linux-riscv64: "npm:0.14.54" - esbuild-linux-s390x: "npm:0.14.54" - esbuild-netbsd-64: "npm:0.14.54" - esbuild-openbsd-64: "npm:0.14.54" - esbuild-sunos-64: "npm:0.14.54" - esbuild-windows-32: "npm:0.14.54" - esbuild-windows-64: "npm:0.14.54" - esbuild-windows-arm64: "npm:0.14.54" - dependenciesMeta: - "@esbuild/linux-loong64": - optional: true - esbuild-android-64: - optional: true - esbuild-android-arm64: - optional: true - esbuild-darwin-64: - optional: true - esbuild-darwin-arm64: - optional: true - esbuild-freebsd-64: - optional: true - esbuild-freebsd-arm64: - optional: true - esbuild-linux-32: - optional: true - esbuild-linux-64: - optional: true - esbuild-linux-arm: - optional: true - esbuild-linux-arm64: - optional: true - esbuild-linux-mips64le: - optional: true - esbuild-linux-ppc64le: - optional: true - esbuild-linux-riscv64: - optional: true - esbuild-linux-s390x: - optional: true - esbuild-netbsd-64: - optional: true - esbuild-openbsd-64: - optional: true - esbuild-sunos-64: - optional: true - esbuild-windows-32: - optional: true - esbuild-windows-64: - optional: true - esbuild-windows-arm64: - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/1df3cf7c5175ebee284fd027f287385a07ce8a0f0460a4412881aeff707577d91e55302f220ee8397b3b5aa17f4ceeb80eac16f36fc676532ff1b744e5965f2d - languageName: node - linkType: hard - -"esbuild@npm:^0.25.0": - version: 0.25.1 - resolution: "esbuild@npm:0.25.1" - dependencies: - "@esbuild/aix-ppc64": "npm:0.25.1" - "@esbuild/android-arm": "npm:0.25.1" - "@esbuild/android-arm64": "npm:0.25.1" - "@esbuild/android-x64": "npm:0.25.1" - "@esbuild/darwin-arm64": "npm:0.25.1" - "@esbuild/darwin-x64": "npm:0.25.1" - "@esbuild/freebsd-arm64": "npm:0.25.1" - "@esbuild/freebsd-x64": "npm:0.25.1" - "@esbuild/linux-arm": "npm:0.25.1" - "@esbuild/linux-arm64": "npm:0.25.1" - "@esbuild/linux-ia32": "npm:0.25.1" - "@esbuild/linux-loong64": "npm:0.25.1" - "@esbuild/linux-mips64el": "npm:0.25.1" - "@esbuild/linux-ppc64": "npm:0.25.1" - "@esbuild/linux-riscv64": "npm:0.25.1" - "@esbuild/linux-s390x": "npm:0.25.1" - "@esbuild/linux-x64": "npm:0.25.1" - "@esbuild/netbsd-arm64": "npm:0.25.1" - "@esbuild/netbsd-x64": "npm:0.25.1" - "@esbuild/openbsd-arm64": "npm:0.25.1" - "@esbuild/openbsd-x64": "npm:0.25.1" - "@esbuild/sunos-x64": "npm:0.25.1" - "@esbuild/win32-arm64": "npm:0.25.1" - "@esbuild/win32-ia32": "npm:0.25.1" - "@esbuild/win32-x64": "npm:0.25.1" - dependenciesMeta: - "@esbuild/aix-ppc64": - optional: true - "@esbuild/android-arm": - optional: true - "@esbuild/android-arm64": - optional: true - "@esbuild/android-x64": - optional: true - "@esbuild/darwin-arm64": - optional: true - "@esbuild/darwin-x64": - optional: true - "@esbuild/freebsd-arm64": - optional: true - "@esbuild/freebsd-x64": - optional: true - "@esbuild/linux-arm": - optional: true - "@esbuild/linux-arm64": - optional: true - "@esbuild/linux-ia32": - optional: true - "@esbuild/linux-loong64": - optional: true - "@esbuild/linux-mips64el": - optional: true - "@esbuild/linux-ppc64": - optional: true - "@esbuild/linux-riscv64": - optional: true - "@esbuild/linux-s390x": - optional: true - "@esbuild/linux-x64": - optional: true - "@esbuild/netbsd-arm64": - optional: true - "@esbuild/netbsd-x64": - optional: true - "@esbuild/openbsd-arm64": - optional: true - "@esbuild/openbsd-x64": - optional: true - "@esbuild/sunos-x64": - optional: true - "@esbuild/win32-arm64": - optional: true - "@esbuild/win32-ia32": - optional: true - "@esbuild/win32-x64": - optional: true - bin: - esbuild: bin/esbuild - checksum: 10c0/80fca30dd0f21aec23fdfab34f0a8d5f55df5097dd7f475f2ab561d45662c32ee306f5649071cd1a0ba0614b164c48ca3dc3ee1551a4daf204b8af90e4d893f5 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10c0/ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.2, escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10c0/a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10c0/9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 - languageName: node - linkType: hard - -"eslint-config-prettier@npm:^10.1.1": - version: 10.1.1 - resolution: "eslint-config-prettier@npm:10.1.1" - peerDependencies: - eslint: ">=7.0.0" - bin: - eslint-config-prettier: bin/cli.js - checksum: 10c0/3dbfdf6495dd62e2e1644ea9e8e978100dabcd8740fd264df1222d130001a1e8de05d6ed6c67d3a60727386a07507f067d1ca79af6d546910414beab19e7966e - languageName: node - linkType: hard - -"eslint-scope@npm:^8.3.0": - version: 8.3.0 - resolution: "eslint-scope@npm:8.3.0" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^4.2.0": - version: 4.2.0 - resolution: "eslint-visitor-keys@npm:4.2.0" - checksum: 10c0/2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 - languageName: node - linkType: hard - -"eslint@npm:^9.23.0": - version: 9.23.0 - resolution: "eslint@npm:9.23.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.12.1" - "@eslint/config-array": "npm:^0.19.2" - "@eslint/config-helpers": "npm:^0.2.0" - "@eslint/core": "npm:^0.12.0" - "@eslint/eslintrc": "npm:^3.3.1" - "@eslint/js": "npm:9.23.0" - "@eslint/plugin-kit": "npm:^0.2.7" - "@humanfs/node": "npm:^0.16.6" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.4.2" - "@types/estree": "npm:^1.0.6" - "@types/json-schema": "npm:^7.0.15" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.6" - debug: "npm:^4.3.2" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.3.0" - eslint-visitor-keys: "npm:^4.2.0" - espree: "npm:^10.3.0" - esquery: "npm:^1.5.0" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^8.0.0" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - peerDependencies: - jiti: "*" - peerDependenciesMeta: - jiti: - optional: true - bin: - eslint: bin/eslint.js - checksum: 10c0/9616c308dfa8d09db8ae51019c87d5d05933742214531b077bd6ab618baab3bec7938256c14dcad4dc47f5ba93feb0bc5e089f68799f076374ddea21b6a9be45 - languageName: node - linkType: hard - -"espree@npm:^10.0.1, espree@npm:^10.3.0": - version: 10.3.0 - resolution: "espree@npm:10.3.0" - dependencies: - acorn: "npm:^8.14.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 - languageName: node - linkType: hard - -"esquery@npm:^1.5.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10c0/cb9065ec605f9da7a76ca6dadb0619dfb611e37a81e318732977d90fab50a256b95fee2d925fba7c2f3f0523aa16f91587246693bc09bc34d5a59575fe6e93d2 - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10c0/81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10c0/1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 - languageName: node - linkType: hard - -"estree-walker@npm:^2.0.1": - version: 2.0.2 - resolution: "estree-walker@npm:2.0.2" - checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10c0/9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 - languageName: node - linkType: hard - -"exec-buffer@npm:^3.0.0": - version: 3.2.0 - resolution: "exec-buffer@npm:3.2.0" - dependencies: - execa: "npm:^0.7.0" - p-finally: "npm:^1.0.0" - pify: "npm:^3.0.0" - rimraf: "npm:^2.5.4" - tempfile: "npm:^2.0.0" - checksum: 10c0/fbb969e6c8f84d4c65a11f407408fb8e27a566be6c5ac2fe4c0a581c9af2bffb478af48808d5d0d533b3bb2dff201acbbc5d7d5e2a1cf53ec986ebea40f9380e - languageName: node - linkType: hard - -"execa@npm:^0.7.0": - version: 0.7.0 - resolution: "execa@npm:0.7.0" - dependencies: - cross-spawn: "npm:^5.0.1" - get-stream: "npm:^3.0.0" - is-stream: "npm:^1.1.0" - npm-run-path: "npm:^2.0.0" - p-finally: "npm:^1.0.0" - signal-exit: "npm:^3.0.0" - strip-eof: "npm:^1.0.0" - checksum: 10c0/812f1776e2a6b2226532e43c1af87d8a12e26de03a06e7e043f653acf5565e0656f5f6c64d66726fefa17178ac129caaa419a50905934e7c4a846417abb25d4a - languageName: node - linkType: hard - -"execa@npm:^1.0.0": - version: 1.0.0 - resolution: "execa@npm:1.0.0" - dependencies: - cross-spawn: "npm:^6.0.0" - get-stream: "npm:^4.0.0" - is-stream: "npm:^1.1.0" - npm-run-path: "npm:^2.0.0" - p-finally: "npm:^1.0.0" - signal-exit: "npm:^3.0.0" - strip-eof: "npm:^1.0.0" - checksum: 10c0/cc71707c9aa4a2552346893ee63198bf70a04b5a1bc4f8a0ef40f1d03c319eae80932c59191f037990d7d102193e83a38ec72115fff814ec2fb3099f3661a590 - languageName: node - linkType: hard - -"execa@npm:^4.0.0": - version: 4.1.0 - resolution: "execa@npm:4.1.0" - dependencies: - cross-spawn: "npm:^7.0.0" - get-stream: "npm:^5.0.0" - human-signals: "npm:^1.1.1" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.0" - onetime: "npm:^5.1.0" - signal-exit: "npm:^3.0.2" - strip-final-newline: "npm:^2.0.0" - checksum: 10c0/02211601bb1c52710260edcc68fb84c3c030dc68bafc697c90ada3c52cc31375337de8c24826015b8382a58d63569ffd203b79c94fef217d65503e3e8d2c52ba - languageName: node - linkType: hard - -"execa@npm:^5.0.0": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 10c0/c8e615235e8de4c5addf2fa4c3da3e3aa59ce975a3e83533b4f6a71750fb816a2e79610dc5f1799b6e28976c9ae86747a36a606655bf8cb414a74d8d507b304f - languageName: node - linkType: hard - -"executable@npm:^4.1.0": - version: 4.1.1 - resolution: "executable@npm:4.1.1" - dependencies: - pify: "npm:^2.2.0" - checksum: 10c0/c3cc5d2d2e3cdb1b7d7b0639ebd5566d113d7ada21cfa07f5226d55ba2a210320116720e07570ed5659ef2ec516bc00c8f0488dac75d112fd324ef25c2100173 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.2 - resolution: "exponential-backoff@npm:3.1.2" - checksum: 10c0/d9d3e1eafa21b78464297df91f1776f7fbaa3d5e3f7f0995648ca5b89c069d17055033817348d9f4a43d1c20b0eab84f75af6991751e839df53e4dfd6f22e844 - languageName: node - linkType: hard - -"ext-list@npm:^2.0.0": - version: 2.2.2 - resolution: "ext-list@npm:2.2.2" - dependencies: - mime-db: "npm:^1.28.0" - checksum: 10c0/bfdb435f333dccbf3f9698dc9d8e38eb47b42d756800bfafa9ec0c1c8aace877c40095baf36f691bcfd09bb88ed247c6e51596e75a158280fa19cf8588a7e258 - languageName: node - linkType: hard - -"ext-name@npm:^5.0.0": - version: 5.0.0 - resolution: "ext-name@npm:5.0.0" - dependencies: - ext-list: "npm:^2.0.0" - sort-keys-length: "npm:^1.0.0" - checksum: 10c0/6750b34636bb6dca78e1bcc797615af68ecf50d62cf774624a32ee7879da99c949b5c41e8aa56ede4eb15c6abad6b1a8858d0934faab75ff6e2fd6f408debe18 - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10c0/40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 - languageName: node - linkType: hard - -"fast-glob@npm:^3.0.3, fast-glob@npm:^3.3.2": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.8" - checksum: 10c0/f6aaa141d0d3384cf73cbcdfc52f475ed293f6d5b65bfc5def368b09163a9f7e5ec2b3014d80f733c405f58e470ee0cc451c2937685045cddcdeaa24199c43fe - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10c0/7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10c0/111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 - languageName: node - linkType: hard - -"fast-xml-parser@npm:^4.1.3": - version: 4.5.3 - resolution: "fast-xml-parser@npm:4.5.3" - dependencies: - strnum: "npm:^1.1.1" - bin: - fxparser: src/cli/cli.js - checksum: 10c0/bf9ccadacfadc95f6e3f0e7882a380a7f219cf0a6f96575149f02cb62bf44c3b7f0daee75b8ff3847bcfd7fbcb201e402c71045936c265cf6d94b141ec4e9327 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.19.1 - resolution: "fastq@npm:1.19.1" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10c0/ebc6e50ac7048daaeb8e64522a1ea7a26e92b3cee5cd1c7f2316cdca81ba543aa40a136b53891446ea5c3a67ec215fbaca87ad405f102dd97012f62916905630 - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" - dependencies: - pend: "npm:~1.2.0" - checksum: 10c0/304dd70270298e3ffe3bcc05e6f7ade2511acc278bc52d025f8918b48b6aa3b77f10361bddfadfe2a28163f7af7adbdce96f4d22c31b2f648ba2901f0c5fc20e - languageName: node - linkType: hard - -"figures@npm:^1.3.5": - version: 1.7.0 - resolution: "figures@npm:1.7.0" - dependencies: - escape-string-regexp: "npm:^1.0.5" - object-assign: "npm:^4.1.0" - checksum: 10c0/a10942b0eec3372bf61822ab130d2bbecdf527d551b0b013fbe7175b7a0238ead644ee8930a1a3cb872fb9ab2ec27df30e303765a3b70b97852e2e9ee43bdff3 - languageName: node - linkType: hard - -"file-entry-cache@npm:^8.0.0": - version: 8.0.0 - resolution: "file-entry-cache@npm:8.0.0" - dependencies: - flat-cache: "npm:^4.0.0" - checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 - languageName: node - linkType: hard - -"file-type@npm:5.2.0, file-type@npm:^5.2.0": - version: 5.2.0 - resolution: "file-type@npm:5.2.0" - checksum: 10c0/c16c2f4e484a838c12b63e08637277905f08aebb1afbc291086029210aea17ded5ed701c9a4588313446ae0c1da71566b58df9a9c758a1ec300c4f80b9713cbf - languageName: node - linkType: hard - -"file-type@npm:^10.4.0, file-type@npm:^10.5.0": - version: 10.11.0 - resolution: "file-type@npm:10.11.0" - checksum: 10c0/2d6280d84f2499878ebdf8236a6e83b3c747f08b91d84cf99785afe3c9ac52775e52dcec15a4141cc24eb3006f274eb46dc7d13395920a1763d936c6d6e8afde - languageName: node - linkType: hard - -"file-type@npm:^12.0.0": - version: 12.4.2 - resolution: "file-type@npm:12.4.2" - checksum: 10c0/26a307262a2a0b41ea83136550fbe83d8b502d080778b6577e0336fbfe9e919e1f871a286a6eb59f668425f60ebb19402fcb6c0443af58446d33c63362554e1d - languageName: node - linkType: hard - -"file-type@npm:^3.8.0": - version: 3.9.0 - resolution: "file-type@npm:3.9.0" - checksum: 10c0/7ae074b350c2300807a99d428600a8ee6b2ace901400898706a20ddc2c43c9abb7e05177ff55ed67a2fd26dfa9b91857b21ec9c0ab3202b9cabebc7e65900240 - languageName: node - linkType: hard - -"file-type@npm:^4.2.0": - version: 4.4.0 - resolution: "file-type@npm:4.4.0" - checksum: 10c0/9579e6efb6ed262d82e6e282ea301bee781e66491eadf5a2b5ebf2502394ddaa00be37549d8067dd7d4e7c2b145921f37f8262b0544734804d38ceedcb36229f - languageName: node - linkType: hard - -"file-type@npm:^6.1.0": - version: 6.2.0 - resolution: "file-type@npm:6.2.0" - checksum: 10c0/3d7fe85a10bd97ca0c35fd9a20d21f5b20849bbb70985d37c34475051433f3c6109c76a3e5893bff6773037b769be9730a2db762789ecf25def9b62a4c2ee953 - languageName: node - linkType: hard - -"file-type@npm:^8.1.0": - version: 8.1.0 - resolution: "file-type@npm:8.1.0" - checksum: 10c0/e46080a093bc1ac345c3d3e9e2bcb5ab8ef2d9866916e17d623bca823cc2d1288469e54e18758b2aebf4d0c27972d336305791415f961676d6fa0696a5889153 - languageName: node - linkType: hard - -"filename-reserved-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "filename-reserved-regex@npm:2.0.0" - checksum: 10c0/453740b7f9fd126e508da555b37e38c1f7ff19f5e9f3d297b2de1beb09854957baddd74c83235e87b16e9ce27a2368798896669edad5a81b5b7bd8cb57c942fc - languageName: node - linkType: hard - -"filenamify@npm:^2.0.0": - version: 2.1.0 - resolution: "filenamify@npm:2.1.0" - dependencies: - filename-reserved-regex: "npm:^2.0.0" - strip-outer: "npm:^1.0.0" - trim-repeated: "npm:^1.0.0" - checksum: 10c0/47f107f94f69f89b7490bbead2a03ab2aa6ea7d07733afc169b24ad4bac7193c0bef40c3e23c9505bc5eaf93bea2cfbce460fb6073e580d7675fa0cbdce225fd - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10c0/b75b691bbe065472f38824f694c2f7449d7f5004aa950426a2c28f0306c60db9b880c0b0e4ed819997ffb882d1da02cfcfc819bddc94d71627f5269682edf018 - languageName: node - linkType: hard - -"find-root@npm:^1.1.0": - version: 1.1.0 - resolution: "find-root@npm:1.1.0" - checksum: 10c0/1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa - languageName: node - linkType: hard - -"find-up@npm:^1.0.0": - version: 1.1.2 - resolution: "find-up@npm:1.1.2" - dependencies: - path-exists: "npm:^2.0.0" - pinkie-promise: "npm:^2.0.0" - checksum: 10c0/51e35c62d9b7efe82d7d5cce966bfe10c2eaa78c769333f8114627e3a8a4a4f50747f5f50bff50b1094cbc6527776f0d3b9ff74d3561ef714a5290a17c80c2bc - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10c0/062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a - languageName: node - linkType: hard - -"find-versions@npm:^3.0.0": - version: 3.2.0 - resolution: "find-versions@npm:3.2.0" - dependencies: - semver-regex: "npm:^2.0.0" - checksum: 10c0/9aac46e727fdb737270fb1152dea9c673c2fc2747aba8c978beeccc57f22fc052362451f7b014a7d9460c59e36c4c2a9ec93fc61642d29fbed98ca9cb2dcec99 - languageName: node - linkType: hard - -"flat-cache@npm:^4.0.0": - version: 4.0.1 - resolution: "flat-cache@npm:4.0.1" - dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.4" - checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.3.3 - resolution: "flatted@npm:3.3.3" - checksum: 10c0/e957a1c6b0254aa15b8cce8533e24165abd98fadc98575db082b786b5da1b7d72062b81bfdcd1da2f4d46b6ed93bec2434e62333e9b4261d79ef2e75a10dd538 - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0": - version: 3.3.1 - resolution: "foreground-child@npm:3.3.1" - dependencies: - cross-spawn: "npm:^7.0.6" - signal-exit: "npm:^4.0.1" - checksum: 10c0/8986e4af2430896e65bc2788d6679067294d6aee9545daefc84923a0a4b399ad9c7a3ea7bd8c0b2b80fdf4a92de4c69df3f628233ff3224260e9c1541a9e9ed3 - languageName: node - linkType: hard - -"formidable@npm:^3.5.2": - version: 3.5.2 - resolution: "formidable@npm:3.5.2" - dependencies: - dezalgo: "npm:^1.0.4" - hexoid: "npm:^2.0.0" - once: "npm:^1.4.0" - checksum: 10c0/c26d89ba84d392f0e68ba1aca9f779e0f2e94db053d95df562c730782956f302e3f069c07ab96f991415af915ac7b8771f4c813d298df43577fdf439e1e8741e - languageName: node - linkType: hard - -"from2@npm:^2.1.1": - version: 2.3.0 - resolution: "from2@npm:2.3.0" - dependencies: - inherits: "npm:^2.0.1" - readable-stream: "npm:^2.0.0" - checksum: 10c0/f87f7a2e4513244d551454a7f8324ef1f7837864a8701c536417286ec19ff4915606b1dfa8909a21b7591ebd8440ffde3642f7c303690b9a4d7c832d62248aa1 - languageName: node - linkType: hard - -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 10c0/a0cde99085f0872f4d244e83e03a46aa387b74f5a5af750896c6b05e9077fac00e9932fdf5aef84f2f16634cd473c63037d7a512576da7d5c2b9163d1909f3a8 - languageName: node - linkType: hard - -"fs-extra@npm:^10.0.0": - version: 10.1.0 - resolution: "fs-extra@npm:10.1.0" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10c0/5f579466e7109719d162a9249abbeffe7f426eb133ea486e020b89bc6d67a741134076bf439983f2eb79276ceaf6bd7b7c1e43c3fd67fe889863e69072fb0a5e - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10c0/444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10c0/a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10c0/d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10c0/782aba6cba65b1bb5af3b095d96249d20edbe8df32dbf4696fd49be2583faf676173bf4809386588828e4dd76a3354fcbeb577bab1c833ccd9fc4577f26103f8 - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10c0/c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde - languageName: node - linkType: hard - -"get-proxy@npm:^2.0.0": - version: 2.1.0 - resolution: "get-proxy@npm:2.1.0" - dependencies: - npm-conf: "npm:^1.1.0" - checksum: 10c0/48a677061f90fea7a4fede28edb854d2433901b80beb1d240a42889092a7c38f23081de936e12048c55ed35e1f64d701ee8c07817469b3a916f03d9a2d78b8c0 - languageName: node - linkType: hard - -"get-stdin@npm:^4.0.1": - version: 4.0.1 - resolution: "get-stdin@npm:4.0.1" - checksum: 10c0/68fc39a0af6050bcad791fb3df72999e7636401f11f574bf24af07b1c640d30c01cf38aa39ee55665a93ee7a7753eeb6d1fce6c434dd1f458ee0f8fd02775809 - languageName: node - linkType: hard - -"get-stream@npm:3.0.0, get-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "get-stream@npm:3.0.0" - checksum: 10c0/003f5f3b8870da59c6aafdf6ed7e7b07b48c2f8629cd461bd3900726548b6b8cfa2e14d6b7814fbb08f07a42f4f738407fa70b989928b2783a76b278505bba22 - languageName: node - linkType: hard - -"get-stream@npm:^2.2.0": - version: 2.3.1 - resolution: "get-stream@npm:2.3.1" - dependencies: - object-assign: "npm:^4.0.1" - pinkie-promise: "npm:^2.0.0" - checksum: 10c0/46c12f496e7edec688a1cc570fe7556ce91e91201fa7efb146853fb9f0a8f0b0bb9a02cf9d9e4e9d4e2097f98c83b09621d9034c25ca0cf80ae6f4dace9c3465 - languageName: node - linkType: hard - -"get-stream@npm:^4.0.0": - version: 4.1.0 - resolution: "get-stream@npm:4.1.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 10c0/294d876f667694a5ca23f0ca2156de67da950433b6fb53024833733975d32582896dbc7f257842d331809979efccf04d5e0b6b75ad4d45744c45f193fd497539 - languageName: node - linkType: hard - -"get-stream@npm:^5.0.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: "npm:^3.0.0" - checksum: 10c0/43797ffd815fbb26685bf188c8cfebecb8af87b3925091dd7b9a9c915993293d78e3c9e1bce125928ff92f2d0796f3889b92b5ec6d58d1041b574682132e0a80 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 10c0/49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 - languageName: node - linkType: hard - -"gifsicle@npm:5.2.0": - version: 5.2.0 - resolution: "gifsicle@npm:5.2.0" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.0" - execa: "npm:^5.0.0" - logalot: "npm:^2.0.0" - bin: - gifsicle: cli.js - checksum: 10c0/99b9c12133f0d4d7c615f86e8adaa2ad22f71bdfa8d863de37c0f06b637307072c6a23938acca8555d3db3ee9998a0702583e9eab831fdc5763515a8bb6049f1 - languageName: node - linkType: hard - -"gifsicle@npm:^5.0.0": - version: 5.3.0 - resolution: "gifsicle@npm:5.3.0" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.0" - execa: "npm:^5.0.0" - bin: - gifsicle: cli.js - checksum: 10c0/ab065d041d9670545691108f130d91b676db92345c16ff035203b53d1380d0e75aa24f2b879b4814f9591b25bf36a2b1fe46671157a8212da76958129f041e43 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10c0/cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10c0/317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10c0/19a9759ea77b8e3ca0a43c2f07ecddc2ad46216b786bb8f993c445aee80d345925a21e5280c7b7c6c59e860a0154b84e4b2b60321fea92cd3c56b4a7489f160e - languageName: node - linkType: hard - -"glob@npm:^7.1.3": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10c0/65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10c0/758f9f258e7b19226bd8d4af5d3b0dcf7038780fb23d82e6f98932c44e239f884847f1766e8fa9cc5635ccb3204f7fa7314d4408dd4002a5e8ea827b4018f0a1 - languageName: node - linkType: hard - -"globals@npm:^14.0.0": - version: 14.0.0 - resolution: "globals@npm:14.0.0" - checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d - languageName: node - linkType: hard - -"globby@npm:^10.0.0": - version: 10.0.2 - resolution: "globby@npm:10.0.2" - dependencies: - "@types/glob": "npm:^7.1.1" - array-union: "npm:^2.1.0" - dir-glob: "npm:^3.0.1" - fast-glob: "npm:^3.0.3" - glob: "npm:^7.1.3" - ignore: "npm:^5.1.1" - merge2: "npm:^1.2.3" - slash: "npm:^3.0.0" - checksum: 10c0/9c610ad47117b9dfbc5b0c6c2408c3b72f89c1b9f91ee14c4dc794794e35768ee0920e2a403b688cfa749f48617c6ba3f3a52df07677ed73d602d4349b68c810 - languageName: node - linkType: hard - -"globrex@npm:^0.1.2": - version: 0.1.2 - resolution: "globrex@npm:0.1.2" - checksum: 10c0/a54c029520cf58bda1d8884f72bd49b4cd74e977883268d931fd83bcbd1a9eb96d57c7dbd4ad80148fb9247467ebfb9b215630b2ed7563b2a8de02e1ff7f89d1 - languageName: node - linkType: hard - -"got@npm:^7.0.0": - version: 7.1.0 - resolution: "got@npm:7.1.0" - dependencies: - decompress-response: "npm:^3.2.0" - duplexer3: "npm:^0.1.4" - get-stream: "npm:^3.0.0" - is-plain-obj: "npm:^1.1.0" - is-retry-allowed: "npm:^1.0.0" - is-stream: "npm:^1.0.0" - isurl: "npm:^1.0.0-alpha5" - lowercase-keys: "npm:^1.0.0" - p-cancelable: "npm:^0.3.0" - p-timeout: "npm:^1.1.1" - safe-buffer: "npm:^5.0.1" - timed-out: "npm:^4.0.0" - url-parse-lax: "npm:^1.0.0" - url-to-options: "npm:^1.0.1" - checksum: 10c0/e5faeeb3763cc0c249581407d5e99beb289cef0253ebe17c1e7c68fc10fe213b1fa10a3a9ca7b0a91bf3e1ee756daf451499bb583481f12131a4afb6a29394fd - languageName: node - linkType: hard - -"got@npm:^8.3.1": - version: 8.3.2 - resolution: "got@npm:8.3.2" - dependencies: - "@sindresorhus/is": "npm:^0.7.0" - cacheable-request: "npm:^2.1.1" - decompress-response: "npm:^3.3.0" - duplexer3: "npm:^0.1.4" - get-stream: "npm:^3.0.0" - into-stream: "npm:^3.1.0" - is-retry-allowed: "npm:^1.1.0" - isurl: "npm:^1.0.0-alpha5" - lowercase-keys: "npm:^1.0.0" - mimic-response: "npm:^1.0.0" - p-cancelable: "npm:^0.4.0" - p-timeout: "npm:^2.0.1" - pify: "npm:^3.0.0" - safe-buffer: "npm:^5.1.1" - timed-out: "npm:^4.0.1" - url-parse-lax: "npm:^3.0.0" - url-to-options: "npm:^1.0.1" - checksum: 10c0/1a3c772fc2f7d6800113b093b391f6864aa1ae5bdf7c6ad6fafc8a42a895e217dbea9b936438c185e2fff612d7ac40c4867d20ad7ba8652caca316994bcf5404 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.10, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.2, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10c0/e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 - languageName: node - linkType: hard - -"has-ansi@npm:^2.0.0": - version: 2.0.0 - resolution: "has-ansi@npm:2.0.0" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f54e4887b9f8f3c4bfefd649c48825b3c093987c92c27880ee9898539e6f01aed261e82e73153c3f920fde0db5bf6ebd58deb498ed1debabcb4bc40113ccdf05 - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10c0/2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 - languageName: node - linkType: hard - -"has-symbol-support-x@npm:^1.4.1": - version: 1.4.2 - resolution: "has-symbol-support-x@npm:1.4.2" - checksum: 10c0/993f0e1a7a2c8f41f356b20c33cda49bc2f5c4442f858b0fa58b4852f4ba50e7d7400a2734822c415975114e6f768bba9bb6063dd687026baaeeed6453d94a03 - languageName: node - linkType: hard - -"has-to-string-tag-x@npm:^1.2.0": - version: 1.4.1 - resolution: "has-to-string-tag-x@npm:1.4.1" - dependencies: - has-symbol-support-x: "npm:^1.4.1" - checksum: 10c0/e7197e830fe55afe596fc3fe4ab23fa455f69a1ba850b493e527c728d1e6d2ecc7197ab38b8bdc7ae8a7669e23c19a8b9f52f853a509639c70e0efbdc5d175e5 - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10c0/3769d434703b8ac66b209a4cca0737519925bbdb61dd887f93a16372b14694c63ff4e797686d87c90f08168e81082248b9b028bad60d4da9e0d1148766f56eb9 - languageName: node - linkType: hard - -"he@npm:1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10c0/a27d478befe3c8192f006cdd0639a66798979dfa6e2125c6ac582a19a5ebfec62ad83e8382e6036170d873f46e4536a7e795bf8b95bf7c247f4cc0825ccc8c17 - languageName: node - linkType: hard - -"hexoid@npm:^2.0.0": - version: 2.0.0 - resolution: "hexoid@npm:2.0.0" - checksum: 10c0/a9d5e6f4adeaefcb4a53803dd48bf0a242d92e8ec699555aea616c4bf8f91788f03093595085976f63d6830815dd080c063503540fabc7e854ebfb11161687c6 - languageName: node - linkType: hard - -"hoist-non-react-statics@npm:^3.3.1": - version: 3.3.2 - resolution: "hoist-non-react-statics@npm:3.3.2" - dependencies: - react-is: "npm:^16.7.0" - checksum: 10c0/fe0889169e845d738b59b64badf5e55fa3cf20454f9203d1eb088df322d49d4318df774828e789898dcb280e8a5521bb59b3203385662ca5e9218a6ca5820e74 - languageName: node - linkType: hard - -"hosted-git-info@npm:^2.1.4": - version: 2.8.9 - resolution: "hosted-git-info@npm:2.8.9" - checksum: 10c0/317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 - languageName: node - linkType: hard - -"http-cache-semantics@npm:3.8.1": - version: 3.8.1 - resolution: "http-cache-semantics@npm:3.8.1" - checksum: 10c0/8925daec009618d5a48c8a36fcb312785fe78c7b22db8008ed58ca84d08fdc41596b63e0507b577ad0bf46e868a74944ab03a037fdb3f31d5d49d3c79df8d9e4 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10c0/ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10c0/4207b06a4580fb85dd6dff521f0abf6db517489e70863dca1a0291daa7f2d3d2d6015a57bd702af068ea5cf9f1f6ff72314f5f5b4228d299c0904135d2aef921 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.6 - resolution: "https-proxy-agent@npm:7.0.6" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:4" - checksum: 10c0/f729219bc735edb621fa30e6e84e60ee5d00802b8247aac0d7b79b0bd6d4b3294737a337b93b86a0bd9e68099d031858a39260c976dc14cdbba238ba1f8779ac - languageName: node - linkType: hard - -"human-signals@npm:^1.1.1": - version: 1.1.1 - resolution: "human-signals@npm:1.1.1" - checksum: 10c0/18810ed239a7a5e23fb6c32d0fd4be75d7cd337a07ad59b8dbf0794cb0761e6e628349ee04c409e605fe55344716eab5d0a47a62ba2a2d0d367c89a2b4247b1e - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 10c0/695edb3edfcfe9c8b52a76926cd31b36978782062c0ed9b1192b36bebc75c4c87c82e178dfcb0ed0fc27ca59d434198aac0bd0be18f5781ded775604db22304a - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10c0/98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 - languageName: node - linkType: hard - -"ieee754@npm:^1.1.13": - version: 1.2.1 - resolution: "ieee754@npm:1.2.1" - checksum: 10c0/b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb - languageName: node - linkType: hard - -"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.3.1": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10c0/f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 - languageName: node - linkType: hard - -"imagemin-gifsicle@npm:^7.0.0": - version: 7.0.0 - resolution: "imagemin-gifsicle@npm:7.0.0" - dependencies: - execa: "npm:^1.0.0" - gifsicle: "npm:^5.0.0" - is-gif: "npm:^3.0.0" - checksum: 10c0/67ed459bb22615b2cada4920a537c1f3e526d33aba687c14804486e1a7a241df55ff56b0bdaf2b531dbc15c881a148b4d5ad2397172faa8d4bd3278715983009 - languageName: node - linkType: hard - -"imagemin-jpegtran@npm:^7.0.0": - version: 7.0.0 - resolution: "imagemin-jpegtran@npm:7.0.0" - dependencies: - exec-buffer: "npm:^3.0.0" - is-jpg: "npm:^2.0.0" - jpegtran-bin: "npm:^5.0.0" - checksum: 10c0/1bd8d367a4cc4720aa79b8dcdf33ffc5dd4d6189d076c4721073d9a06c4ed992c9838052c1db6d0339631ef76b6a816d0311ec2979e2635bec9a800666034e36 - languageName: node - linkType: hard - -"imagemin-mozjpeg@npm:^9.0.0": - version: 9.0.0 - resolution: "imagemin-mozjpeg@npm:9.0.0" - dependencies: - execa: "npm:^4.0.0" - is-jpg: "npm:^2.0.0" - mozjpeg: "npm:^7.0.0" - checksum: 10c0/50878e3782b5ada2023cb7675fd4b47f32c1a6f5be41eb1be39a3697c71aee3fae42d55fcf1eb0350d88f75af3535dfc5996a7584377ce1d1c2a5aca616ae46a - languageName: node - linkType: hard - -"imagemin-optipng@npm:^8.0.0": - version: 8.0.0 - resolution: "imagemin-optipng@npm:8.0.0" - dependencies: - exec-buffer: "npm:^3.0.0" - is-png: "npm:^2.0.0" - optipng-bin: "npm:^7.0.0" - checksum: 10c0/7969328eefac328c1a7e47aab1e71275afbc5783f39f738c6453eb3235e750300836b0c8b76c2d5a19f4e86c928e012c630c5bb0e342c6e18e28a9bc8a0be5be - languageName: node - linkType: hard - -"imagemin-pngquant@npm:^9.0.2": - version: 9.0.2 - resolution: "imagemin-pngquant@npm:9.0.2" - dependencies: - execa: "npm:^4.0.0" - is-png: "npm:^2.0.0" - is-stream: "npm:^2.0.0" - ow: "npm:^0.17.0" - pngquant-bin: "npm:^6.0.0" - checksum: 10c0/65a13286f55dd239a3add2fb6c634c9d59f70f31a5af0bd6025a913adbb84e483118e4bbcae9e122b8e8258304ba0b890d04ed5f220ecc8303bb14e7b013ef7b - languageName: node - linkType: hard - -"imagemin-svgo@npm:^9.0.0": - version: 9.0.0 - resolution: "imagemin-svgo@npm:9.0.0" - dependencies: - is-svg: "npm:^4.2.1" - svgo: "npm:^2.1.0" - checksum: 10c0/2c451c700b02de2b99ad45782c5f76b479d01c77dabee376455d19e49118ce212d84ce0e3ef441bed7625715b7fbf1382d90fb7a1c5944b82d7dc760004f4225 - languageName: node - linkType: hard - -"imagemin-webp@npm:^6.0.0": - version: 6.1.0 - resolution: "imagemin-webp@npm:6.1.0" - dependencies: - cwebp-bin: "npm:^6.0.0" - exec-buffer: "npm:^3.0.0" - is-cwebp-readable: "npm:^3.0.0" - checksum: 10c0/ddb66a82c417ecf40b417fbc0803a200047822390c8ed8fccc5c112527348053db2f3d260e6c693d88afaa33887a3eb252b12fc7783e872f007c25e9666fde98 - languageName: node - linkType: hard - -"imagemin@npm:^7.0.1": - version: 7.0.1 - resolution: "imagemin@npm:7.0.1" - dependencies: - file-type: "npm:^12.0.0" - globby: "npm:^10.0.0" - graceful-fs: "npm:^4.2.2" - junk: "npm:^3.1.0" - make-dir: "npm:^3.0.0" - p-pipe: "npm:^3.0.0" - replace-ext: "npm:^1.0.0" - checksum: 10c0/13e5de25fe1275d05a948b745b5cc8ca472f69bec895baf32e96e61bbd9c98a065f14a5de8f178ce426e2466780360dbddc9f6024664f3afa551d6390733c40e - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.1 - resolution: "import-fresh@npm:3.3.1" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10c0/bf8cc494872fef783249709385ae883b447e3eb09db0ebd15dcead7d9afe7224dad7bd7591c6b73b0b19b3c0f9640eb8ee884f01cfaf2887ab995b0b36a0cbec - languageName: node - linkType: hard - -"import-lazy@npm:^3.1.0": - version: 3.1.0 - resolution: "import-lazy@npm:3.1.0" - checksum: 10c0/f4cb60bcfc44897efaa1e08183fcf6605c4732e2b1bef4257220566f67fd5cd6ddc838e5d5055072319eee1d6fe5896cb13b83277b1a75a80ff55052d29feef1 - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10c0/8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 - languageName: node - linkType: hard - -"indent-string@npm:^2.1.0": - version: 2.1.0 - resolution: "indent-string@npm:2.1.0" - dependencies: - repeating: "npm:^2.0.0" - checksum: 10c0/d38e04bbd9b0e1843164d06e9ac1e106ead5a6f7b5714c94ecebc2555b2d3af075b3ddc4d6f92ac87d5319c0935df60d571d3f45f17a6f0ec707be65f26ae924 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10c0/7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 - languageName: node - linkType: hard - -"inherits@npm:2, inherits@npm:^2.0.1, inherits@npm:~2.0.3": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10c0/4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 - languageName: node - linkType: hard - -"ini@npm:^1.3.4": - version: 1.3.8 - resolution: "ini@npm:1.3.8" - checksum: 10c0/ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a - languageName: node - linkType: hard - -"into-stream@npm:^3.1.0": - version: 3.1.0 - resolution: "into-stream@npm:3.1.0" - dependencies: - from2: "npm:^2.1.1" - p-is-promise: "npm:^1.1.0" - checksum: 10c0/2f298ecb3ff9a9a58ae0407ddf390d7f1d6dfcda9c91e696b10194cb81266c1231dae01c09bd7c435049190d03676b6bc6ab4c258c85b03a98c55da93a5e314f - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10c0/331cd07fafcb3b24100613e4b53e1a2b4feab11e671e655d46dc09ee233da5011284d09ca40c4ecbdfe1d0004f462958675c224a804259f2f78d2465a87824bc - languageName: node - linkType: hard - -"is-arrayish@npm:^0.2.1": - version: 0.2.1 - resolution: "is-arrayish@npm:0.2.1" - checksum: 10c0/e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 - languageName: node - linkType: hard - -"is-core-module@npm:^2.16.0": - version: 2.16.1 - resolution: "is-core-module@npm:2.16.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10c0/898443c14780a577e807618aaae2b6f745c8538eca5c7bc11388a3f2dc6de82b9902bcc7eb74f07be672b11bbe82dd6a6edded44a00cb3d8f933d0459905eedd - languageName: node - linkType: hard - -"is-cwebp-readable@npm:^3.0.0": - version: 3.0.0 - resolution: "is-cwebp-readable@npm:3.0.0" - dependencies: - file-type: "npm:^10.5.0" - checksum: 10c0/2f0c8dad70395e63710ab4f8020e66bb74da7dd30d3206417a09519192214c1a0fc36e3476c6b3946c7b27027da25c92c6d876f66aaee532391bf374e1b21dcb - languageName: node - linkType: hard - -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" - bin: - is-docker: cli.js - checksum: 10c0/e828365958d155f90c409cdbe958f64051d99e8aedc2c8c4cd7c89dcf35329daed42f7b99346f7828df013e27deb8f721cf9408ba878c76eb9e8290235fbcdcc - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10c0/5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 - languageName: node - linkType: hard - -"is-finite@npm:^1.0.0": - version: 1.1.0 - resolution: "is-finite@npm:1.1.0" - checksum: 10c0/ca6bc7a0321b339f098e657bd4cbf4bb2410f5a11f1b9adb1a1a9ab72288b64368e8251326cb1f74e985f2779299cec3e1f1e558b68ce7e1e2c9be17b7cfd626 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10c0/bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc - languageName: node - linkType: hard - -"is-gif@npm:^3.0.0": - version: 3.0.0 - resolution: "is-gif@npm:3.0.0" - dependencies: - file-type: "npm:^10.4.0" - checksum: 10c0/0f8c5b50ff77dd9aa25bb18b467470503a470869c61b6ed3d63aacd33371429035499d0ef4518ec65bd95dcf1eabb0334917e28ae838ccd9cca526925432ee38 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10c0/17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a - languageName: node - linkType: hard - -"is-jpg@npm:^2.0.0": - version: 2.0.0 - resolution: "is-jpg@npm:2.0.0" - checksum: 10c0/9b0234ca873462ae5e5d967e2413faaf11e1a12012e45260f60454767a22a313c83f28987248c016fec6845ca263dc4ed4f765f8c09849f9270054af89bdc3d5 - languageName: node - linkType: hard - -"is-natural-number@npm:^4.0.1": - version: 4.0.1 - resolution: "is-natural-number@npm:4.0.1" - checksum: 10c0/f05c544cb0ad39d4410e2ae2244282bf61918ebbb808b665436ffca4f6bbe908d3ae3a8d21fe143d302951f157d969986dd432098b63899561639fcd1ce1c280 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10c0/b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 - languageName: node - linkType: hard - -"is-object@npm:^1.0.1": - version: 1.0.2 - resolution: "is-object@npm:1.0.2" - checksum: 10c0/9cfb80c3a850f453d4a77297e0556bc2040ac6bea5b6e418aee208654938b36bab768169bef3945ccfac7a9bb460edd8034e7c6d8973bcf147d7571e1b53e764 - languageName: node - linkType: hard - -"is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": - version: 1.1.0 - resolution: "is-plain-obj@npm:1.1.0" - checksum: 10c0/daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c - languageName: node - linkType: hard - -"is-png@npm:^2.0.0": - version: 2.0.0 - resolution: "is-png@npm:2.0.0" - checksum: 10c0/458ba52a715507f7593dd4f2dc2eac8c15e5ebf5273b9a79be008fff1fa41135dab08883d6b18415f0eea1f230430984b45c628832107a59c43951fb04c4693c - languageName: node - linkType: hard - -"is-retry-allowed@npm:^1.0.0, is-retry-allowed@npm:^1.1.0": - version: 1.2.0 - resolution: "is-retry-allowed@npm:1.2.0" - checksum: 10c0/a80f14e1e11c27a58f268f2927b883b635703e23a853cb7b8436e3456bf2ea3efd5082a4e920093eec7bd372c1ce6ea7cea78a9376929c211039d0cc4a393a44 - languageName: node - linkType: hard - -"is-stream@npm:^1.0.0, is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 10c0/b8ae7971e78d2e8488d15f804229c6eed7ed36a28f8807a1815938771f4adff0e705218b7dab968270433f67103e4fef98062a0beea55d64835f705ee72c7002 - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10c0/7c284241313fc6efc329b8d7f08e16c0efeb6baab1b4cd0ba579eb78e5af1aa5da11e68559896a2067cd6c526bd29241dda4eb1225e627d5aa1a89a76d4635a5 - languageName: node - linkType: hard - -"is-svg@npm:^4.2.1": - version: 4.4.0 - resolution: "is-svg@npm:4.4.0" - dependencies: - fast-xml-parser: "npm:^4.1.3" - checksum: 10c0/9d1e83215d67b65853db7b058243392010478c6759b95c6cb1caf65947eb98a0ff6ac91b8f67e8a85884afee09dc893b6a8e681555637efb6fc0966ef005a1d2 - languageName: node - linkType: hard - -"is-utf8@npm:^0.2.0": - version: 0.2.1 - resolution: "is-utf8@npm:0.2.1" - checksum: 10c0/3ed45e5b4ddfa04ed7e32c63d29c61b980ecd6df74698f45978b8c17a54034943bcbffb6ae243202e799682a66f90fef526f465dd39438745e9fe70794c1ef09 - languageName: node - linkType: hard - -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" - dependencies: - is-docker: "npm:^2.0.0" - checksum: 10c0/a6fa2d370d21be487c0165c7a440d567274fbba1a817f2f0bfa41cc5e3af25041d84267baa22df66696956038a43973e72fca117918c91431920bdef490fa25e - languageName: node - linkType: hard - -"isarray@npm:~1.0.0": - version: 1.0.0 - resolution: "isarray@npm:1.0.0" - checksum: 10c0/18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10c0/228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10c0/9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 - languageName: node - linkType: hard - -"isurl@npm:^1.0.0-alpha5": - version: 1.0.0 - resolution: "isurl@npm:1.0.0" - dependencies: - has-to-string-tag-x: "npm:^1.2.0" - is-object: "npm:^1.0.1" - checksum: 10c0/137e377cd72fefdbc950a226a08e7b35d53672c3b7173b03e72194c3e78a03109aa44c15390b26445b90b7708acb89ca89ed3cd7cc55a6afc7c37cbc88fc581a - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10c0/6acc10d139eaefdbe04d2f679e6191b3abf073f111edf10b1de5302c97ec93fffeb2fdd8681ed17f16268aa9dd4f8c588ed9d1d3bffbbfa6e8bf897cbb3149b9 - languageName: node - linkType: hard - -"javascript-natural-sort@npm:^0.7.1": - version: 0.7.1 - resolution: "javascript-natural-sort@npm:0.7.1" - checksum: 10c0/340f8ffc5d30fb516e06dc540e8fa9e0b93c865cf49d791fed3eac3bdc5fc71f0066fc81d44ec1433edc87caecaf9f13eec4a1fce8c5beafc709a71eaedae6fe - languageName: node - linkType: hard - -"jpegtran-bin@npm:^5.0.0": - version: 5.0.2 - resolution: "jpegtran-bin@npm:5.0.2" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.0" - logalot: "npm:^2.0.0" - bin: - jpegtran: cli.js - checksum: 10c0/8a486fca27ca07a6f7051103df668ddb01445a605caf8810325bf13521340f4253c5c14470e70bcb025c7cf630d40616eab62e5fa2bea5dc46195be8922d4538 - languageName: node - linkType: hard - -"jpegtran-bin@npm:^6.0.1": - version: 6.0.1 - resolution: "jpegtran-bin@npm:6.0.1" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.0" - bin: - jpegtran: cli.js - checksum: 10c0/d0e9716b5ccbab0f82c515e174785e595d90e146186fff156ca2a34f66b65c7cba755cea073d50bcf9a0ad901fe276ff730beb82eb74b92bd9c349d2c04641c9 - languageName: node - linkType: hard - -"js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10c0/e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10c0/184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10c0/4f907fb78d7b712e11dea8c165fe0921f81a657d3443dde75359ed52eb2b5d33ce6773d97985a089f09a65edd80b11cb75c767b57ba47391fee4c969f7215c96 - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.1.0 - resolution: "jsesc@npm:3.1.0" - bin: - jsesc: bin/jsesc - checksum: 10c0/531779df5ec94f47e462da26b4cbf05eb88a83d9f08aac2ba04206508fc598527a153d08bd462bae82fc78b3eaa1a908e1a4a79f886e9238641c4cdefaf118b1 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.0": - version: 3.0.0 - resolution: "json-buffer@npm:3.0.0" - checksum: 10c0/118c060d84430a8ad8376d0c60250830f350a6381bd56541a1ef257ce7ba82d109d1f71a4c4e92e0be0e7ab7da568fad8f7bf02905910a76e8e0aa338621b944 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 10c0/0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^2.3.0": - version: 2.3.1 - resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 10c0/140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10c0/108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10c0/cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 - languageName: node - linkType: hard - -"json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10c0/5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c - languageName: node - linkType: hard - -"jsonfile@npm:^6.0.1": - version: 6.1.0 - resolution: "jsonfile@npm:6.1.0" - dependencies: - graceful-fs: "npm:^4.1.6" - universalify: "npm:^2.0.0" - dependenciesMeta: - graceful-fs: - optional: true - checksum: 10c0/4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 - languageName: node - linkType: hard - -"junk@npm:^3.1.0": - version: 3.1.0 - resolution: "junk@npm:3.1.0" - checksum: 10c0/820174b9fa9a3af09aeeeeb1022df2481a2b10752ce5f65ac63924a79cb9bba83ea7c288e8d5b448951109742da5ea69a230846f4bf3c17c5c6a1d0603b63db4 - languageName: node - linkType: hard - -"jwt-decode@npm:^4.0.0": - version: 4.0.0 - resolution: "jwt-decode@npm:4.0.0" - checksum: 10c0/de75bbf89220746c388cf6a7b71e56080437b77d2edb29bae1c2155048b02c6b8c59a3e5e8d6ccdfd54f0b8bda25226e491a4f1b55ac5f8da04cfbadec4e546c - languageName: node - linkType: hard - -"keyv@npm:3.0.0": - version: 3.0.0 - resolution: "keyv@npm:3.0.0" - dependencies: - json-buffer: "npm:3.0.0" - checksum: 10c0/eb128eb136d4b6bca08ac3936fb5a6ba630f1b9575289e8140c60cdc20b4df04cba5cfaa982df57516364bf62801d2c497cad70edca1270e72a2403876a42805 - languageName: node - linkType: hard - -"keyv@npm:^4.5.4": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10c0/aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e - languageName: node - linkType: hard - -"kolorist@npm:^1.6.0, kolorist@npm:^1.8.0": - version: 1.8.0 - resolution: "kolorist@npm:1.8.0" - checksum: 10c0/73075db44a692bf6c34a649f3b4b3aea4993b84f6b754cbf7a8577e7c7db44c0bad87752bd23b0ce533f49de2244ce2ce03b7b1b667a85ae170a94782cc50f9b - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: "npm:^1.2.1" - type-check: "npm:~0.4.0" - checksum: 10c0/effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e - languageName: node - linkType: hard - -"lines-and-columns@npm:^1.1.6": - version: 1.2.4 - resolution: "lines-and-columns@npm:1.2.4" - checksum: 10c0/3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d - languageName: node - linkType: hard - -"load-json-file@npm:^1.0.0": - version: 1.1.0 - resolution: "load-json-file@npm:1.1.0" - dependencies: - graceful-fs: "npm:^4.1.2" - parse-json: "npm:^2.2.0" - pify: "npm:^2.0.0" - pinkie-promise: "npm:^2.0.0" - strip-bom: "npm:^2.0.0" - checksum: 10c0/2a5344c2d88643735a938fdca8582c0504e1c290577faa74f56b9cc187fa443832709a15f36e5771f779ec0878215a03abc8faf97ec57bb86092ceb7e0caef22 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10c0/d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10c0/402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 - languageName: node - linkType: hard - -"lodash@npm:^4.17.21": - version: 4.17.21 - resolution: "lodash@npm:4.17.21" - checksum: 10c0/d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c - languageName: node - linkType: hard - -"logalot@npm:^2.0.0": - version: 2.1.0 - resolution: "logalot@npm:2.1.0" - dependencies: - figures: "npm:^1.3.5" - squeak: "npm:^1.0.0" - checksum: 10c0/ed14ae7bced8615a15bfafaeeb0e476ddebe9650e09501692727e58238e508384bed8922bfb40e8a003aaa1b59f830bcc63defb9ad0570ecb8700afe93994881 - languageName: node - linkType: hard - -"longest@npm:^1.0.0": - version: 1.0.1 - resolution: "longest@npm:1.0.1" - checksum: 10c0/e77bd510ea4083cc202a8985be1d422d4183e1078775bcf6c5d9aee3e401d9094b44348c720f9d349f230293865b09ee611453ac4694422ad43a9a9bdb092c82 - languageName: node - linkType: hard - -"loose-envify@npm:^1.4.0": - version: 1.4.0 - resolution: "loose-envify@npm:1.4.0" - dependencies: - js-tokens: "npm:^3.0.0 || ^4.0.0" - bin: - loose-envify: cli.js - checksum: 10c0/655d110220983c1a4b9c0c679a2e8016d4b67f6e9c7b5435ff5979ecdb20d0813f4dec0a08674fcbdd4846a3f07edbb50a36811fd37930b94aaa0d9daceb017e - languageName: node - linkType: hard - -"loud-rejection@npm:^1.0.0": - version: 1.6.0 - resolution: "loud-rejection@npm:1.6.0" - dependencies: - currently-unhandled: "npm:^0.4.1" - signal-exit: "npm:^3.0.0" - checksum: 10c0/aa060b3fe55ad96b97890f1b0a24bf81a2d612e397d6cc0374ce1cf7e021cd0247f0ddb68134499882d0843c2776371d5221b80b0b3beeca5133a6e7f27a3845 - languageName: node - linkType: hard - -"lowercase-keys@npm:1.0.0": - version: 1.0.0 - resolution: "lowercase-keys@npm:1.0.0" - checksum: 10c0/cd5cb8d8f41bf0f8f8f396c467b1872a3d0283528e3aff385f9978f1eb94c8ada3081f67ab3b97bbe70697a44e22bb12ec09fb1b099188b112575595b655b02b - languageName: node - linkType: hard - -"lowercase-keys@npm:^1.0.0": - version: 1.0.1 - resolution: "lowercase-keys@npm:1.0.1" - checksum: 10c0/56776a8e1ef1aca98ecf6c19b30352ae1cf257b65b8ac858b7d8a0e8b348774d12a9b41aa7f59bfea51bff44bc7a198ab63ba4406bfba60dba008799618bef66 - languageName: node - linkType: hard - -"lpad-align@npm:^1.0.1": - version: 1.1.2 - resolution: "lpad-align@npm:1.1.2" - dependencies: - get-stdin: "npm:^4.0.1" - indent-string: "npm:^2.1.0" - longest: "npm:^1.0.0" - meow: "npm:^3.3.0" - bin: - lpad-align: cli.js - checksum: 10c0/7578116ba90c1cd0877cb76827cc241e2a9c0b0276366bead56fba64f5d6888f7d7501eedf79d6d528fa15d92da84184a8a6bd963d392bc5644cc314ed127a49 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb - languageName: node - linkType: hard - -"lru-cache@npm:^4.0.1": - version: 4.1.5 - resolution: "lru-cache@npm:4.1.5" - dependencies: - pseudomap: "npm:^1.0.2" - yallist: "npm:^2.1.2" - checksum: 10c0/1ca5306814e5add9ec63556d6fd9b24a4ecdeaef8e9cea52cbf30301e6b88c8d8ddc7cab45b59b56eb763e6c45af911585dc89925a074ab65e1502e3fe8103cf - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10c0/89b2ef2ef45f543011e38737b8a8622a2f8998cddf0e5437174ef8f1f70a8b9d14a918ab3e232cb3ba343b7abddffa667f0b59075b2b80e6b4d63c3de6127482 - languageName: node - linkType: hard - -"magic-string@npm:^0.30.6": - version: 0.30.17 - resolution: "magic-string@npm:0.30.17" - dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 - languageName: node - linkType: hard - -"make-dir@npm:^1.0.0, make-dir@npm:^1.2.0": - version: 1.3.0 - resolution: "make-dir@npm:1.3.0" - dependencies: - pify: "npm:^3.0.0" - checksum: 10c0/5eb94f47d7ef41d89d1b8eef6539b8950d5bd99eeba093a942bfd327faa37d2d62227526b88b73633243a2ec7972d21eb0f4e5d62ae4e02a79e389f4a7bb3022 - languageName: node - linkType: hard - -"make-dir@npm:^3.0.0": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10c0/56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa - languageName: node - linkType: hard - -"make-fetch-happen@npm:^14.0.3": - version: 14.0.3 - resolution: "make-fetch-happen@npm:14.0.3" - dependencies: - "@npmcli/agent": "npm:^3.0.0" - cacache: "npm:^19.0.1" - http-cache-semantics: "npm:^4.1.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^4.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^1.0.0" - proc-log: "npm:^5.0.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^12.0.0" - checksum: 10c0/c40efb5e5296e7feb8e37155bde8eb70bc57d731b1f7d90e35a092fde403d7697c56fb49334d92d330d6f1ca29a98142036d6480a12681133a0a1453164cb2f0 - languageName: node - linkType: hard - -"map-obj@npm:^1.0.0, map-obj@npm:^1.0.1": - version: 1.0.1 - resolution: "map-obj@npm:1.0.1" - checksum: 10c0/ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 - languageName: node - linkType: hard - -"mdn-data@npm:2.0.14": - version: 2.0.14 - resolution: "mdn-data@npm:2.0.14" - checksum: 10c0/67241f8708c1e665a061d2b042d2d243366e93e5bf1f917693007f6d55111588b952dcbfd3ea9c2d0969fb754aad81b30fdcfdcc24546495fc3b24336b28d4bd - languageName: node - linkType: hard - -"memoize-one@npm:>=3.1.1 <6": - version: 5.2.1 - resolution: "memoize-one@npm:5.2.1" - checksum: 10c0/fd22dbe9a978a2b4f30d6a491fc02fb90792432ad0dab840dc96c1734d2bd7c9cdeb6a26130ec60507eb43230559523615873168bcbe8fafab221c30b11d54c1 - languageName: node - linkType: hard - -"meow@npm:^3.3.0": - version: 3.7.0 - resolution: "meow@npm:3.7.0" - dependencies: - camelcase-keys: "npm:^2.0.0" - decamelize: "npm:^1.1.2" - loud-rejection: "npm:^1.0.0" - map-obj: "npm:^1.0.1" - minimist: "npm:^1.1.3" - normalize-package-data: "npm:^2.3.4" - object-assign: "npm:^4.0.1" - read-pkg-up: "npm:^1.0.1" - redent: "npm:^1.0.0" - trim-newlines: "npm:^1.0.0" - checksum: 10c0/e5ba4632b6558006b5f4df64b5a35e777d75629ab08d84f7bbc967e7603a396e16baa8f67aae26c7833a6a117e4857afef393e0b9aee21f52320e54812d9ae09 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10c0/867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 - languageName: node - linkType: hard - -"merge2@npm:^1.2.3, merge2@npm:^1.3.0": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10c0/254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb - languageName: node - linkType: hard - -"micromatch@npm:^4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8 - languageName: node - linkType: hard - -"mime-db@npm:1.52.0": - version: 1.52.0 - resolution: "mime-db@npm:1.52.0" - checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa - languageName: node - linkType: hard - -"mime-db@npm:^1.28.0": - version: 1.54.0 - resolution: "mime-db@npm:1.54.0" - checksum: 10c0/8d907917bc2a90fa2df842cdf5dfeaf509adc15fe0531e07bb2f6ab15992416479015828d6a74200041c492e42cce3ebf78e5ce714388a0a538ea9c53eece284 - languageName: node - linkType: hard - -"mime-types@npm:^2.1.35": - version: 2.1.35 - resolution: "mime-types@npm:2.1.35" - dependencies: - mime-db: "npm:1.52.0" - checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10c0/b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 - languageName: node - linkType: hard - -"mimic-response@npm:^1.0.0": - version: 1.0.1 - resolution: "mimic-response@npm:1.0.1" - checksum: 10c0/c5381a5eae997f1c3b5e90ca7f209ed58c3615caeee850e85329c598f0c000ae7bec40196580eef1781c60c709f47258131dab237cad8786f8f56750594f27fa - languageName: node - linkType: hard - -"minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.2 - resolution: "minimatch@npm:3.1.2" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10c0/de96cf5e35bdf0eab3e2c853522f98ffbe9a36c37797778d2665231ec1f20a9447a7e567cb640901f89e4daaa95ae5d70c65a9e8aa2bb0019b6facbc3c0575ed - languageName: node - linkType: hard - -"minimist@npm:^1.1.3": - version: 1.2.8 - resolution: "minimist@npm:1.2.8" - checksum: 10c0/19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e - languageName: node - linkType: hard - -"minipass-fetch@npm:^4.0.0": - version: 4.0.1 - resolution: "minipass-fetch@npm:4.0.1" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^3.0.1" - dependenciesMeta: - encoding: - optional: true - checksum: 10c0/a3147b2efe8e078c9bf9d024a0059339c5a09c5b1dded6900a219c218cc8b1b78510b62dae556b507304af226b18c3f1aeb1d48660283602d5b6586c399eed5c - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10c0/298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10c0/a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.0.4, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10c0/b0fd20bb9fb56e5fa9a8bfac539e8915ae07430a619e4b86ff71f5fc757ef3924b23b2c4230393af1eda647ed3d75739e4e0acb250a6b1eb277cf7f8fe449557 - languageName: node - linkType: hard - -"minizlib@npm:^3.0.1": - version: 3.0.1 - resolution: "minizlib@npm:3.0.1" - dependencies: - minipass: "npm:^7.0.4" - rimraf: "npm:^5.0.5" - checksum: 10c0/82f8bf70da8af656909a8ee299d7ed3b3372636749d29e105f97f20e88971be31f5ed7642f2e898f00283b68b701cc01307401cdc209b0efc5dd3818220e5093 - languageName: node - linkType: hard - -"mkdirp@npm:^3.0.1": - version: 3.0.1 - resolution: "mkdirp@npm:3.0.1" - bin: - mkdirp: dist/cjs/src/bin.js - checksum: 10c0/9f2b975e9246351f5e3a40dcfac99fcd0baa31fbfab615fe059fb11e51f10e4803c63de1f384c54d656e4db31d000e4767e9ef076a22e12a641357602e31d57d - languageName: node - linkType: hard - -"mozjpeg@npm:^7.0.0": - version: 7.1.1 - resolution: "mozjpeg@npm:7.1.1" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.0" - bin: - mozjpeg: cli.js - checksum: 10c0/62bfd609cf69a674a3621a971f48bfd2ede0e00452e10dbc1621438f6f40c4435827714f4d19ea235a74c2ad9401f99a445074c5630f1033e2dc5ec975a8f8ac - languageName: node - linkType: hard - -"ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10c0/d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 - languageName: node - linkType: hard - -"nanoid@npm:^3.3.8": - version: 3.3.11 - resolution: "nanoid@npm:3.3.11" - bin: - nanoid: bin/nanoid.cjs - checksum: 10c0/40e7f70b3d15f725ca072dfc4f74e81fcf1fbb02e491cf58ac0c79093adc9b0a73b152bcde57df4b79cd097e13023d7504acb38404a4da7bc1cd8e887b82fe0b - languageName: node - linkType: hard - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10c0/f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 - languageName: node - linkType: hard - -"negotiator@npm:^1.0.0": - version: 1.0.0 - resolution: "negotiator@npm:1.0.0" - checksum: 10c0/4c559dd52669ea48e1914f9d634227c561221dd54734070791f999c52ed0ff36e437b2e07d5c1f6e32909fc625fe46491c16e4a8f0572567d4dd15c3a4fda04b - languageName: node - linkType: hard - -"nice-try@npm:^1.0.4": - version: 1.0.5 - resolution: "nice-try@npm:1.0.5" - checksum: 10c0/95568c1b73e1d0d4069a3e3061a2102d854513d37bcfda73300015b7ba4868d3b27c198d1dbbd8ebdef4112fc2ed9e895d4a0f2e1cce0bd334f2a1346dc9205f - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 11.1.0 - resolution: "node-gyp@npm:11.1.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^14.0.3" - nopt: "npm:^8.0.0" - proc-log: "npm:^5.0.0" - semver: "npm:^7.3.5" - tar: "npm:^7.4.3" - which: "npm:^5.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10c0/c38977ce502f1ea41ba2b8721bd5b49bc3d5b3f813eabfac8414082faf0620ccb5211e15c4daecc23ed9f5e3e9cc4da00e575a0bcfc2a95a069294f2afa1e0cd - languageName: node - linkType: hard - -"node-html-parser@npm:^6.1.12": - version: 6.1.13 - resolution: "node-html-parser@npm:6.1.13" - dependencies: - css-select: "npm:^5.1.0" - he: "npm:1.2.0" - checksum: 10c0/ca36290507da8ec0fa131a0fd67ba62e300365c3950b5a6058b0e32b71b520ff43a5661b19e98a5c9797dbe3428b08db788b602f1f8aa62f2db5bb66e1d80782 - languageName: node - linkType: hard - -"node-releases@npm:^2.0.19": - version: 2.0.19 - resolution: "node-releases@npm:2.0.19" - checksum: 10c0/52a0dbd25ccf545892670d1551690fe0facb6a471e15f2cfa1b20142a5b255b3aa254af5f59d6ecb69c2bec7390bc643c43aa63b13bf5e64b6075952e716b1aa - languageName: node - linkType: hard - -"nopt@npm:^8.0.0": - version: 8.1.0 - resolution: "nopt@npm:8.1.0" - dependencies: - abbrev: "npm:^3.0.0" - bin: - nopt: bin/nopt.js - checksum: 10c0/62e9ea70c7a3eb91d162d2c706b6606c041e4e7b547cbbb48f8b3695af457dd6479904d7ace600856bf923dd8d1ed0696f06195c8c20f02ac87c1da0e1d315ef - languageName: node - linkType: hard - -"normalize-package-data@npm:^2.3.2, normalize-package-data@npm:^2.3.4": - version: 2.5.0 - resolution: "normalize-package-data@npm:2.5.0" - dependencies: - hosted-git-info: "npm:^2.1.4" - resolve: "npm:^1.10.0" - semver: "npm:2 || 3 || 4 || 5" - validate-npm-package-license: "npm:^3.0.1" - checksum: 10c0/357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 - languageName: node - linkType: hard - -"normalize-url@npm:2.0.1": - version: 2.0.1 - resolution: "normalize-url@npm:2.0.1" - dependencies: - prepend-http: "npm:^2.0.0" - query-string: "npm:^5.0.1" - sort-keys: "npm:^2.0.0" - checksum: 10c0/a1fe89ca96cfb48000d031432ced9b6aaba5be18e49ce784426096ac51fcc775744b51df6a6eb79a0af3f86681ab26834afcae58eff28c84833db64824bdd494 - languageName: node - linkType: hard - -"npm-conf@npm:^1.1.0": - version: 1.1.3 - resolution: "npm-conf@npm:1.1.3" - dependencies: - config-chain: "npm:^1.1.11" - pify: "npm:^3.0.0" - checksum: 10c0/4a54540e1e5ade9afe4b3be2e651a1198172015f8c51293c7124c4dfae402f2b67549cdf1d0eb918f3ef66016ba63672520b4bb3afaef815f5e98b52a74f5848 - languageName: node - linkType: hard - -"npm-run-path@npm:^2.0.0": - version: 2.0.2 - resolution: "npm-run-path@npm:2.0.2" - dependencies: - path-key: "npm:^2.0.0" - checksum: 10c0/95549a477886f48346568c97b08c4fda9cdbf7ce8a4fbc2213f36896d0d19249e32d68d7451bdcbca8041b5fba04a6b2c4a618beaf19849505c05b700740f1de - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.0, npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 10c0/6f9353a95288f8455cf64cbeb707b28826a7f29690244c1e4bb61ec573256e021b6ad6651b394eb1ccfd00d6ec50147253aba2c5fe58a57ceb111fad62c519ac - languageName: node - linkType: hard - -"nth-check@npm:^2.0.1": - version: 2.1.1 - resolution: "nth-check@npm:2.1.1" - dependencies: - boolbase: "npm:^1.0.0" - checksum: 10c0/5fee7ff309727763689cfad844d979aedd2204a817fbaaf0e1603794a7c20db28548d7b024692f953557df6ce4a0ee4ae46cd8ebd9b36cfb300b9226b567c479 - languageName: node - linkType: hard - -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 - languageName: node - linkType: hard - -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10c0/5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 - languageName: node - linkType: hard - -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10c0/ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f - languageName: node - linkType: hard - -"open@npm:^8.4.0": - version: 8.4.2 - resolution: "open@npm:8.4.2" - dependencies: - define-lazy-prop: "npm:^2.0.0" - is-docker: "npm:^2.1.1" - is-wsl: "npm:^2.2.0" - checksum: 10c0/bb6b3a58401dacdb0aad14360626faf3fb7fba4b77816b373495988b724fb48941cad80c1b65d62bb31a17609b2cd91c41a181602caea597ca80dfbcc27e84c9 - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: "npm:^0.1.3" - fast-levenshtein: "npm:^2.0.6" - levn: "npm:^0.4.1" - prelude-ls: "npm:^1.2.1" - type-check: "npm:^0.4.0" - word-wrap: "npm:^1.2.5" - checksum: 10c0/4afb687a059ee65b61df74dfe87d8d6815cd6883cb8b3d5883a910df72d0f5d029821f37025e4bccf4048873dbdb09acc6d303d27b8f76b1a80dd5a7d5334675 - languageName: node - linkType: hard - -"optipng-bin@npm:^7.0.0": - version: 7.0.1 - resolution: "optipng-bin@npm:7.0.1" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.0" - bin: - optipng: cli.js - checksum: 10c0/fe6328228586dacbbdb19806c51f61dbb80108fdef05e466f8493c72fdb658cae96ffbf6b5d2d54a7f47fd44e16112fd5a4290f7fc9a7bad859a901e3c571ccf - languageName: node - linkType: hard - -"os-filter-obj@npm:^2.0.0": - version: 2.0.0 - resolution: "os-filter-obj@npm:2.0.0" - dependencies: - arch: "npm:^2.1.0" - checksum: 10c0/2734dcef67dfa027b3aeb8c721893c9c97b4d261efebd2a8469330d8b62ccaae072599aef0d3037bf285385fa14fb745f2e6d6958805924bb008031691cc7253 - languageName: node - linkType: hard - -"ow@npm:^0.17.0": - version: 0.17.0 - resolution: "ow@npm:0.17.0" - dependencies: - type-fest: "npm:^0.11.0" - checksum: 10c0/aa610dd7a83fe0f934ae7cdbf9bc56d984f4f39a2aca57aa893c46bf9b3928a99e530ee2ea2c8686c0fc59c11b112e2f0f0db291250370e3f6bcfddd3de49824 - languageName: node - linkType: hard - -"p-cancelable@npm:^0.3.0": - version: 0.3.0 - resolution: "p-cancelable@npm:0.3.0" - checksum: 10c0/b8b2c8425b3d284b72097f1b97081ff3f431fd5680f8dfc2344e4f8544f6d8d9f9b545a737bca6a32a319cca1921a44cfd234602e58911dc5d3e144cbe685ea6 - languageName: node - linkType: hard - -"p-cancelable@npm:^0.4.0": - version: 0.4.1 - resolution: "p-cancelable@npm:0.4.1" - checksum: 10c0/cc066ac107958fa2549f1c270e00ec1b25cfbeda867f93599a414806b3631cd9451533acb2bda3efda4bf4a54a2f9d6cc51dd6d06c08c25b806b3dfe5ff69b29 - languageName: node - linkType: hard - -"p-event@npm:^1.0.0": - version: 1.3.0 - resolution: "p-event@npm:1.3.0" - dependencies: - p-timeout: "npm:^1.1.1" - checksum: 10c0/72755ae05cc4965015a9ee00ea6a8755f71e90cfc5554c0509a336e8a0f71e0b551eec4bdad52e1c922e8375d7ff9b673c8c3f55ad5e0114424333c0e727f4e8 - languageName: node - linkType: hard - -"p-event@npm:^2.1.0": - version: 2.3.1 - resolution: "p-event@npm:2.3.1" - dependencies: - p-timeout: "npm:^2.0.1" - checksum: 10c0/c1f6dc6f82d999a8351ae7328c717bd882e91bb7545c6310378656623e0ae27dcbb294f61c6c9bbe2c8ebf4273c84c3ac19e00774b8a5dfb1c9c209170b32898 - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 10c0/6b8552339a71fe7bd424d01d8451eea92d379a711fc62f6b2fe64cad8a472c7259a236c9a22b4733abca0b5666ad503cb497792a0478c5af31ded793d00937e7 - languageName: node - linkType: hard - -"p-is-promise@npm:^1.1.0": - version: 1.1.0 - resolution: "p-is-promise@npm:1.1.0" - checksum: 10c0/b3f945a18e3e16a7a5fda131250f7a96f59ceb6fdceee87576044790b99b97a5ab5d4a9ae878d2746f762b99efc0a8c1e3b21b5269e3537fbfdb443a38eeb9bf - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10c0/9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10c0/2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a - languageName: node - linkType: hard - -"p-map-series@npm:^1.0.0": - version: 1.0.0 - resolution: "p-map-series@npm:1.0.0" - dependencies: - p-reduce: "npm:^1.0.0" - checksum: 10c0/6c15edb0aba29462682f5065c9af9889e20ed8664e62fa6ac95456754fa0b44b78668ed0fa81a6806e4c9f78c1532c1ce50322d0d69fde3eef82ea68b93b507d - languageName: node - linkType: hard - -"p-map@npm:^7.0.2": - version: 7.0.3 - resolution: "p-map@npm:7.0.3" - checksum: 10c0/46091610da2b38ce47bcd1d8b4835a6fa4e832848a6682cf1652bc93915770f4617afc844c10a77d1b3e56d2472bb2d5622353fa3ead01a7f42b04fc8e744a5c - languageName: node - linkType: hard - -"p-pipe@npm:^3.0.0": - version: 3.1.0 - resolution: "p-pipe@npm:3.1.0" - checksum: 10c0/9b3076828ea7e9469c0f92c78fa44096726208d547efdb2d6148cbe135d1a70bd449de5be13e234dd669d9515343bd68527b316bf9d5639cee639e2fdde20aaf - languageName: node - linkType: hard - -"p-reduce@npm:^1.0.0": - version: 1.0.0 - resolution: "p-reduce@npm:1.0.0" - checksum: 10c0/dc0bd6fdcca7c317ea84a91f06bd2da2a809a7a48ed35a5d642731f3b3b1d37338b3ab31fd40d34932cb19a6479a4a2585f4ffb5aee4fdf7fe1bc663af5a1061 - languageName: node - linkType: hard - -"p-timeout@npm:^1.1.1": - version: 1.2.1 - resolution: "p-timeout@npm:1.2.1" - dependencies: - p-finally: "npm:^1.0.0" - checksum: 10c0/09177278c4bc060f9cc1d2f06bf0b8deac29acc53415c093dfd2cc7f4844526c5657a506eb7cd879b6a41c262742551dc2b0f3e90c047f2bd0354b7bd17a5d73 - languageName: node - linkType: hard - -"p-timeout@npm:^2.0.1": - version: 2.0.1 - resolution: "p-timeout@npm:2.0.1" - dependencies: - p-finally: "npm:^1.0.0" - checksum: 10c0/26f7baa19a9a60c694e73d2727d169b357bb91e91112dfe50daa513230573ddf157b2f2c1779fb66da0f84ae952d39969f70a0cb1818f7c109ad8d4df49f99a3 - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 10c0/62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10c0/c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 - languageName: node - linkType: hard - -"parse-json@npm:^2.2.0": - version: 2.2.0 - resolution: "parse-json@npm:2.2.0" - dependencies: - error-ex: "npm:^1.2.0" - checksum: 10c0/7a90132aa76016f518a3d5d746a21b3f1ad0f97a68436ed71b6f995b67c7151141f5464eea0c16c59aec9b7756519a0e3007a8f98cf3714632d509ec07736df6 - languageName: node - linkType: hard - -"parse-json@npm:^5.0.0": - version: 5.2.0 - resolution: "parse-json@npm:5.2.0" - dependencies: - "@babel/code-frame": "npm:^7.0.0" - error-ex: "npm:^1.3.1" - json-parse-even-better-errors: "npm:^2.3.0" - lines-and-columns: "npm:^1.1.6" - checksum: 10c0/77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 - languageName: node - linkType: hard - -"path-exists@npm:^2.0.0": - version: 2.1.0 - resolution: "path-exists@npm:2.1.0" - dependencies: - pinkie-promise: "npm:^2.0.0" - checksum: 10c0/87352f1601c085d5a6eb202f60e5c016c1b790bd0bc09398af446ed3f5c4510b4531ff99cf8acac2d91868886e792927b4292f768b35a83dce12588fb7cbb46e - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10c0/8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10c0/127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 - languageName: node - linkType: hard - -"path-key@npm:^2.0.0, path-key@npm:^2.0.1": - version: 2.0.1 - resolution: "path-key@npm:2.0.1" - checksum: 10c0/dd2044f029a8e58ac31d2bf34c34b93c3095c1481942960e84dd2faa95bbb71b9b762a106aead0646695330936414b31ca0bd862bf488a937ad17c8c5d73b32b - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10c0/748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10c0/11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10c0/32a13711a2a505616ae1cc1b5076801e453e7aae6ac40ab55b388bb91b9d0547a52f5aaceff710ea400205f18691120d4431e520afbe4266b836fadede15872d - languageName: node - linkType: hard - -"path-type@npm:^1.0.0": - version: 1.1.0 - resolution: "path-type@npm:1.1.0" - dependencies: - graceful-fs: "npm:^4.1.2" - pify: "npm:^2.0.0" - pinkie-promise: "npm:^2.0.0" - checksum: 10c0/2b8c348cb52bbc0c0568afa10a0a5d8f6233adfe5ae75feb56064f6aed6324ab74185c61c2545f4e52ca08acdc76005f615da4e127ed6eecb866002cf491f350 - languageName: node - linkType: hard - -"path-type@npm:^4.0.0": - version: 4.0.0 - resolution: "path-type@npm:4.0.0" - checksum: 10c0/666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c - languageName: node - linkType: hard - -"pathe@npm:^0.2.0": - version: 0.2.0 - resolution: "pathe@npm:0.2.0" - checksum: 10c0/4ea3bc19d421926d1e6b767ca5dc62fd8d053791f5f93b806ef64ea9c7c21071385429e12c0b1838129ae53904bfc6a243ac6890d3189fa5f45c417db49507cf - languageName: node - linkType: hard - -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 10c0/8a87e63f7a4afcfb0f9f77b39bb92374afc723418b9cb716ee4257689224171002e07768eeade4ecd0e86f1fa3d8f022994219fb45634f2dbd78c6803e452458 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": - version: 1.1.1 - resolution: "picocolors@npm:1.1.1" - checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 - languageName: node - linkType: hard - -"picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": - version: 2.3.1 - resolution: "picomatch@npm:2.3.1" - checksum: 10c0/26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be - languageName: node - linkType: hard - -"picomatch@npm:^4.0.2": - version: 4.0.2 - resolution: "picomatch@npm:4.0.2" - checksum: 10c0/7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc - languageName: node - linkType: hard - -"pify@npm:^2.0.0, pify@npm:^2.2.0, pify@npm:^2.3.0": - version: 2.3.0 - resolution: "pify@npm:2.3.0" - checksum: 10c0/551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc - languageName: node - linkType: hard - -"pify@npm:^3.0.0": - version: 3.0.0 - resolution: "pify@npm:3.0.0" - checksum: 10c0/fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 - languageName: node - linkType: hard - -"pify@npm:^4.0.1": - version: 4.0.1 - resolution: "pify@npm:4.0.1" - checksum: 10c0/6f9d404b0d47a965437403c9b90eca8bb2536407f03de165940e62e72c8c8b75adda5516c6b9b23675a5877cc0bcac6bdfb0ef0e39414cd2476d5495da40e7cf - languageName: node - linkType: hard - -"pinkie-promise@npm:^2.0.0": - version: 2.0.1 - resolution: "pinkie-promise@npm:2.0.1" - dependencies: - pinkie: "npm:^2.0.0" - checksum: 10c0/11b5e5ce2b090c573f8fad7b517cbca1bb9a247587306f05ae71aef6f9b2cd2b923c304aa9663c2409cfde27b367286179f1379bc4ec18a3fbf2bb0d473b160a - languageName: node - linkType: hard - -"pinkie@npm:^2.0.0": - version: 2.0.4 - resolution: "pinkie@npm:2.0.4" - checksum: 10c0/25228b08b5597da42dc384221aa0ce56ee0fbf32965db12ba838e2a9ca0193c2f0609c45551ee077ccd2060bf109137fdb185b00c6d7e0ed7e35006d20fdcbc6 - languageName: node - linkType: hard - -"pngquant-bin@npm:^6.0.0": - version: 6.0.1 - resolution: "pngquant-bin@npm:6.0.1" - dependencies: - bin-build: "npm:^3.0.0" - bin-wrapper: "npm:^4.0.1" - execa: "npm:^4.0.0" - bin: - pngquant: cli.js - checksum: 10c0/a2912d03799656f86bcf45c6dfdb8acb5e87ebf61eed0209027fbe9c99d3ef307f4ab8a2cb77390b4c3f3d12069185cf3f27fd187d9e30f2cce1b28e405bf9cb - languageName: node - linkType: hard - -"postcss@npm:^8.5.3": - version: 8.5.3 - resolution: "postcss@npm:8.5.3" - dependencies: - nanoid: "npm:^3.3.8" - picocolors: "npm:^1.1.1" - source-map-js: "npm:^1.2.1" - checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 - languageName: node - linkType: hard - -"preact@npm:^10.26.4": - version: 10.26.4 - resolution: "preact@npm:10.26.4" - checksum: 10c0/8abf64ec6f9773f0c4fb3746b7caa3d83e2de4d464928e7f64fc779c96ef9e135d23c1ade8d0923c9191f6d203d9f22bb92d8a50dc0f4f310073dfaa51a56922 - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: 10c0/b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd - languageName: node - linkType: hard - -"prepend-http@npm:^1.0.1": - version: 1.0.4 - resolution: "prepend-http@npm:1.0.4" - checksum: 10c0/c6c173ca439e58163ba7bea7cbba52a1ed11e3e3da1c048da296f37d4b7654f78f7304e03f76d5923f4b83af7e2d55533e0f79064209c75b743ccddee13904f8 - languageName: node - linkType: hard - -"prepend-http@npm:^2.0.0": - version: 2.0.0 - resolution: "prepend-http@npm:2.0.0" - checksum: 10c0/b023721ffd967728e3a25e3a80dd73827e9444e586800ab90a21b3a8e67f362d28023085406ad53a36db1e4d98cb10e43eb37d45c6b733140a9165ead18a0987 - languageName: node - linkType: hard - -"prettier@npm:^3.5.3": - version: 3.5.3 - resolution: "prettier@npm:3.5.3" - bin: - prettier: bin/prettier.cjs - checksum: 10c0/3880cb90b9dc0635819ab52ff571518c35bd7f15a6e80a2054c05dbc8a3aa6e74f135519e91197de63705bcb38388ded7e7230e2178432a1468005406238b877 - languageName: node - linkType: hard - -"proc-log@npm:^5.0.0": - version: 5.0.0 - resolution: "proc-log@npm:5.0.0" - checksum: 10c0/bbe5edb944b0ad63387a1d5b1911ae93e05ce8d0f60de1035b218cdcceedfe39dbd2c697853355b70f1a090f8f58fe90da487c85216bf9671f9499d1a897e9e3 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 10c0/bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10c0/9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 - languageName: node - linkType: hard - -"prop-types@npm:^15.6.2, prop-types@npm:^15.8.1": - version: 15.8.1 - resolution: "prop-types@npm:15.8.1" - dependencies: - loose-envify: "npm:^1.4.0" - object-assign: "npm:^4.1.1" - react-is: "npm:^16.13.1" - checksum: 10c0/59ece7ca2fb9838031d73a48d4becb9a7cc1ed10e610517c7d8f19a1e02fa47f7c27d557d8a5702bec3cfeccddc853579832b43f449e54635803f277b1c78077 - languageName: node - linkType: hard - -"proto-list@npm:~1.2.1": - version: 1.2.4 - resolution: "proto-list@npm:1.2.4" - checksum: 10c0/b9179f99394ec8a68b8afc817690185f3b03933f7b46ce2e22c1930dc84b60d09f5ad222beab4e59e58c6c039c7f7fcf620397235ef441a356f31f9744010e12 - languageName: node - linkType: hard - -"pseudomap@npm:^1.0.2": - version: 1.0.2 - resolution: "pseudomap@npm:1.0.2" - checksum: 10c0/5a91ce114c64ed3a6a553aa7d2943868811377388bb31447f9d8028271bae9b05b340fe0b6961a64e45b9c72946aeb0a4ab635e8f7cb3715ffd0ff2beeb6a679 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.2 - resolution: "pump@npm:3.0.2" - dependencies: - end-of-stream: "npm:^1.1.0" - once: "npm:^1.3.1" - checksum: 10c0/5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 - languageName: node - linkType: hard - -"query-string@npm:^5.0.1": - version: 5.1.1 - resolution: "query-string@npm:5.1.1" - dependencies: - decode-uri-component: "npm:^0.2.0" - object-assign: "npm:^4.1.0" - strict-uri-encode: "npm:^1.0.0" - checksum: 10c0/25adf37fe9a5b749da55ef91192d190163c44283826b425fa86eeb1fa567cf500a32afc2c602d4f661839d86ca49c2f8d49433b3c1b44b9129a37a5d3da55f89 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: 10c0/900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 - languageName: node - linkType: hard - -"rate-limiter-flexible@npm:^5.0.3": - version: 5.0.5 - resolution: "rate-limiter-flexible@npm:5.0.5" - checksum: 10c0/ae7cba6a46a2133bfbd310d3f83c65b3b732deab84e0c79b4fda78cd1d6578f69111bb37f09401ea45334eb75b8e40637ab0a8a9fd3efbb0b54084d6cd3b4ead - languageName: node - linkType: hard - -"react-dom@npm:^19.0.0": - version: 19.0.0 - resolution: "react-dom@npm:19.0.0" - dependencies: - scheduler: "npm:^0.25.0" - peerDependencies: - react: ^19.0.0 - checksum: 10c0/a36ce7ab507b237ae2759c984cdaad4af4096d8199fb65b3815c16825e5cfeb7293da790a3fc2184b52bfba7ba3ff31c058c01947aff6fd1a3701632aabaa6a9 - languageName: node - linkType: hard - -"react-icons@npm:^5.5.0": - version: 5.5.0 - resolution: "react-icons@npm:5.5.0" - peerDependencies: - react: "*" - checksum: 10c0/a24309bfc993c19cbcbfc928157e53a137851822779977b9588f6dd41ffc4d11ebc98b447f4039b0d309a858f0a42980f6bfb4477fb19f9f2d1bc2e190fcf79c - languageName: node - linkType: hard - -"react-is@npm:^16.13.1, react-is@npm:^16.7.0": - version: 16.13.1 - resolution: "react-is@npm:16.13.1" - checksum: 10c0/33977da7a5f1a287936a0c85639fec6ca74f4f15ef1e59a6bc20338fc73dc69555381e211f7a3529b8150a1f71e4225525b41b60b52965bda53ce7d47377ada1 - languageName: node - linkType: hard - -"react-is@npm:^19.0.0": - version: 19.0.0 - resolution: "react-is@npm:19.0.0" - checksum: 10c0/d1be8e8500cf04f76df71942a21ef3a71266397a383d7ec8885f35190df818d35c65efd35aed7be47a89ad99aaff2c52e0c4e39e8930844a6b997622e50625a8 - languageName: node - linkType: hard - -"react-router@npm:^7.4.0": - version: 7.4.0 - resolution: "react-router@npm:7.4.0" - dependencies: - "@types/cookie": "npm:^0.6.0" - cookie: "npm:^1.0.1" - set-cookie-parser: "npm:^2.6.0" - turbo-stream: "npm:2.4.0" - peerDependencies: - react: ">=18" - react-dom: ">=18" - peerDependenciesMeta: - react-dom: - optional: true - checksum: 10c0/9cf943d7854e1e4d068162efa9a61e2d06a5c679cf3272a867046cc97a6cc65c9744490f54e8fd77bbe2d114610a5cb285ceb3d3941b9b19ac6f63385ac0a89d - languageName: node - linkType: hard - -"react-toastify@npm:^11.0.5": - version: 11.0.5 - resolution: "react-toastify@npm:11.0.5" - dependencies: - clsx: "npm:^2.1.1" - peerDependencies: - react: ^18 || ^19 - react-dom: ^18 || ^19 - checksum: 10c0/50f5b81323ebb1957b2efd0963fac24aa1407155d16ab756ffd6d0f42f8af17e796b3958a9fce13e9d1b945d6c3a5a9ebf13529478474d8a2af4bf1dd0db67d2 - languageName: node - linkType: hard - -"react-transition-group@npm:^4.4.5": - version: 4.4.5 - resolution: "react-transition-group@npm:4.4.5" - dependencies: - "@babel/runtime": "npm:^7.5.5" - dom-helpers: "npm:^5.0.1" - loose-envify: "npm:^1.4.0" - prop-types: "npm:^15.6.2" - peerDependencies: - react: ">=16.6.0" - react-dom: ">=16.6.0" - checksum: 10c0/2ba754ba748faefa15f87c96dfa700d5525054a0141de8c75763aae6734af0740e77e11261a1e8f4ffc08fd9ab78510122e05c21c2d79066c38bb6861a886c82 - languageName: node - linkType: hard - -"react-virtualized-auto-sizer@npm:1.0.7": - version: 1.0.7 - resolution: "react-virtualized-auto-sizer@npm:1.0.7" - peerDependencies: - react: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - react-dom: ^15.3.0 || ^16.0.0-alpha || ^17.0.0 || ^18.0.0-rc - checksum: 10c0/91e8d7924bace7d1ba48f54580e14b2cfea71c7af6f5472d40f2d9499f85fa0e9a6712ee0ba60ff9dd3d7566593cb1e681e44aaeddd956e5a19b20a79f8c322a - languageName: node - linkType: hard - -"react-window@npm:1.8.7": - version: 1.8.7 - resolution: "react-window@npm:1.8.7" - dependencies: - "@babel/runtime": "npm:^7.0.0" - memoize-one: "npm:>=3.1.1 <6" - peerDependencies: - react: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - react-dom: ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 - checksum: 10c0/b36a5df21aa665db4a9674d37e933025c6dabc09ee38c364a8beba334e3aec9d3ab0d30dd18972c927dfb0a8e4ee8b0bf0822759d3181c578268e3523a097c01 - languageName: node - linkType: hard - -"react@npm:^19.0.0": - version: 19.0.0 - resolution: "react@npm:19.0.0" - checksum: 10c0/9cad8f103e8e3a16d15cb18a0d8115d8bd9f9e1ce3420310aea381eb42aa0a4f812cf047bb5441349257a05fba8a291515691e3cb51267279b2d2c3253f38471 - languageName: node - linkType: hard - -"read-pkg-up@npm:^1.0.1": - version: 1.0.1 - resolution: "read-pkg-up@npm:1.0.1" - dependencies: - find-up: "npm:^1.0.0" - read-pkg: "npm:^1.0.0" - checksum: 10c0/36c4fc8bd73edf77a4eeb497b6e43010819ea4aef64cbf8e393439fac303398751c5a299feab84e179a74507e3a1416e1ed033a888b1dac3463bf46d1765f7ac - languageName: node - linkType: hard - -"read-pkg@npm:^1.0.0": - version: 1.1.0 - resolution: "read-pkg@npm:1.1.0" - dependencies: - load-json-file: "npm:^1.0.0" - normalize-package-data: "npm:^2.3.2" - path-type: "npm:^1.0.0" - checksum: 10c0/51fce9f7066787dc7688ea7014324cedeb9f38daa7dace4f1147d526f22354a07189ef728710bc97e27fcf5ed3a03b68ad8b60afb4251984640b6f09c180d572 - languageName: node - linkType: hard - -"readable-stream@npm:^2.0.0, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5": - version: 2.3.8 - resolution: "readable-stream@npm:2.3.8" - dependencies: - core-util-is: "npm:~1.0.0" - inherits: "npm:~2.0.3" - isarray: "npm:~1.0.0" - process-nextick-args: "npm:~2.0.0" - safe-buffer: "npm:~5.1.1" - string_decoder: "npm:~1.1.1" - util-deprecate: "npm:~1.0.1" - checksum: 10c0/7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa - languageName: node - linkType: hard - -"redent@npm:^1.0.0": - version: 1.0.0 - resolution: "redent@npm:1.0.0" - dependencies: - indent-string: "npm:^2.1.0" - strip-indent: "npm:^1.0.1" - checksum: 10c0/9fa48d250d4e645acac9de57cb82dc29cd7f5f27257ec367461e3dd0c9f14c55f1c40fd3d9cf7f9a3ed337f209ad4e0370abfcf5cf75569ebd31c97a7949b8a2 - languageName: node - linkType: hard - -"regenerator-runtime@npm:^0.14.0": - version: 0.14.1 - resolution: "regenerator-runtime@npm:0.14.1" - checksum: 10c0/1b16eb2c4bceb1665c89de70dcb64126a22bc8eb958feef3cd68fe11ac6d2a4899b5cd1b80b0774c7c03591dc57d16631a7f69d2daa2ec98100e2f29f7ec4cc4 - languageName: node - linkType: hard - -"repeating@npm:^2.0.0": - version: 2.0.1 - resolution: "repeating@npm:2.0.1" - dependencies: - is-finite: "npm:^1.0.0" - checksum: 10c0/7f5cd293ec47d9c074ef0852800d5ff5c49028ce65242a7528d84f32bd2fe200b142930562af58c96d869c5a3046e87253030058e45231acaa129c1a7087d2e7 - languageName: node - linkType: hard - -"replace-ext@npm:^1.0.0": - version: 1.0.1 - resolution: "replace-ext@npm:1.0.1" - checksum: 10c0/9a9c3d68d0d31f20533ed23e9f6990cff8320cf357eebfa56c0d7b63746ae9f2d6267f3321e80e0bffcad854f710fc9a48dbcf7615579d767db69e9cd4a43168 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10c0/83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10c0/8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 - languageName: node - linkType: hard - -"resolve@npm:^1.10.0, resolve@npm:^1.19.0": - version: 1.22.10 - resolution: "resolve@npm:1.22.10" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/8967e1f4e2cc40f79b7e080b4582b9a8c5ee36ffb46041dccb20e6461161adf69f843b43067b4a375de926a2cd669157e29a29578191def399dd5ef89a1b5203 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.19.0#optional!builtin": - version: 1.22.10 - resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin::version=1.22.10&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.16.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939 - languageName: node - linkType: hard - -"responselike@npm:1.0.2": - version: 1.0.2 - resolution: "responselike@npm:1.0.2" - dependencies: - lowercase-keys: "npm:^1.0.0" - checksum: 10c0/1c2861d1950790da96159ca490eda645130eaf9ccc4d76db20f685ba944feaf30f45714b4318f550b8cd72990710ad68355ff15c41da43ed9a93c102c0ffa403 - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10c0/59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.1.0 - resolution: "reusify@npm:1.1.0" - checksum: 10c0/4eff0d4a5f9383566c7d7ec437b671cc51b25963bd61bf127c3f3d3f68e44a026d99b8d2f1ad344afff8d278a8fe70a8ea092650a716d22287e8bef7126bb2fa - languageName: node - linkType: hard - -"rimraf@npm:^2.5.4": - version: 2.7.1 - resolution: "rimraf@npm:2.7.1" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: ./bin.js - checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 - languageName: node - linkType: hard - -"rimraf@npm:^5.0.5": - version: 5.0.10 - resolution: "rimraf@npm:5.0.10" - dependencies: - glob: "npm:^10.3.7" - bin: - rimraf: dist/esm/bin.mjs - checksum: 10c0/7da4fd0e15118ee05b918359462cfa1e7fe4b1228c7765195a45b55576e8c15b95db513b8466ec89129666f4af45ad978a3057a02139afba1a63512a2d9644cc - languageName: node - linkType: hard - -"rollup-plugin-visualizer@npm:^5.14.0": - version: 5.14.0 - resolution: "rollup-plugin-visualizer@npm:5.14.0" - dependencies: - open: "npm:^8.4.0" - picomatch: "npm:^4.0.2" - source-map: "npm:^0.7.4" - yargs: "npm:^17.5.1" - peerDependencies: - rolldown: 1.x - rollup: 2.x || 3.x || 4.x - peerDependenciesMeta: - rolldown: - optional: true - rollup: - optional: true - bin: - rollup-plugin-visualizer: dist/bin/cli.js - checksum: 10c0/ec6ca9ed125bce9994ba49a340bda730661d8e8dc5c5dc014dc757185182e1eda49c6708f990cb059095e71a3741a5248f1e6ba0ced7056020692888e06b1ddf - languageName: node - linkType: hard - -"rollup@npm:^4.30.1": - version: 4.36.0 - resolution: "rollup@npm:4.36.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.36.0" - "@rollup/rollup-android-arm64": "npm:4.36.0" - "@rollup/rollup-darwin-arm64": "npm:4.36.0" - "@rollup/rollup-darwin-x64": "npm:4.36.0" - "@rollup/rollup-freebsd-arm64": "npm:4.36.0" - "@rollup/rollup-freebsd-x64": "npm:4.36.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.36.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.36.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.36.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.36.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.36.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.36.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.36.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.36.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.36.0" - "@rollup/rollup-linux-x64-musl": "npm:4.36.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.36.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.36.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.36.0" - "@types/estree": "npm:1.0.6" - fsevents: "npm:~2.3.2" - dependenciesMeta: - "@rollup/rollup-android-arm-eabi": - optional: true - "@rollup/rollup-android-arm64": - optional: true - "@rollup/rollup-darwin-arm64": - optional: true - "@rollup/rollup-darwin-x64": - optional: true - "@rollup/rollup-freebsd-arm64": - optional: true - "@rollup/rollup-freebsd-x64": - optional: true - "@rollup/rollup-linux-arm-gnueabihf": - optional: true - "@rollup/rollup-linux-arm-musleabihf": - optional: true - "@rollup/rollup-linux-arm64-gnu": - optional: true - "@rollup/rollup-linux-arm64-musl": - optional: true - "@rollup/rollup-linux-loongarch64-gnu": - optional: true - "@rollup/rollup-linux-powerpc64le-gnu": - optional: true - "@rollup/rollup-linux-riscv64-gnu": - optional: true - "@rollup/rollup-linux-s390x-gnu": - optional: true - "@rollup/rollup-linux-x64-gnu": - optional: true - "@rollup/rollup-linux-x64-musl": - optional: true - "@rollup/rollup-win32-arm64-msvc": - optional: true - "@rollup/rollup-win32-ia32-msvc": - optional: true - "@rollup/rollup-win32-x64-msvc": - optional: true - fsevents: - optional: true - bin: - rollup: dist/bin/rollup - checksum: 10c0/52ad34ba18edb3613253ecbc7db5c8d6067ed103d8786051e96d42bcb383f7473bbda91b25297435b8a531fe308726cf1bb978456b9fcce044e4885510d73252 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10c0/200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 - languageName: node - linkType: hard - -"rxjs@npm:^7.8.1": - version: 7.8.2 - resolution: "rxjs@npm:7.8.2" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/1fcd33d2066ada98ba8f21fcbbcaee9f0b271de1d38dc7f4e256bfbc6ffcdde68c8bfb69093de7eeb46f24b1fb820620bf0223706cff26b4ab99a7ff7b2e2c45 - languageName: node - linkType: hard - -"safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 - languageName: node - linkType: hard - -"safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": - version: 5.1.2 - resolution: "safe-buffer@npm:5.1.2" - checksum: 10c0/780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 - languageName: node - linkType: hard - -"scheduler@npm:^0.25.0": - version: 0.25.0 - resolution: "scheduler@npm:0.25.0" - checksum: 10c0/a4bb1da406b613ce72c1299db43759526058fdcc413999c3c3e0db8956df7633acf395cb20eb2303b6a65d658d66b6585d344460abaee8080b4aa931f10eaafe - languageName: node - linkType: hard - -"seek-bzip@npm:^1.0.5": - version: 1.0.6 - resolution: "seek-bzip@npm:1.0.6" - dependencies: - commander: "npm:^2.8.1" - bin: - seek-bunzip: bin/seek-bunzip - seek-table: bin/seek-bzip-table - checksum: 10c0/e4019e4498bb725ff855603595c4116ca003674b13d29cb9ed9891b2ceec884ccf7c1cb5dba0d6b50fe6ce760a011078f5744efb79823f4ddb9decb1571e9912 - languageName: node - linkType: hard - -"semver-regex@npm:^2.0.0": - version: 2.0.0 - resolution: "semver-regex@npm:2.0.0" - checksum: 10c0/6b02b142ecfe4162d35ada5665c3e3b884e88268a7be6547fe9a47e7e0968596886e74d2ac0b193d1fed539cf07c313a73c9ba9fc7858f5fd169cb2c1cbe8d69 - languageName: node - linkType: hard - -"semver-truncate@npm:^1.1.2": - version: 1.1.2 - resolution: "semver-truncate@npm:1.1.2" - dependencies: - semver: "npm:^5.3.0" - checksum: 10c0/7736544ea5b4c5d5bb0132751e27870f9c057117d2eca99da6ae77bbc6ec36dc474eec9bdd5e9a345d06125332451b16584309c0954e518639b122e4f419601e - languageName: node - linkType: hard - -"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0, semver@npm:^5.5.0, semver@npm:^5.6.0": - version: 5.7.2 - resolution: "semver@npm:5.7.2" - bin: - semver: bin/semver - checksum: 10c0/e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 - languageName: node - linkType: hard - -"semver@npm:^6.0.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10c0/e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.6.0": - version: 7.7.1 - resolution: "semver@npm:7.7.1" - bin: - semver: bin/semver.js - checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 - languageName: node - linkType: hard - -"set-cookie-parser@npm:^2.6.0": - version: 2.7.1 - resolution: "set-cookie-parser@npm:2.7.1" - checksum: 10c0/060c198c4c92547ac15988256f445eae523f57f2ceefeccf52d30d75dedf6bff22b9c26f756bd44e8e560d44ff4ab2130b178bd2e52ef5571bf7be3bd7632d9a - languageName: node - linkType: hard - -"shebang-command@npm:^1.2.0": - version: 1.2.0 - resolution: "shebang-command@npm:1.2.0" - dependencies: - shebang-regex: "npm:^1.0.0" - checksum: 10c0/7b20dbf04112c456b7fc258622dafd566553184ac9b6938dd30b943b065b21dabd3776460df534cc02480db5e1b6aec44700d985153a3da46e7db7f9bd21326d - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10c0/a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e - languageName: node - linkType: hard - -"shebang-regex@npm:^1.0.0": - version: 1.0.0 - resolution: "shebang-regex@npm:1.0.0" - checksum: 10c0/9abc45dee35f554ae9453098a13fdc2f1730e525a5eb33c51f096cc31f6f10a4b38074c1ebf354ae7bffa7229506083844008dfc3bb7818228568c0b2dc1fff2 - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10c0/1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 - languageName: node - linkType: hard - -"shell-quote@npm:^1.8.1": - version: 1.8.2 - resolution: "shell-quote@npm:1.8.2" - checksum: 10c0/85fdd44f2ad76e723d34eb72c753f04d847ab64e9f1f10677e3f518d0e5b0752a176fd805297b30bb8c3a1556ebe6e77d2288dbd7b7b0110c7e941e9e9c20ce1 - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10c0/41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 - languageName: node - linkType: hard - -"simple-code-frame@npm:^1.3.0": - version: 1.3.0 - resolution: "simple-code-frame@npm:1.3.0" - dependencies: - kolorist: "npm:^1.6.0" - checksum: 10c0/f74332d839689b30deddc079f52845c05e455160888c2076056dd070d0088b8e84a0f36b6d273d38a8698e738dc5f34bbe6ecdcc86146b9d4250c67374f975c5 - languageName: node - linkType: hard - -"slash@npm:^3.0.0": - version: 3.0.0 - resolution: "slash@npm:3.0.0" - checksum: 10c0/e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10c0/a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.5 - resolution: "socks-proxy-agent@npm:8.0.5" - dependencies: - agent-base: "npm:^7.1.2" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10c0/5d2c6cecba6821389aabf18728325730504bf9bb1d9e342e7987a5d13badd7a98838cc9a55b8ed3cb866ad37cc23e1086f09c4d72d93105ce9dfe76330e9d2a6 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.4 - resolution: "socks@npm:2.8.4" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10c0/00c3271e233ccf1fb83a3dd2060b94cc37817e0f797a93c560b9a7a86c4a0ec2961fb31263bdd24a3c28945e24868b5f063cd98744171d9e942c513454b50ae5 - languageName: node - linkType: hard - -"sort-keys-length@npm:^1.0.0": - version: 1.0.1 - resolution: "sort-keys-length@npm:1.0.1" - dependencies: - sort-keys: "npm:^1.0.0" - checksum: 10c0/4567d08aa859c7e48b7e2cba14a8ae09a100f6a3bd7cf5d21dccd808d6332c945b9a7e2230a95c16e0e6eac1a943cd050ae51a5d1b4c8ec4b1e89a5801be9aa2 - languageName: node - linkType: hard - -"sort-keys@npm:^1.0.0": - version: 1.1.2 - resolution: "sort-keys@npm:1.1.2" - dependencies: - is-plain-obj: "npm:^1.0.0" - checksum: 10c0/5dd383b0299a40277051f7498c3999520138e2eb50d422962f658738341c9e82349fad4a3024d5ba1a3122688fbaf958f2a472d4c53bade55515097c2ce15420 - languageName: node - linkType: hard - -"sort-keys@npm:^2.0.0": - version: 2.0.0 - resolution: "sort-keys@npm:2.0.0" - dependencies: - is-plain-obj: "npm:^1.0.0" - checksum: 10c0/c11a6313995cb67ccf35fed4b1f6734176cc1d1e350ee311c061a2340ada4f7e23b046db064d518b63adba98c0f763739920c59fb4659a0b8482ec7a1f255081 - languageName: node - linkType: hard - -"source-map-js@npm:^1.2.1": - version: 1.2.1 - resolution: "source-map-js@npm:1.2.1" - checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf - languageName: node - linkType: hard - -"source-map-support@npm:~0.5.20": - version: 0.5.21 - resolution: "source-map-support@npm:0.5.21" - dependencies: - buffer-from: "npm:^1.0.0" - source-map: "npm:^0.6.0" - checksum: 10c0/9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d - languageName: node - linkType: hard - -"source-map@npm:^0.5.7": - version: 0.5.7 - resolution: "source-map@npm:0.5.7" - checksum: 10c0/904e767bb9c494929be013017380cbba013637da1b28e5943b566031e29df04fba57edf3f093e0914be094648b577372bd8ad247fa98cfba9c600794cd16b599 - languageName: node - linkType: hard - -"source-map@npm:^0.6.0, source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 - languageName: node - linkType: hard - -"source-map@npm:^0.7.4": - version: 0.7.4 - resolution: "source-map@npm:0.7.4" - checksum: 10c0/dc0cf3768fe23c345ea8760487f8c97ef6fca8a73c83cd7c9bf2fde8bc2c34adb9c0824d6feb14bc4f9e37fb522e18af621543f1289038a66ac7586da29aa7dc - languageName: node - linkType: hard - -"spdx-correct@npm:^3.0.0": - version: 3.2.0 - resolution: "spdx-correct@npm:3.2.0" - dependencies: - spdx-expression-parse: "npm:^3.0.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 - languageName: node - linkType: hard - -"spdx-exceptions@npm:^2.1.0": - version: 2.5.0 - resolution: "spdx-exceptions@npm:2.5.0" - checksum: 10c0/37217b7762ee0ea0d8b7d0c29fd48b7e4dfb94096b109d6255b589c561f57da93bf4e328c0290046115961b9209a8051ad9f525e48d433082fc79f496a4ea940 - languageName: node - linkType: hard - -"spdx-expression-parse@npm:^3.0.0": - version: 3.0.1 - resolution: "spdx-expression-parse@npm:3.0.1" - dependencies: - spdx-exceptions: "npm:^2.1.0" - spdx-license-ids: "npm:^3.0.0" - checksum: 10c0/6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 - languageName: node - linkType: hard - -"spdx-license-ids@npm:^3.0.0": - version: 3.0.21 - resolution: "spdx-license-ids@npm:3.0.21" - checksum: 10c0/ecb24c698d8496aa9efe23e0b1f751f8a7a89faedcdfcbfabae772b546c2db46ccde8f3bc447a238eb86bbcd4f73fea88720ef3b8394f7896381bec3d7736411 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10c0/09270dc4f30d479e666aee820eacd9e464215cdff53848b443964202bf4051490538e5dd1b42e1a65cf7296916ca17640aebf63dae9812749c7542ee5f288dec - languageName: node - linkType: hard - -"squeak@npm:^1.0.0": - version: 1.3.0 - resolution: "squeak@npm:1.3.0" - dependencies: - chalk: "npm:^1.0.0" - console-stream: "npm:^0.1.1" - lpad-align: "npm:^1.0.1" - checksum: 10c0/b1af7f037f732c9b6619625f98a65422d102a10a96d6e2096f18b2117d02ae9d7c3e90f24cac5a6fbf42d268602c4b7023e77cdf9039e0d3b6e52e9a16c5f084 - languageName: node - linkType: hard - -"ssri@npm:^12.0.0": - version: 12.0.0 - resolution: "ssri@npm:12.0.0" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10c0/caddd5f544b2006e88fa6b0124d8d7b28208b83c72d7672d5ade44d794525d23b540f3396108c4eb9280dcb7c01f0bef50682f5b4b2c34291f7c5e211fd1417d - languageName: node - linkType: hard - -"stable@npm:^0.1.8": - version: 0.1.8 - resolution: "stable@npm:0.1.8" - checksum: 10c0/df74b5883075076e78f8e365e4068ecd977af6c09da510cfc3148a303d4b87bc9aa8f7c48feb67ed4ef970b6140bd9eabba2129e28024aa88df5ea0114cba39d - languageName: node - linkType: hard - -"stack-trace@npm:^1.0.0-pre2": - version: 1.0.0-pre2 - resolution: "stack-trace@npm:1.0.0-pre2" - checksum: 10c0/00caccc88bebfa42068fe236d6427257ca9fb87fef4afdf7d8b145df52310ae529ae94849dcc190ce2a41420db6cde1bbfb993e82c64b2b818b5b2bcb5a4f462 - languageName: node - linkType: hard - -"strict-uri-encode@npm:^1.0.0": - version: 1.1.0 - resolution: "strict-uri-encode@npm:1.1.0" - checksum: 10c0/eb8a4109ba2588239787389313ba58ec49e043d4c64a1d44716defe5821a68ae49abe0cdefed9946ca9fc2a4af7ecf321da92422b0a67258ec0a3638b053ae62 - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10c0/1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca - languageName: node - linkType: hard - -"string_decoder@npm:~1.1.1": - version: 1.1.1 - resolution: "string_decoder@npm:1.1.1" - dependencies: - safe-buffer: "npm:~5.1.0" - checksum: 10c0/b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10c0/1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 - languageName: node - linkType: hard - -"strip-ansi@npm:^3.0.0": - version: 3.0.1 - resolution: "strip-ansi@npm:3.0.1" - dependencies: - ansi-regex: "npm:^2.0.0" - checksum: 10c0/f6e7fbe8e700105dccf7102eae20e4f03477537c74b286fd22cfc970f139002ed6f0d9c10d0e21aa9ed9245e0fa3c9275930e8795c5b947da136e4ecb644a70f - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10c0/a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 - languageName: node - linkType: hard - -"strip-bom@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-bom@npm:2.0.0" - dependencies: - is-utf8: "npm:^0.2.0" - checksum: 10c0/4fcbb248af1d5c1f2d710022b7d60245077e7942079bfb7ef3fc8c1ae78d61e96278525ba46719b15ab12fced5c7603777105bc898695339d7c97c64d300ed0b - languageName: node - linkType: hard - -"strip-dirs@npm:^2.0.0": - version: 2.1.0 - resolution: "strip-dirs@npm:2.1.0" - dependencies: - is-natural-number: "npm:^4.0.1" - checksum: 10c0/073d6d08331ec2e87afc2c2535d7336fee1d63797384045e4ecb9908a5ac6615022ee000cc278d6bbc94147bed7350f7cf4657b6d18c377813f37e7ae329fb52 - languageName: node - linkType: hard - -"strip-eof@npm:^1.0.0": - version: 1.0.0 - resolution: "strip-eof@npm:1.0.0" - checksum: 10c0/f336beed8622f7c1dd02f2cbd8422da9208fae81daf184f73656332899978919d5c0ca84dc6cfc49ad1fc4dd7badcde5412a063cf4e0d7f8ed95a13a63f68f45 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 10c0/bddf8ccd47acd85c0e09ad7375409d81653f645fda13227a9d459642277c253d877b68f2e5e4d819fe75733b0e626bac7e954c04f3236f6d196f79c94fa4a96f - languageName: node - linkType: hard - -"strip-indent@npm:^1.0.1": - version: 1.0.1 - resolution: "strip-indent@npm:1.0.1" - dependencies: - get-stdin: "npm:^4.0.1" - bin: - strip-indent: cli.js - checksum: 10c0/671370d44105b63daf4582a42f0a0168d58a351f6558eb913d1ede05d0ad5f964548b99f15c63fa6c7415c3980aad72f28c62997fd98fbb6da2eee1051d3c21a - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10c0/9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd - languageName: node - linkType: hard - -"strip-outer@npm:^1.0.0": - version: 1.0.1 - resolution: "strip-outer@npm:1.0.1" - dependencies: - escape-string-regexp: "npm:^1.0.2" - checksum: 10c0/c0f38e6f37563d878a221b1c76f0822f180ec5fc39be5ada30ee637a7d5b59d19418093bad2b4db1e69c40d7a7a7ac50828afce07276cf3d51ac8965cb140dfb - languageName: node - linkType: hard - -"strnum@npm:^1.1.1": - version: 1.1.2 - resolution: "strnum@npm:1.1.2" - checksum: 10c0/a0fce2498fa3c64ce64a40dada41beb91cabe3caefa910e467dc0518ef2ebd7e4d10f8c2202a6104f1410254cae245066c0e94e2521fb4061a5cb41831952392 - languageName: node - linkType: hard - -"stylis@npm:4.2.0": - version: 4.2.0 - resolution: "stylis@npm:4.2.0" - checksum: 10c0/a7128ad5a8ed72652c6eba46bed4f416521bc9745a460ef5741edc725252cebf36ee45e33a8615a7057403c93df0866ab9ee955960792db210bb80abd5ac6543 - languageName: node - linkType: hard - -"supports-color@npm:^2.0.0": - version: 2.0.0 - resolution: "supports-color@npm:2.0.0" - checksum: 10c0/570e0b63be36cccdd25186350a6cb2eaad332a95ff162fa06d9499982315f2fe4217e69dd98e862fbcd9c81eaff300a825a1fe7bf5cc752e5b84dfed042b0dda - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 - languageName: node - linkType: hard - -"supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10c0/6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 - languageName: node - linkType: hard - -"svgo@npm:^2.1.0": - version: 2.8.0 - resolution: "svgo@npm:2.8.0" - dependencies: - "@trysound/sax": "npm:0.2.0" - commander: "npm:^7.2.0" - css-select: "npm:^4.1.3" - css-tree: "npm:^1.1.3" - csso: "npm:^4.2.0" - picocolors: "npm:^1.0.0" - stable: "npm:^0.1.8" - bin: - svgo: bin/svgo - checksum: 10c0/0741f5d5cad63111a90a0ce7a1a5a9013f6d293e871b75efe39addb57f29a263e45294e485a4d2ff9cc260a5d142c8b5937b2234b4ef05efdd2706fb2d360ecc - languageName: node - linkType: hard - -"tar-stream@npm:^1.5.2": - version: 1.6.2 - resolution: "tar-stream@npm:1.6.2" - dependencies: - bl: "npm:^1.0.0" - buffer-alloc: "npm:^1.2.0" - end-of-stream: "npm:^1.0.0" - fs-constants: "npm:^1.0.0" - readable-stream: "npm:^2.3.0" - to-buffer: "npm:^1.1.1" - xtend: "npm:^4.0.0" - checksum: 10c0/ab8528d2cc9ccd0906d1ce6d8089030b2c92a578c57645ff4971452c8c5388b34c7152c04ed64b8510d22a66ffaf0fee58bada7d6ab41ad1e816e31993d59cf3 - languageName: node - linkType: hard - -"tar@npm:^7.4.3": - version: 7.4.3 - resolution: "tar@npm:7.4.3" - dependencies: - "@isaacs/fs-minipass": "npm:^4.0.0" - chownr: "npm:^3.0.0" - minipass: "npm:^7.1.2" - minizlib: "npm:^3.0.1" - mkdirp: "npm:^3.0.1" - yallist: "npm:^5.0.0" - checksum: 10c0/d4679609bb2a9b48eeaf84632b6d844128d2412b95b6de07d53d8ee8baf4ca0857c9331dfa510390a0727b550fd543d4d1a10995ad86cdf078423fbb8d99831d - languageName: node - linkType: hard - -"temp-dir@npm:^1.0.0": - version: 1.0.0 - resolution: "temp-dir@npm:1.0.0" - checksum: 10c0/648669d5e154d1961217784c786acadccf0156519c19e0aceda7edc76f5bdfa32a40dd7f88ebea9238ed6e3dedf08b846161916c8947058c384761351be90a8e - languageName: node - linkType: hard - -"tempfile@npm:^2.0.0": - version: 2.0.0 - resolution: "tempfile@npm:2.0.0" - dependencies: - temp-dir: "npm:^1.0.0" - uuid: "npm:^3.0.1" - checksum: 10c0/f9d65d109b58b626ef3746ada9538c61fe6aa79b43d3d18dde0187fe9d844aeff730f5c33fa4540ad43f9ace877406788f9fa236879b5e98da5b300cfa06a9a7 - languageName: node - linkType: hard - -"terser@npm:^5.39.0": - version: 5.39.0 - resolution: "terser@npm:5.39.0" - dependencies: - "@jridgewell/source-map": "npm:^0.3.3" - acorn: "npm:^8.8.2" - commander: "npm:^2.20.0" - source-map-support: "npm:~0.5.20" - bin: - terser: bin/terser - checksum: 10c0/83326545ea1aecd6261030568b6191ccfa4cb6aa61d9ea41746a52479f50017a78b77e4725fbbc207c5df841ffa66a773c5ac33636e95c7ab94fe7e0379ae5c7 - languageName: node - linkType: hard - -"through@npm:^2.3.8": - version: 2.3.8 - resolution: "through@npm:2.3.8" - checksum: 10c0/4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc - languageName: node - linkType: hard - -"timed-out@npm:^4.0.0, timed-out@npm:^4.0.1": - version: 4.0.1 - resolution: "timed-out@npm:4.0.1" - checksum: 10c0/86f03ffce5b80c5a066e02e59e411d3fbbfcf242b19290ba76817b4180abd1b85558489586b6022b798fb1cf26fc644c0ce0efb9c271d67ec83fada4b9542a56 - languageName: node - linkType: hard - -"to-buffer@npm:^1.1.1": - version: 1.1.1 - resolution: "to-buffer@npm:1.1.1" - checksum: 10c0/fb9fc6a0103f2b06e2e01c3d291586d0148759d5584f35d0973376434d1b58bd6ee5df9273f0bb1190eb2a5747c894bf49fed571325a7ac10208a48f31736439 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10c0/487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 - languageName: node - linkType: hard - -"tree-kill@npm:^1.2.2": - version: 1.2.2 - resolution: "tree-kill@npm:1.2.2" - bin: - tree-kill: cli.js - checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 - languageName: node - linkType: hard - -"trim-newlines@npm:^1.0.0": - version: 1.0.0 - resolution: "trim-newlines@npm:1.0.0" - checksum: 10c0/ae859c83d0dbcbde32245509f7c51a4bc9696d56e080bc19acc95c4188381e34fba05a4b2fefb47b4ee4537150a11d57a0fd3cd1179837c06210795d7f62e795 - languageName: node - linkType: hard - -"trim-repeated@npm:^1.0.0": - version: 1.0.0 - resolution: "trim-repeated@npm:1.0.0" - dependencies: - escape-string-regexp: "npm:^1.0.2" - checksum: 10c0/89acada0142ed0cdb113615a3e82fdb09e7fdb0e3504ded62762dd935bc27debfcc38edefa497dc7145d8dc8602d40dd9eec891e0ea6c28fa0cc384200b692db - languageName: node - linkType: hard - -"ts-api-utils@npm:^2.0.1": - version: 2.1.0 - resolution: "ts-api-utils@npm:2.1.0" - peerDependencies: - typescript: ">=4.8.4" - checksum: 10c0/9806a38adea2db0f6aa217ccc6bc9c391ddba338a9fe3080676d0d50ed806d305bb90e8cef0276e793d28c8a929f400abb184ddd7ff83a416959c0f4d2ce754f - languageName: node - linkType: hard - -"tsconfck@npm:^3.0.3": - version: 3.1.5 - resolution: "tsconfck@npm:3.1.5" - peerDependencies: - typescript: ^5.0.0 - peerDependenciesMeta: - typescript: - optional: true - bin: - tsconfck: bin/tsconfck.js - checksum: 10c0/9b62cd85d5702aa23ea50ea578d7124f3d59cc4518fcc7eacc04f4f9c9c481f720738ff8351bd4472247c0723a17dfd01af95a5b60ad623cdb8727fbe4881847 - languageName: node - linkType: hard - -"tslib@npm:^2.1.0": - version: 2.8.1 - resolution: "tslib@npm:2.8.1" - checksum: 10c0/9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 - languageName: node - linkType: hard - -"tunnel-agent@npm:^0.6.0": - version: 0.6.0 - resolution: "tunnel-agent@npm:0.6.0" - dependencies: - safe-buffer: "npm:^5.0.1" - checksum: 10c0/4c7a1b813e7beae66fdbf567a65ec6d46313643753d0beefb3c7973d66fcec3a1e7f39759f0a0b4465883499c6dc8b0750ab8b287399af2e583823e40410a17a - languageName: node - linkType: hard - -"turbo-stream@npm:2.4.0": - version: 2.4.0 - resolution: "turbo-stream@npm:2.4.0" - checksum: 10c0/e68b2569f1f16e6e9633d090c6024b2ae9f0e97bfeacb572451ca3732e120ebbb546f3bc4afc717c46cb57b5aea6104e04ef497f9912eef6a7641e809518e98a - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: "npm:^1.2.1" - checksum: 10c0/7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 - languageName: node - linkType: hard - -"type-fest@npm:^0.11.0": - version: 0.11.0 - resolution: "type-fest@npm:0.11.0" - checksum: 10c0/d548325b34e6110ce28acb6404f797758404354b7edc7b767203741781d92739ee9f6188ca0ebc9d988a5d3f51d47c5295b0d777939913b74bb0eda8e62893f9 - languageName: node - linkType: hard - -"typesafe-i18n@npm:^5.26.2": - version: 5.26.2 - resolution: "typesafe-i18n@npm:5.26.2" - peerDependencies: - typescript: ">=3.5.1" - bin: - typesafe-i18n: cli/typesafe-i18n.mjs - checksum: 10c0/f13b13d54bf121701c85424de2d677f3d3e61c6b7160dffa681e3ffcbb2843ea10931d5842fcc382faed78bac727b234259e9fc767a44cd9dc1d64ddd8ddf397 - languageName: node - linkType: hard - -"typescript-eslint@npm:8.27.0": - version: 8.27.0 - resolution: "typescript-eslint@npm:8.27.0" - dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.27.0" - "@typescript-eslint/parser": "npm:8.27.0" - "@typescript-eslint/utils": "npm:8.27.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/f66f8311418b12bca751e8e1c68e42c638745765be40621b65f287a15dd58d4a71e3a0f80756d5c3cc9070a93bb1745887fce2260117e19e1b70f2804cefd351 - languageName: node - linkType: hard - -"typescript@npm:^5.8.2": - version: 5.8.2 - resolution: "typescript@npm:5.8.2" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5c4f6fbf1c6389b6928fe7b8fcd5dc73bb2d58cd4e3883f1d774ed5bd83b151cbac6b7ecf11723de56d4676daeba8713894b1e9af56174f2f9780ae7848ec3c6 - languageName: node - linkType: hard - -"typescript@patch:typescript@npm%3A^5.8.2#optional!builtin": - version: 5.8.2 - resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10c0/5448a08e595cc558ab321e49d4cac64fb43d1fa106584f6ff9a8d8e592111b373a995a1d5c7f3046211c8a37201eb6d0f1566f15cdb7a62a5e3be01d087848e2 - languageName: node - linkType: hard - -"unbzip2-stream@npm:^1.0.9": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: "npm:^5.2.1" - through: "npm:^2.3.8" - checksum: 10c0/2ea2048f3c9db3499316ccc1d95ff757017ccb6f46c812d7c42466247e3b863fb178864267482f7f178254214247779daf68e85f50bd7736c3c97ba2d58b910a - languageName: node - linkType: hard - -"undici-types@npm:~6.20.0": - version: 6.20.0 - resolution: "undici-types@npm:6.20.0" - checksum: 10c0/68e659a98898d6a836a9a59e6adf14a5d799707f5ea629433e025ac90d239f75e408e2e5ff086afc3cace26f8b26ee52155293564593fbb4a2f666af57fc59bf - languageName: node - linkType: hard - -"unique-filename@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-filename@npm:4.0.0" - dependencies: - unique-slug: "npm:^5.0.0" - checksum: 10c0/38ae681cceb1408ea0587b6b01e29b00eee3c84baee1e41fd5c16b9ed443b80fba90c40e0ba69627e30855570a34ba8b06702d4a35035d4b5e198bf5a64c9ddc - languageName: node - linkType: hard - -"unique-slug@npm:^5.0.0": - version: 5.0.0 - resolution: "unique-slug@npm:5.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10c0/d324c5a44887bd7e105ce800fcf7533d43f29c48757ac410afd42975de82cc38ea2035c0483f4de82d186691bf3208ef35c644f73aa2b1b20b8e651be5afd293 - languageName: node - linkType: hard - -"universalify@npm:^2.0.0": - version: 2.0.1 - resolution: "universalify@npm:2.0.1" - checksum: 10c0/73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.1": - version: 1.1.3 - resolution: "update-browserslist-db@npm:1.1.3" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.1" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10c0/682e8ecbf9de474a626f6462aa85927936cdd256fe584c6df2508b0df9f7362c44c957e9970df55dfe44d3623807d26316ea2c7d26b80bb76a16c56c37233c32 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10c0/4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c - languageName: node - linkType: hard - -"url-parse-lax@npm:^1.0.0": - version: 1.0.0 - resolution: "url-parse-lax@npm:1.0.0" - dependencies: - prepend-http: "npm:^1.0.1" - checksum: 10c0/7578d90d18297c0896ab3c98350b61b59be56211baad543ea55eb570dfbd403b0987e499a817abb55d755df6f47ec2e748a49bd09f8d39766066a6871853cea1 - languageName: node - linkType: hard - -"url-parse-lax@npm:^3.0.0": - version: 3.0.0 - resolution: "url-parse-lax@npm:3.0.0" - dependencies: - prepend-http: "npm:^2.0.0" - checksum: 10c0/16f918634d41a4fab9e03c5f9702968c9930f7c29aa1a8c19a6dc01f97d02d9b700ab9f47f8da0b9ace6e0c0e99c27848994de1465b494bced6940c653481e55 - languageName: node - linkType: hard - -"url-to-options@npm:^1.0.1": - version: 1.0.1 - resolution: "url-to-options@npm:1.0.1" - checksum: 10c0/3d8143bbc2ab0ead3cbc0c60803c274847bf69aa3ef8b2b77a7d58b1739de01efbfbcd7d7b15c8b6b540bb266ae10895a50a1477ce2d9895dfa2c67243e39c51 - languageName: node - linkType: hard - -"util-deprecate@npm:~1.0.1": - version: 1.0.2 - resolution: "util-deprecate@npm:1.0.2" - checksum: 10c0/41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 - languageName: node - linkType: hard - -"uuid@npm:^3.0.1": - version: 3.4.0 - resolution: "uuid@npm:3.4.0" - bin: - uuid: ./bin/uuid - checksum: 10c0/1c13950df865c4f506ebfe0a24023571fa80edf2e62364297a537c80af09c618299797bbf2dbac6b1f8ae5ad182ba474b89db61e0e85839683991f7e08795347 - languageName: node - linkType: hard - -"validate-npm-package-license@npm:^3.0.1": - version: 3.0.4 - resolution: "validate-npm-package-license@npm:3.0.4" - dependencies: - spdx-correct: "npm:^3.0.0" - spdx-expression-parse: "npm:^3.0.0" - checksum: 10c0/7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f - languageName: node - linkType: hard - -"vite-plugin-imagemin@npm:^0.6.1": - version: 0.6.1 - resolution: "vite-plugin-imagemin@npm:0.6.1" - dependencies: - "@types/imagemin": "npm:^7.0.1" - "@types/imagemin-gifsicle": "npm:^7.0.1" - "@types/imagemin-jpegtran": "npm:^5.0.1" - "@types/imagemin-mozjpeg": "npm:^8.0.1" - "@types/imagemin-optipng": "npm:^5.2.1" - "@types/imagemin-svgo": "npm:^10.0.0" - "@types/imagemin-webp": "npm:^7.0.0" - "@types/svgo": "npm:^2.6.1" - chalk: "npm:^4.1.2" - debug: "npm:^4.3.3" - esbuild: "npm:^0.14.14" - fs-extra: "npm:^10.0.0" - gifsicle: "npm:5.2.0" - imagemin: "npm:^7.0.1" - imagemin-gifsicle: "npm:^7.0.0" - imagemin-jpegtran: "npm:^7.0.0" - imagemin-mozjpeg: "npm:^9.0.0" - imagemin-optipng: "npm:^8.0.0" - imagemin-pngquant: "npm:^9.0.2" - imagemin-svgo: "npm:^9.0.0" - imagemin-webp: "npm:^6.0.0" - jpegtran-bin: "npm:^6.0.1" - pathe: "npm:^0.2.0" - peerDependencies: - vite: ">=2.0.0" - checksum: 10c0/cdb387d6c02a1efc91e360727672644738ddaa696f7a90ccff181422111f8539cd98970cb296515e99fa049b2396dbe89245eca599fb6f46dcf012daaee73f9e - languageName: node - linkType: hard - -"vite-prerender-plugin@npm:^0.5.3": - version: 0.5.7 - resolution: "vite-prerender-plugin@npm:0.5.7" - dependencies: - kolorist: "npm:^1.8.0" - magic-string: "npm:^0.30.6" - node-html-parser: "npm:^6.1.12" - simple-code-frame: "npm:^1.3.0" - source-map: "npm:^0.7.4" - stack-trace: "npm:^1.0.0-pre2" - checksum: 10c0/77005008315d39d5bb87f7462046cc08b074388f900905678ce9782378bf4c8ca6ea5c0321506403b8f22fe6edd55c49cc423903ce545fefd0d4f046f06823cb - languageName: node - linkType: hard - -"vite-tsconfig-paths@npm:^5.1.4": - version: 5.1.4 - resolution: "vite-tsconfig-paths@npm:5.1.4" - dependencies: - debug: "npm:^4.1.1" - globrex: "npm:^0.1.2" - tsconfck: "npm:^3.0.3" - peerDependencies: - vite: "*" - peerDependenciesMeta: - vite: - optional: true - checksum: 10c0/6228f23155ea25d92b1e1702284cf8dc52ad3c683c5ca691edd5a4c82d2913e7326d00708cef1cbfde9bb226261df0e0a12e03ef1d43b6a92d8f02b483ef37e3 - languageName: node - linkType: hard - -"vite@npm:^6.2.2": - version: 6.2.2 - resolution: "vite@npm:6.2.2" - dependencies: - esbuild: "npm:^0.25.0" - fsevents: "npm:~2.3.3" - postcss: "npm:^8.5.3" - rollup: "npm:^4.30.1" - peerDependencies: - "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: ">=1.21.0" - less: "*" - lightningcss: ^1.21.0 - sass: "*" - sass-embedded: "*" - stylus: "*" - sugarss: "*" - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - dependenciesMeta: - fsevents: - optional: true - peerDependenciesMeta: - "@types/node": - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - bin: - vite: bin/vite.js - checksum: 10c0/52f5b1c10cfe5e3b6382c6de1811ebbf76df9b5a8bab3d65169446c6b54a5f1528f775b1548009a6d8aad11def20fba046bb3e9abb10c0c2c9ccd78118623bb8 - languageName: node - linkType: hard - -"which@npm:^1.2.9": - version: 1.3.1 - resolution: "which@npm:1.3.1" - dependencies: - isexe: "npm:^2.0.0" - bin: - which: ./bin/which - checksum: 10c0/e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10c0/66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f - languageName: node - linkType: hard - -"which@npm:^5.0.0": - version: 5.0.0 - resolution: "which@npm:5.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10c0/e556e4cd8b7dbf5df52408c9a9dd5ac6518c8c5267c8953f5b0564073c66ed5bf9503b14d876d0e9c7844d4db9725fb0dcf45d6e911e17e26ab363dc3965ae7b - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.5": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10c0/e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10c0/d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10c0/138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10c0/56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 - languageName: node - linkType: hard - -"xtend@npm:^4.0.0": - version: 4.0.2 - resolution: "xtend@npm:4.0.2" - checksum: 10c0/366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10c0/4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 - languageName: node - linkType: hard - -"yallist@npm:^2.1.2": - version: 2.1.2 - resolution: "yallist@npm:2.1.2" - checksum: 10c0/0b9e25aa00adf19e01d2bcd4b208aee2b0db643d9927131797b7af5ff69480fc80f1c3db738cbf3946f0bddf39d8f2d0a5709c644fd42d4aa3a4e6e786c087b5 - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10c0/2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a - languageName: node - linkType: hard - -"yallist@npm:^5.0.0": - version: 5.0.0 - resolution: "yallist@npm:5.0.0" - checksum: 10c0/a499c81ce6d4a1d260d4ea0f6d49ab4da09681e32c3f0472dee16667ed69d01dae63a3b81745a24bd78476ec4fcf856114cb4896ace738e01da34b2c42235416 - languageName: node - linkType: hard - -"yaml@npm:^1.10.0": - version: 1.10.2 - resolution: "yaml@npm:1.10.2" - checksum: 10c0/5c28b9eb7adc46544f28d9a8d20c5b3cb1215a886609a2fd41f51628d8aaa5878ccd628b755dbcd29f6bb4921bd04ffbc6dcc370689bb96e594e2f9813d2605f - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10c0/f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 - languageName: node - linkType: hard - -"yargs@npm:^17.5.1, yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10c0/ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 - languageName: node - linkType: hard - -"yauzl@npm:^2.4.2": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" - dependencies: - buffer-crc32: "npm:~0.2.3" - fd-slicer: "npm:~1.1.0" - checksum: 10c0/f265002af7541b9ec3589a27f5fb8f11cf348b53cc15e2751272e3c062cd73f3e715bc72d43257de71bbaecae446c3f1b14af7559e8ab0261625375541816422 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10c0/dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f - languageName: node - linkType: hard diff --git a/lib/PButton/PButon.cpp b/lib/PButton/PButon.cpp index 00c9c7058..0b0ece9f1 100644 --- a/lib/PButton/PButon.cpp +++ b/lib/PButton/PButon.cpp @@ -23,10 +23,10 @@ // Constructor PButton::PButton() { // Initialization of default properties - Debounce_ = 40; // Debounce period to prevent flickering when pressing or releasing the button (in ms) - DblClickDelay_ = 250; // Max period between clicks for a double click event (in ms) - LongPressDelay_ = 750; // Hold period for a long press event (in ms) - VLongPressDelay_ = 3000; // Hold period for a very long press event (in ms) + Debounce_ = 40; // Debounce period to prevent flickering when pressing or releasing the button (in ms) + DblClickDelay_ = 250; // Max period between clicks for a double click event (in ms) + LongPressDelay_ = 9500; // Hold period for a long press event (in ms) + VLongPressDelay_ = 20000; // Hold period for a very long press event (in ms) cb_onClick = nullptr; cb_onDblClick = nullptr; @@ -54,7 +54,15 @@ bool PButton::init(uint8_t pin, bool pullMode) { pullMode_ = pullMode; // 1=HIGH (pullup) 0=LOW (pulldown) #if defined(ESP32) +#if CONFIG_IDF_TARGET_ESP32 + if (pin_ == 34 || pin_ == 35 || pin_ == 36 || pin_ == 39) { + pinMode(pin_, INPUT); + } else { + pinMode(pin_, pullMode ? INPUT_PULLUP : INPUT_PULLDOWN); + } +#else pinMode(pin_, pullMode ? INPUT_PULLUP : INPUT_PULLDOWN); +#endif #else // esp8266 and standalone pinMode(pin_, pullMode ? INPUT_PULLUP : INPUT); #endif @@ -93,7 +101,15 @@ bool PButton::check(void) { // make sure the pin is still input #if defined(ESP32) +#if CONFIG_IDF_TARGET_ESP32 + if (pin_ == 34 || pin_ == 35 || pin_ == 36 || pin_ == 39) { + pinMode(pin_, INPUT); + } else { + pinMode(pin_, pullMode_ ? INPUT_PULLUP : INPUT_PULLDOWN); + } +#else pinMode(pin_, pullMode_ ? INPUT_PULLUP : INPUT_PULLDOWN); +#endif #else // esp8266 and standalone pinMode(pin_, pullMode_ ? INPUT_PULLUP : INPUT); #endif diff --git a/lib/PButton/PButton.h b/lib/PButton/PButton.h index d7be73447..a7f85f9a0 100644 --- a/lib/PButton/PButton.h +++ b/lib/PButton/PButton.h @@ -36,6 +36,9 @@ class PButton { void onVLongPress(uint16_t, buttonEventHandler handler); bool init(uint8_t pin, bool pullMode); bool check(void); + bool button_busy() { + return buttonBusy_; + } private: uint16_t Debounce_; // Debounce period to prevent flickering when pressing or releasing the button (in ms) @@ -47,21 +50,21 @@ class PButton { bool pullMode_; bool enabled_; - bool state_; // Value read from button - bool lastState_; // Last value of button state - bool dblClickWaiting_; // whether we're waiting for a double click (down) - bool dblClickOnNextUp_; // whether to register a double click on next release, or whether to wait and click - bool singleClickOK_; // whether it's OK to do a single click + bool state_; // Value read from button + bool lastState_; // Last value of button state + bool dblClickWaiting_; // whether we're waiting for a double click (down) + bool dblClickOnNextUp_; // whether to register a double click on next release, or whether to wait and click + bool singleClickOK_; // whether it's OK to do a single click - uint32_t downTime_; // time the button was pressed down - uint32_t upTime_; // time the button was released + uint32_t downTime_; // time the button was pressed down + uint32_t upTime_; // time the button was released bool ignoreUP_; // whether to ignore the button release because the click+hold was triggered bool waitForUP_; // when held, whether to wait for the up event bool longPressHappened_; // whether or not the hold event happened already bool vLongPressHappened_; // whether or not the long hold event happened already - bool buttonBusy_; // false if idle + bool buttonBusy_; // false if idle buttonEventHandler cb_onClick, cb_onDblClick, cb_onLongPress, cb_onVLongPress; }; diff --git a/lib/eModbus/library.properties b/lib/eModbus/library.properties new file mode 100644 index 000000000..904bda3aa --- /dev/null +++ b/lib/eModbus/library.properties @@ -0,0 +1,9 @@ +name=eModbus +version=1.7.4 +author=bertmelis,Miq1 +maintainer=Miq1 +sentence=eModbus provides Modbus RTU, ASCII and TCP functions for ESP32. +paragraph=This library is non-blocking for the program using it. Modbus requests and responses will be returned to user-supplied callback functions. All Modbus function codes are supported implicitly, the codes specified by the Modbus specs are parameter-checked. +category=Communication +url=https://github.com/eModbus/eModbus +architectures=esp32,FreeRTOS diff --git a/lib/eModbus/src/CoilData.cpp b/lib/eModbus/src/CoilData.cpp index 8348080d5..42b7839a8 100644 --- a/lib/eModbus/src/CoilData.cpp +++ b/lib/eModbus/src/CoilData.cpp @@ -47,6 +47,8 @@ CoilData::~CoilData() { // Assignment operator CoilData& CoilData::operator=(const CoilData& m) { + // Avoid self-assignment + if (this == &m) return *this; // Remove old data if (CDbuffer) { delete CDbuffer; diff --git a/lib/eModbus/src/ModbusBridgeTemp.h b/lib/eModbus/src/ModbusBridgeTemp.h index 8bd2f039c..96fae9bb9 100644 --- a/lib/eModbus/src/ModbusBridgeTemp.h +++ b/lib/eModbus/src/ModbusBridgeTemp.h @@ -8,6 +8,7 @@ #include #include #include "ModbusClient.h" +#include "ModbusServer.h" #include "ModbusClientTCP.h" // Needed for client.setTarget() #include "RTUutils.h" // Needed for RTScallback @@ -29,7 +30,7 @@ public: ModbusBridge(); // Constructors for the RTU variant. Parameters as are for ModbusServerRTU - ModbusBridge(uint32_t timeout, int rtsPin = -1); + explicit ModbusBridge(uint32_t timeout, int rtsPin = -1); ModbusBridge(uint32_t timeout, RTScallback rts); // Destructor @@ -230,42 +231,56 @@ ModbusMessage ModbusBridge::bridgeWorker(ModbusMessage msg) { uint8_t aliasID = msg.getServerID(); uint8_t functionCode = msg.getFunctionCode(); ModbusMessage response; + bool foundServer = false; + uint8_t usableID = 255; // Find the (alias) serverID if (servers.find(aliasID) != servers.end()) { + foundServer = true; + usableID = aliasID; + } else { + if (servers.find(ANY_SERVER) != servers.end()) { + foundServer = true; + usableID = ANY_SERVER; + } + } + if (foundServer) { // Found it. We may use servers[aliasID] now without allocating a new map slot // Request filter hook to be called here - if (servers[aliasID]->requestFilter) { + if (servers[usableID]->requestFilter) { LOG_D("Calling request filter\n"); - msg = servers[aliasID]->requestFilter(msg); + msg = servers[usableID]->requestFilter(msg); } // Set real target server ID - msg.setServerID(servers[aliasID]->serverID); - - // Issue the request - LOG_D("Request (%02X/%02X) sent\n", servers[aliasID]->serverID, msg.getFunctionCode()); - // TCP servers have a target host/port that needs to be set in the client - if (servers[aliasID]->serverType == TCP_SERVER) { - response = reinterpret_cast(servers[aliasID]->client)->syncRequestMT(msg, (uint32_t)millis(), servers[aliasID]->host, servers[aliasID]->port); - } else { - response = servers[aliasID]->client->syncRequestM(msg, (uint32_t)millis()); + if (servers[usableID]->serverID != ANY_SERVER) { + msg.setServerID(servers[usableID]->serverID); } - // Response filter hook to be called here - if (servers[aliasID]->responseFilter) { - LOG_D("Calling response filter\n"); - response = servers[aliasID]->responseFilter(response); + // Issue the request + LOG_D("Request (%02X/%02X) sent\n", servers[usableID]->serverID, msg.getFunctionCode()); + // TCP servers have a target host/port that needs to be set in the client + if (servers[usableID]->serverType == TCP_SERVER) { + response = reinterpret_cast(servers[usableID]->client)->syncRequestMT(msg, (uint32_t)micros(), servers[usableID]->host, servers[usableID]->port); + } else { + response = servers[usableID]->client->syncRequestM(msg, (uint32_t)micros()); } // Re-set the requested server ID and function code (may have been modified by filters) response.setServerID(aliasID); + if (response.getError() != SUCCESS) { response.setFunctionCode(functionCode | 0x80); } else { response.setFunctionCode(functionCode); } + + // Response filter hook to be called here + if (servers[usableID]->responseFilter) { + LOG_D("Calling response filter\n"); + response = servers[usableID]->responseFilter(response); + } } else { // If we get here, something has gone wrong internally. We send back an error response anyway. response.setError(aliasID, functionCode, INVALID_SERVER); diff --git a/lib/eModbus/src/ModbusClient.cpp b/lib/eModbus/src/ModbusClient.cpp index d57c1397a..bd1f627ee 100644 --- a/lib/eModbus/src/ModbusClient.cpp +++ b/lib/eModbus/src/ModbusClient.cpp @@ -21,6 +21,13 @@ ModbusClient::ModbusClient() : onError(nullptr), onResponse(nullptr) { instanceCounter++; } +// Default destructor: reduce number of clients by one +ModbusClient::~ModbusClient() { + if (instanceCounter) { + instanceCounter--; + } +} + // onDataHandler: register callback for data responses bool ModbusClient::onDataHandler(MBOnData handler) { if (onData) { diff --git a/lib/eModbus/src/ModbusClient.h b/lib/eModbus/src/ModbusClient.h index 2025a1f28..3c9ec42e3 100644 --- a/lib/eModbus/src/ModbusClient.h +++ b/lib/eModbus/src/ModbusClient.h @@ -37,8 +37,8 @@ public: uint32_t getMessageCount(); // Informative: return number of messages created uint32_t getErrorCount(); // Informative: return number of errors received void resetCounts(); // Set both message and error counts to zero - inline Error addRequest(ModbusMessage m, uint32_t token) { return addRequestM(m, token); } - inline ModbusMessage syncRequest(ModbusMessage m, uint32_t token) { return syncRequestM(m, token); } + inline Error addRequest(const ModbusMessage& m, uint32_t token) { return addRequestM(m, token); } + inline ModbusMessage syncRequest(const ModbusMessage& m, uint32_t token) { return syncRequestM(m, token); } // Template function to generate syncRequest functions as long as there is a // matching ModbusMessage::setMessage() call @@ -85,7 +85,7 @@ public: protected: ModbusClient(); // Default constructor - virtual void isInstance() = 0; // Make class abstract + virtual ~ModbusClient(); // Destructor ModbusMessage waitSync(uint8_t serverID, uint8_t functionCode, uint32_t token); // wait for syncRequest response to arrive // Virtual addRequest variant needed internally. All others done by template! virtual Error addRequestM(ModbusMessage msg, uint32_t token) = 0; diff --git a/lib/eModbus/src/ModbusClientRTU.cpp b/lib/eModbus/src/ModbusClientRTU.cpp index 9052ab2c2..2520d83b7 100644 --- a/lib/eModbus/src/ModbusClientRTU.cpp +++ b/lib/eModbus/src/ModbusClientRTU.cpp @@ -86,7 +86,7 @@ void ModbusClientRTU::doBegin(uint32_t baudRate, int coreID, uint32_t userInterv char taskName[18]; snprintf(taskName, 18, "Modbus%02XRTU", instanceCounter); // Start task to handle the queue - xTaskCreatePinnedToCore((TaskFunction_t)&handleConnection, taskName, CLIENT_TASK_STACK, this, 6, &worker, coreID >= 0 ? coreID : NULL); + xTaskCreatePinnedToCore((TaskFunction_t)&handleConnection, taskName, CLIENT_TASK_STACK, this, 6, &worker, coreID >= 0 ? coreID : tskNO_AFFINITY); LOG_D("Client task %d started. Interval=%d\n", (uint32_t)worker, MR_interval); } @@ -151,6 +151,7 @@ void ModbusClientRTU::clearQueue() { std::queue empty; LOCK_GUARD(lockGuard, qLock); + // Empty queue std::swap(requests, empty); } @@ -342,8 +343,11 @@ void ModbusClientRTU::handleConnection(ModbusClientRTU *instance) { { // Safely lock the queue LOCK_GUARD(lockGuard, instance->qLock); - // Remove the front queue entry - instance->requests.pop(); + + // Remove the front queue entry if the queue is not empty + if (!instance->requests.empty()) { + instance->requests.pop(); + } } } else { delay(1); diff --git a/lib/eModbus/src/ModbusClientRTU.h b/lib/eModbus/src/ModbusClientRTU.h index 9f419ee34..280981cad 100644 --- a/lib/eModbus/src/ModbusClientRTU.h +++ b/lib/eModbus/src/ModbusClientRTU.h @@ -67,15 +67,15 @@ protected: uint32_t token; ModbusMessage msg; bool isSyncRequest; - RequestEntry(uint32_t t, ModbusMessage m, bool syncReq = false) : + RequestEntry(uint32_t t, const ModbusMessage& m, bool syncReq = false) : token(t), msg(m), isSyncRequest(syncReq) {} }; // Base addRequest and syncRequest must be present - Error addRequestM(ModbusMessage msg, uint32_t token); - ModbusMessage syncRequestM(ModbusMessage msg, uint32_t token); + Error addRequestM(ModbusMessage msg, uint32_t token) override; + ModbusMessage syncRequestM(ModbusMessage msg, uint32_t token) override; // addToQueue: send freshly created request to queue bool addToQueue(uint32_t token, ModbusMessage msg, bool syncReq = false); @@ -89,7 +89,6 @@ protected: // start background task void doBegin(uint32_t baudRate, int coreID, uint32_t userInterval); - void isInstance() { return; } // make class instantiable queue requests; // Queue to hold requests to be processed #if USE_MUTEX mutex qLock; // Mutex to protect queue diff --git a/lib/eModbus/src/ModbusClientTCP.cpp b/lib/eModbus/src/ModbusClientTCP.cpp index ec34a2d52..b6ea5d431 100644 --- a/lib/eModbus/src/ModbusClientTCP.cpp +++ b/lib/eModbus/src/ModbusClientTCP.cpp @@ -18,7 +18,8 @@ ModbusClientTCP::ModbusClientTCP(Client& client, uint16_t queueLimit) : MT_target(IPAddress(0, 0, 0, 0), 0, DEFAULTTIMEOUT, TARGETHOSTINTERVAL), MT_defaultTimeout(DEFAULTTIMEOUT), MT_defaultInterval(TARGETHOSTINTERVAL), - MT_qLimit(queueLimit) + MT_qLimit(queueLimit), + MT_timeoutsToClose(0) { } // Alternative Constructor takes reference to Client (EthernetClient or WiFiClient) plus initial target host @@ -29,7 +30,8 @@ ModbusClientTCP::ModbusClientTCP(Client& client, IPAddress host, uint16_t port, MT_target(host, port, DEFAULTTIMEOUT, TARGETHOSTINTERVAL), MT_defaultTimeout(DEFAULTTIMEOUT), MT_defaultInterval(TARGETHOSTINTERVAL), - MT_qLimit(queueLimit) + MT_qLimit(queueLimit), + MT_timeoutsToClose(0) { } // Destructor: clean up queue, task etc. @@ -64,7 +66,7 @@ void ModbusClientTCP::end() { // begin: start worker task #if IS_LINUX void *ModbusClientTCP::pHandle(void *p) { - handleConnection((ModbusClientTCP *)p); + handleConnection(static_cast(p)); return nullptr; } #endif @@ -84,7 +86,7 @@ void ModbusClientTCP::begin(int coreID) { char taskName[18]; snprintf(taskName, 18, "Modbus%02XTCP", instanceCounter); // Start task to handle the queue - xTaskCreatePinnedToCore((TaskFunction_t)&handleConnection, taskName, CLIENT_TASK_STACK, this, 5, &worker, coreID >= 0 ? coreID : NULL); + xTaskCreatePinnedToCore((TaskFunction_t)&handleConnection, taskName, CLIENT_TASK_STACK, this, 5, &worker, coreID >= 0 ? coreID : tskNO_AFFINITY); LOG_D("TCP client worker %s started\n", taskName); #endif } else { @@ -119,9 +121,25 @@ uint32_t ModbusClientTCP::pendingRequests() { void ModbusClientTCP::clearQueue() { std::queue empty; LOCK_GUARD(lockGuard, qLock); + // Delete queue entries if still on the queue + while (!requests.empty()) { + RequestEntry *re = requests.front(); + delete re; + requests.pop(); + } + // Now flush the queue std::swap(requests, empty); } +// Set number of timeouts to tolerate before a connection is forcibly closed. +// 0: never, 1..255: desired number +// Returns previous value. +uint8_t ModbusClientTCP::closeConnectionOnTimeouts(uint8_t n) { + uint8_t oldValue = MT_timeoutsToClose; + MT_timeoutsToClose = n; + return oldValue; +} + // Base addRequest for preformatted ModbusMessage and last set target Error ModbusClientTCP::addRequestM(ModbusMessage msg, uint32_t token) { Error rc = SUCCESS; // Return value @@ -225,6 +243,7 @@ bool ModbusClientTCP::addToQueue(uint32_t token, ModbusMessage request, TargetHo void ModbusClientTCP::handleConnection(ModbusClientTCP *instance) { bool doNotPop; unsigned long lastRequest = millis(); + uint16_t timeoutCount = 0; // Run time counter of consecutive timeouts. // Loop forever - or until task is killed while (1) { @@ -273,6 +292,8 @@ void ModbusClientTCP::handleConnection(ModbusClientTCP *instance) { // Did we get a normal response? if (response.getError()==SUCCESS) { LOG_D("Data response.\n"); + // Reset timeout counter + timeoutCount = 0; // Yes. Is it a synchronous request? if (request->isSyncRequest) { // Yes. Put the response into the response map @@ -299,6 +320,25 @@ void ModbusClientTCP::handleConnection(ModbusClientTCP *instance) { LOCK_GUARD(responseCnt, instance->countAccessM); instance->errorCount++; } + // Is it a TIMEOUT and do we need to track it? + if (response.getError()==TIMEOUT && instance->MT_timeoutsToClose) { + LOG_D("Checking timeout sequence\n"); + // Yes. First count timeout conter up + timeoutCount++; + // Is the count above the limit? + if (timeoutCount > instance->MT_timeoutsToClose) { + LOG_D("Timeouts: %d exceeding limit (%d), closing connection\n", + timeoutCount, instance->MT_timeoutsToClose); + // Yes. We need to cut the connection + instance->MT_client.stop(); + delay(1); + // reset timeout count + timeoutCount = 0; + } + } else { + // No TIMEOUT or no limit: reset timeout count + timeoutCount = 0; + } // Is it a synchronous request? if (request->isSyncRequest) { // Yes. Put the response into the response map @@ -345,8 +385,11 @@ void ModbusClientTCP::handleConnection(ModbusClientTCP *instance) { { // Safely lock the queue LOCK_GUARD(lockGuard, instance->qLock); - // Remove the front queue entry - instance->requests.pop(); + + // Remove the front queue entry if the queue is not empty + if (!instance->requests.empty()) { + instance->requests.pop(); + } // Delete request delete request; LOG_D("Request popped from queue.\n"); diff --git a/lib/eModbus/src/ModbusClientTCP.h b/lib/eModbus/src/ModbusClientTCP.h index 23f4af5c2..3e5e1bfe3 100644 --- a/lib/eModbus/src/ModbusClientTCP.h +++ b/lib/eModbus/src/ModbusClientTCP.h @@ -50,6 +50,11 @@ public: // Remove all pending request from queue void clearQueue(); + // Set number of timeouts to tolerate before a connection is forcibly closed. + // 0: never, 1..255: desired number + // Returns previous value. + uint8_t closeConnectionOnTimeouts(uint8_t n=3); + protected: // class describing a target server struct TargetHost { @@ -58,7 +63,7 @@ protected: uint32_t timeout; // Time in ms waiting for a response uint32_t interval; // Time in ms to wait between requests - inline TargetHost& operator=(TargetHost& t) { + inline TargetHost& operator=(const TargetHost& t) { host = t.host; port = t.port; timeout = t.timeout; @@ -66,7 +71,7 @@ protected: return *this; } - inline TargetHost(TargetHost& t) : + inline TargetHost(const TargetHost& t) : host(t.host), port(t.port), timeout(t.timeout), @@ -86,13 +91,13 @@ protected: interval(interval) { } - inline bool operator==(TargetHost& t) { + inline bool operator==(const TargetHost& t) { if (host != t.host) return false; if (port != t.port) return false; return true; } - inline bool operator!=(TargetHost& t) { + inline bool operator!=(const TargetHost& t) { if (host != t.host) return true; if (port != t.port) return true; return false; @@ -135,7 +140,7 @@ protected: } protected: - uint8_t headRoom[6]; // Buffer to hold MSB-first TCP header + uint8_t headRoom[6] = {0,0,0,0,0,0}; // Buffer to hold MSB-first TCP header }; struct RequestEntry { @@ -144,7 +149,7 @@ protected: TargetHost target; ModbusTCPhead head; bool isSyncRequest; - RequestEntry(uint32_t t, ModbusMessage m, TargetHost tg, bool syncReq = false) : + RequestEntry(uint32_t t, const ModbusMessage& m, TargetHost tg, bool syncReq = false) : token(t), msg(m), target(tg), @@ -153,8 +158,8 @@ protected: }; // Base addRequest and syncRequest must be present - Error addRequestM(ModbusMessage msg, uint32_t token); - ModbusMessage syncRequestM(ModbusMessage msg, uint32_t token); + Error addRequestM(ModbusMessage msg, uint32_t token) override; + ModbusMessage syncRequestM(ModbusMessage msg, uint32_t token) override; // TCP-specific addition "...MT()" including adhoc target - used by bridge Error addRequestMT(ModbusMessage msg, uint32_t token, IPAddress targetHost, uint16_t targetPort); ModbusMessage syncRequestMT(ModbusMessage msg, uint32_t token, IPAddress targetHost, uint16_t targetPort); @@ -174,7 +179,6 @@ protected: // receive: get response via Client connection ModbusMessage receive(RequestEntry *request); - void isInstance() { return; } // make class instantiable queue requests; // Queue to hold requests to be processed #if USE_MUTEX mutex qLock; // Mutex to protect queue @@ -185,6 +189,8 @@ protected: uint32_t MT_defaultTimeout; // Standard timeout value taken if no dedicated was set uint32_t MT_defaultInterval; // Standard interval value taken if no dedicated was set uint16_t MT_qLimit; // Maximum number of requests to accept in queue + uint8_t MT_timeoutsToClose; // 0: disregard, 1-255: number of timeouts to tolerate before + // forcibly closing a connection. // Let any ModbusBridge class use protected members template friend class ModbusBridge; diff --git a/lib/eModbus/src/ModbusClientTCPasync.cpp b/lib/eModbus/src/ModbusClientTCPasync.cpp index 163d552a0..949de2c49 100644 --- a/lib/eModbus/src/ModbusClientTCPasync.cpp +++ b/lib/eModbus/src/ModbusClientTCPasync.cpp @@ -223,19 +223,17 @@ void onAck(size_t len, uint32_t time) { } */ void ModbusClientTCPasync::onPacket(uint8_t* data, size_t length) { - LOG_D("packet received (len:%d)\n", length); + LOG_D("packet received (len:%u)\n", length); // reset idle timeout MTA_lastActivity = millis(); if (length) { - LOG_D("parsing (len:%d)\n", length + 1); + LOG_D("parsing (len:%u)\n", length + 1); } while (length > 0) { RequestEntry* request = nullptr; ModbusMessage* response = nullptr; uint16_t transactionID = 0; - uint16_t protocolID = 0; - uint16_t messageLength = 0; bool isOkay = false; // 1. Check for valid modbus message @@ -244,8 +242,8 @@ void ModbusClientTCPasync::onPacket(uint8_t* data, size_t length) { // total message should fit MBAP plus remaining bytes (in data[4], data[5]) if (length > 6) { transactionID = (data[0] << 8) | data[1]; - protocolID = (data[2] << 8) | data[3]; - messageLength = (data[4] << 8) | data[5]; + uint16_t protocolID = (data[2] << 8) | data[3]; + uint16_t messageLength = (data[4] << 8) | data[5]; if (protocolID == 0 && length >= (uint32_t)messageLength + 6 && messageLength < 256) { diff --git a/lib/eModbus/src/ModbusClientTCPasync.h b/lib/eModbus/src/ModbusClientTCPasync.h index a1f2aeea0..f0d49b8d5 100644 --- a/lib/eModbus/src/ModbusClientTCPasync.h +++ b/lib/eModbus/src/ModbusClientTCPasync.h @@ -83,7 +83,7 @@ protected: return headRoom; } - inline ModbusTCPhead& operator= (ModbusTCPhead& t) { + inline ModbusTCPhead& operator= (const ModbusTCPhead& t) { transactionID = t.transactionID; protocolID = t.protocolID; len = t.len; @@ -91,7 +91,7 @@ protected: } protected: - uint8_t headRoom[6]; // Buffer to hold MSB-first TCP header + uint8_t headRoom[6] = {0,0,0,0,0,0}; // Buffer to hold MSB-first TCP header }; struct RequestEntry { @@ -100,7 +100,7 @@ protected: ModbusTCPhead head; uint32_t sentTime; bool isSyncRequest; - RequestEntry(uint32_t t, ModbusMessage m, bool syncReq = false) : + RequestEntry(uint32_t t, const ModbusMessage& m, bool syncReq = false) : token(t), msg(m), head(ModbusTCPhead()), @@ -109,8 +109,8 @@ protected: }; // Base addRequest and syncRequest both must be present - Error addRequestM(ModbusMessage msg, uint32_t token); - ModbusMessage syncRequestM(ModbusMessage msg, uint32_t token); + Error addRequestM(ModbusMessage msg, uint32_t token) override; + ModbusMessage syncRequestM(ModbusMessage msg, uint32_t token) override; // addToQueue: send freshly created request to queue bool addToQueue(int32_t token, ModbusMessage request, bool syncReq = false); @@ -121,8 +121,6 @@ protected: // receive: get response via Client connection // TCPResponse* receive(uint8_t* data, size_t length); - void isInstance() { return; } // make class instantiable - // TCP handling code, all static taking a class instancs as param void onConnected(); void onDisconnected(); diff --git a/lib/eModbus/src/ModbusMessage.cpp b/lib/eModbus/src/ModbusMessage.cpp index 1ed48360d..7e63bdb95 100644 --- a/lib/eModbus/src/ModbusMessage.cpp +++ b/lib/eModbus/src/ModbusMessage.cpp @@ -6,6 +6,7 @@ #undef LOCAL_LOG_LEVEL // #define LOCAL_LOG_LEVEL LOG_LEVEL_ERROR #include "Logging.h" +#include // Default Constructor - takes optional size of MM_data to allocate memory ModbusMessage::ModbusMessage(uint16_t dataLen) { @@ -146,21 +147,19 @@ void ModbusMessage::setServerID(uint8_t serverID) { } void ModbusMessage::setFunctionCode(uint8_t FC) { - // We accept here that [0], [1] may allocate bytes! - if (MM_data.empty()) { - MM_data.reserve(3); // At least an error message should fit + if (MM_data.size() < 2) { + MM_data.resize(2); // Resize to at least 2 to ensure indices 0 and 1 are valid + MM_data[0] = 0; // Optional: Invalid server ID as a placeholder } - // No serverID set yet? use a 0 to initialize it to an error-generating value - if (MM_data.size() < 2) MM_data[0] = 0; // intentional invalid server ID! - MM_data[1] = FC; + MM_data[1] = FC; // Safely set the function code } // add() variant to copy a buffer into MM_data. Returns updated size uint16_t ModbusMessage::add(const uint8_t *arrayOfBytes, uint16_t count) { + uint16_t originalSize = MM_data.size(); + MM_data.resize(originalSize + count); // Copy it - while (count--) { - MM_data.push_back(*arrayOfBytes++); - } + std::copy(arrayOfBytes, arrayOfBytes + count, MM_data.begin() + originalSize); // Return updated size (logical length of message so far) return MM_data.size(); } @@ -181,7 +180,7 @@ uint8_t ModbusMessage::determineFloatOrder() { uint32_t i = 77230; // int value to go into a float without rounding error float f = i; // assign it uint8_t *b = (uint8_t *)&f; // Pointer to bytes of f - uint8_t expect[floatSize] = { 0x47, 0x96, 0xd7, 0x00 }; // IEEE754 representation + const uint8_t expect[floatSize] = { 0x47, 0x96, 0xd7, 0x00 }; // IEEE754 representation uint8_t matches = 0; // number of bytes successfully matched // Loop over the bytes of the expected sequence @@ -225,7 +224,7 @@ uint8_t ModbusMessage::determineDoubleOrder() { uint64_t i = 5791007487489389; // int64 value to go into a double without rounding error double f = i; // assign it uint8_t *b = (uint8_t *)&f; // Pointer to bytes of f - uint8_t expect[doubleSize] = { 0x43, 0x34, 0x92, 0xE4, 0x00, 0x2E, 0xF5, 0x6D }; // IEEE754 representation + const uint8_t expect[doubleSize] = { 0x43, 0x34, 0x92, 0xE4, 0x00, 0x2E, 0xF5, 0x6D }; // IEEE754 representation uint8_t matches = 0; // number of bytes successfully matched // Loop over the bytes of the expected sequence @@ -306,10 +305,7 @@ double ModbusMessage::swapDouble(double& f, int swapRule) { // add() variant for a vector of uint8_t uint16_t ModbusMessage::add(vector v) { - for (auto& b: v) { - MM_data.push_back(b); - } - return MM_data.size(); + return add(v.data(), v.size()); } // add() variants for float and double values diff --git a/lib/eModbus/src/ModbusServer.cpp b/lib/eModbus/src/ModbusServer.cpp index b814bd9b2..90cdcda49 100644 --- a/lib/eModbus/src/ModbusServer.cpp +++ b/lib/eModbus/src/ModbusServer.cpp @@ -30,7 +30,6 @@ MBSworker ModbusServer::getWorker(uint8_t serverID, uint8_t functionCode) { svmap = workerMap.find(ANY_SERVER); if (svmap != workerMap.end()) { serverFound = true; - serverID = ANY_SERVER; } } // Did we find a serverID? @@ -49,7 +48,6 @@ MBSworker ModbusServer::getWorker(uint8_t serverID, uint8_t functionCode) { if (fcmap != svmap->second.end()) { // Yes. Return the function pointer for it. functionCodeFound = true; - functionCode = ANY_FUNCTION_CODE; } } if (functionCodeFound) { @@ -104,6 +102,11 @@ bool ModbusServer::isServerFor(uint8_t serverID) { // Is there one? if (svmap != workerMap.end()) { return true; + } else { + svmap = workerMap.find(ANY_SERVER); + if (svmap != workerMap.end()) { + return true; + } } return false; } diff --git a/lib/eModbus/src/ModbusServer.h b/lib/eModbus/src/ModbusServer.h index 933e27e9c..70c88a6f9 100644 --- a/lib/eModbus/src/ModbusServer.h +++ b/lib/eModbus/src/ModbusServer.h @@ -68,15 +68,12 @@ protected: ModbusServer(); // Destructor - ~ModbusServer(); + virtual ~ModbusServer(); // Prevent copy construction or assignment ModbusServer(ModbusServer& other) = delete; ModbusServer& operator=(ModbusServer& other) = delete; - // Virtual function to prevent this class being instantiated - virtual void isInstance() = 0; - std::map> workerMap; // map on serverID->functionCode->worker function uint32_t messageCount; // Number of Requests processed uint32_t errorCount; // Number of errors responded diff --git a/lib/eModbus/src/ModbusServerEthernet.h b/lib/eModbus/src/ModbusServerEthernet.h index 0a8591031..c520c9f77 100644 --- a/lib/eModbus/src/ModbusServerEthernet.h +++ b/lib/eModbus/src/ModbusServerEthernet.h @@ -15,8 +15,8 @@ // Create own non-virtual EthernetServer class class EthernetServerEM : public EthernetServer { public: - EthernetServerEM(uint16_t port) : EthernetServer(port) { } - void begin(uint16_t port = 0) { } + explicit EthernetServerEM(uint16_t port) : EthernetServer(port) { } + void begin(uint16_t port = 0) override { } }; #include "ModbusServerTCPtemp.h" diff --git a/lib/eModbus/src/ModbusServerRTU.cpp b/lib/eModbus/src/ModbusServerRTU.cpp index 88859d8d3..f7e19eae2 100644 --- a/lib/eModbus/src/ModbusServerRTU.cpp +++ b/lib/eModbus/src/ModbusServerRTU.cpp @@ -94,7 +94,7 @@ void ModbusServerRTU::doBegin(uint32_t baudRate, int coreID, uint32_t userInterv snprintf(taskName, 18, "MBsrv%02XRTU", instanceCounter); // Start task to handle the client - xTaskCreatePinnedToCore((TaskFunction_t)&serve, taskName, SERVER_TASK_STACK, this, 8, &serverTask, coreID >= 0 ? coreID : NULL); + xTaskCreatePinnedToCore((TaskFunction_t)&serve, taskName, SERVER_TASK_STACK, this, 8, &serverTask, coreID >= 0 ? coreID : tskNO_AFFINITY); LOG_D("Server task %d started. Interval=%d\n", (uint32_t)serverTask, MSRinterval); } @@ -126,6 +126,12 @@ bool ModbusServerRTU::isModbusASCII() { return MSRuseASCII; } +// set timeout +void ModbusServerRTU::setModbusTimeout(unsigned long timeout) +{ + serverTimeout = timeout; +} + // Toggle skipping of leading 0x00 byte void ModbusServerRTU::skipLeading0x00(bool onOff) { MSRskipLeadingZeroByte = onOff; @@ -231,8 +237,8 @@ void ModbusServerRTU::serve(ModbusServerRTU *myServer) { response = m; } } else { - // No callback. Is at least the serverID valid and no broadcast? - if (myServer->isServerFor(request[0]) && request[0] != 0x00) { + // No callback. Is at least the serverID valid? + if (myServer->isServerFor(request[0])) { // Yes. Send back a ILLEGAL_FUNCTION error response.setError(request.getServerID(), request.getFunctionCode(), ILLEGAL_FUNCTION); } diff --git a/lib/eModbus/src/ModbusServerRTU.h b/lib/eModbus/src/ModbusServerRTU.h index fd5b8ab96..76c67b740 100644 --- a/lib/eModbus/src/ModbusServerRTU.h +++ b/lib/eModbus/src/ModbusServerRTU.h @@ -47,6 +47,9 @@ public: // Inquire protocol mode bool isModbusASCII(); + // set timeout + void setModbusTimeout(unsigned long timeout); + // Toggle skipping of leading 0x00 byte void skipLeading0x00(bool onOff = true); @@ -61,8 +64,6 @@ protected: ModbusServerRTU(ModbusServerRTU& m) = delete; ModbusServerRTU& operator=(ModbusServerRTU& m) = delete; - inline void isInstance() { } // Make class instantiable - // internal common begin function void doBegin(uint32_t baudRate, int coreID, uint32_t userInterval); diff --git a/lib/eModbus/src/ModbusServerTCPasync.cpp b/lib/eModbus/src/ModbusServerTCPasync.cpp index c08372454..e8d0a43dc 100644 --- a/lib/eModbus/src/ModbusServerTCPasync.cpp +++ b/lib/eModbus/src/ModbusServerTCPasync.cpp @@ -32,7 +32,7 @@ ModbusServerTCPasync::mb_client::~mb_client() { void ModbusServerTCPasync::mb_client::onData(uint8_t* data, size_t len) { lastActiveTime = millis(); - LOG_D("data len %d\n", len); + LOG_D("data len %u\n", len); Error error = SUCCESS; size_t i = 0; @@ -250,7 +250,7 @@ void ModbusServerTCPasync::onClientConnect(AsyncClient* client) { LOCK_GUARD(lock1, cListLock); if (clients.size() < maxNoClients) { clients.emplace_back(new mb_client(this, client)); - LOG_D("nr clients: %d\n", clients.size()); + LOG_D("nr clients: %u\n", clients.size()); } else { LOG_D("max number of clients reached, closing new\n"); client->close(true); @@ -264,5 +264,5 @@ void ModbusServerTCPasync::onClientDisconnect(mb_client* client) { clients.remove_if([client](mb_client* i) { return i->client == client->client; }); // delete client itself delete client; - LOG_D("nr clients: %d\n", clients.size()); + LOG_D("nr clients: %u\n", clients.size()); } diff --git a/lib/eModbus/src/ModbusServerTCPasync.h b/lib/eModbus/src/ModbusServerTCPasync.h index 410d8d6fb..4ae8ac3df 100644 --- a/lib/eModbus/src/ModbusServerTCPasync.h +++ b/lib/eModbus/src/ModbusServerTCPasync.h @@ -76,7 +76,6 @@ class ModbusServerTCPasync : public ModbusServer { bool isRunning(); protected: - inline void isInstance() { } void onClientConnect(AsyncClient* client); void onClientDisconnect(mb_client* client); diff --git a/lib/eModbus/src/ModbusServerTCPtemp.h b/lib/eModbus/src/ModbusServerTCPtemp.h index 7ae5b2bc9..56c1fa91d 100644 --- a/lib/eModbus/src/ModbusServerTCPtemp.h +++ b/lib/eModbus/src/ModbusServerTCPtemp.h @@ -44,8 +44,6 @@ protected: ModbusServerTCP(ModbusServerTCP& m) = delete; ModbusServerTCP& operator=(ModbusServerTCP& m) = delete; - inline void isInstance() { } - uint8_t numClients; TaskHandle_t serverTask; uint16_t serverPort; @@ -159,7 +157,7 @@ template snprintf(taskName, 18, "MBserve%04X", port); // Start task to handle the client - xTaskCreatePinnedToCore((TaskFunction_t)&serve, taskName, SERVER_TASK_STACK, this, 5, &serverTask, coreID >= 0 ? coreID : NULL); + xTaskCreatePinnedToCore((TaskFunction_t)&serve, taskName, SERVER_TASK_STACK, this, 5, &serverTask, coreID >= 0 ? coreID : tskNO_AFFINITY); LOG_D("Server task %s started (%d).\n", taskName, (uint32_t)serverTask); // Wait two seconds for it to establish @@ -206,7 +204,7 @@ bool ModbusServerTCP::accept(CT& client, uint32_t timeout, int coreID) { snprintf(taskName, 18, "MBsrv%02Xclnt", i); // Start task to handle the client - xTaskCreatePinnedToCore((TaskFunction_t)&worker, taskName, SERVER_TASK_STACK, clients[i], 5, &clients[i]->task, coreID >= 0 ? coreID : NULL); + xTaskCreatePinnedToCore((TaskFunction_t)&worker, taskName, SERVER_TASK_STACK, clients[i], 5, &clients[i]->task, coreID >= 0 ? coreID : tskNO_AFFINITY); LOG_D("Started client %d task %d\n", i, (uint32_t)(clients[i]->task)); return true; diff --git a/lib/eModbus/src/ModbusTypeDefs.h b/lib/eModbus/src/ModbusTypeDefs.h index 5aad1d5dd..cb281ad20 100644 --- a/lib/eModbus/src/ModbusTypeDefs.h +++ b/lib/eModbus/src/ModbusTypeDefs.h @@ -109,8 +109,8 @@ const uint8_t swapTables[8][8] = { enum FCType : uint8_t { FC01_TYPE, // Two uint16_t parameters (FC 0x01, 0x02, 0x03, 0x04, 0x05, 0x06) FC07_TYPE, // no additional parameter (FCs 0x07, 0x0b, 0x0c, 0x11) - FC0F_TYPE, // two uint16_t parameters, a uint8_t length byte and a uint16_t* pointer to array of bytes (FC 0x0f) - FC10_TYPE, // two uint16_t parameters, a uint8_t length byte and a uint8_t* pointer to array of words (FC 0x10) + FC0F_TYPE, // two uint16_t parameters, a uint8_t length byte and a uint8_t* pointer to array of bytes (FC 0x0f) + FC10_TYPE, // two uint16_t parameters, a uint8_t length byte and a uint16_t* pointer to array of words (FC 0x10) FC16_TYPE, // three uint16_t parameters (FC 0x16) FC18_TYPE, // one uint16_t parameter (FC 0x18) FCGENERIC, // for FCs not yet explicitly coded (or too complex) diff --git a/lib/eModbus/src/RTUutils.cpp b/lib/eModbus/src/RTUutils.cpp index d360c95af..c92d0ffd5 100644 --- a/lib/eModbus/src/RTUutils.cpp +++ b/lib/eModbus/src/RTUutils.cpp @@ -3,13 +3,13 @@ // MIT license - see license.md for details // ================================================================================================= #include "options.h" +#if HAS_FREERTOS #include "ModbusMessage.h" #include "RTUutils.h" #undef LOCAL_LOG_LEVEL // #define LOCAL_LOG_LEVEL LOG_LEVEL_VERBOSE #include "Logging.h" -#if HAS_FREERTOS // calcCRC: calculate Modbus CRC16 on a given array of bytes uint16_t RTUutils::calcCRC(const uint8_t *data, uint16_t len) { // CRC16 pre-calculated tables @@ -57,10 +57,9 @@ uint16_t RTUutils::calcCRC(const uint8_t *data, uint16_t len) { uint8_t crcHi = 0xFF; uint8_t crcLo = 0xFF; - uint8_t index; while (len--) { - index = crcLo ^ *data++; + uint8_t index = crcLo ^ *data++; crcLo = crcHi ^ crcHiTable[index]; crcHi = crcLoTable[index]; } @@ -464,4 +463,5 @@ const char RTUutils::ASCIIread[] = { const char RTUutils::ASCIIwrite[] = { 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46 }; + #endif diff --git a/lib/eModbus/src/RTUutils.h b/lib/eModbus/src/RTUutils.h index f50d8f449..e3f41be3e 100644 --- a/lib/eModbus/src/RTUutils.h +++ b/lib/eModbus/src/RTUutils.h @@ -5,9 +5,6 @@ #ifndef _RTU_UTILS_H #define _RTU_UTILS_H #include -#if NEED_UART_PATCH -#include -#endif #include #include "Stream.h" #include "ModbusTypeDefs.h" @@ -52,11 +49,13 @@ public: // RTSauto: dummy callback for auto half duplex RS485 boards inline static void RTSauto(bool level) { return; } // NOLINT +#if HAS_FREERTOS // Necessary preparations for a HardwareSerial static void prepareHardwareSerial(HardwareSerial& s, uint16_t bufferSize = 260) { s.setRxBufferSize(bufferSize); s.setTxBufferSize(bufferSize); } +#endif protected: // Printable characters for ASCII protocol: 012345678ABCDEF diff --git a/lib/eModbus/src/options.h b/lib/eModbus/src/options.h index c65bc1c2b..9de44e97a 100644 --- a/lib/eModbus/src/options.h +++ b/lib/eModbus/src/options.h @@ -12,7 +12,6 @@ #define HAS_FREERTOS 1 #define HAS_ETHERNET 1 #define IS_LINUX 0 -#define NEED_UART_PATCH 1 const unsigned int SERVER_TASK_STACK = 4096; const unsigned int CLIENT_TASK_STACK = 4096; @@ -23,7 +22,6 @@ const unsigned int CLIENT_TASK_STACK = 4096; #define HAS_FREERTOS 0 #define HAS_ETHERNET 0 #define IS_LINUX 0 -#define NEED_UART_PATCH 0 /* === LINUX DEFINITIONS AND MACROS === */ #elif defined(__linux__) @@ -31,7 +29,6 @@ const unsigned int CLIENT_TASK_STACK = 4096; #define HAS_FREERTOS 0 #define HAS_ETHERNET 0 #define IS_LINUX 1 -#define NEED_UART_PATCH 0 #include // for printf() #include // for memcpy(), strlen() etc. #include // for uint32_t etc. diff --git a/lib/esp32-psram/README.md b/lib/esp32-psram/README.md new file mode 100644 index 000000000..be9b161be --- /dev/null +++ b/lib/esp32-psram/README.md @@ -0,0 +1,91 @@ +# ESP32-PSRAM Library + +[![Arduino Library](https://img.shields.io/badge/Arduino-Library-blue.svg)](https://www.arduino.cc/reference/en/libraries/) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +A comprehensive memory management library for ESP32 microcontrollers, providing efficient data structures that leverage __PSRAM__ and __HIMEM__ for expanded storage capabilities. + + +## Overview + +The ESP32 can only address 4MB of PSRAM directly, so the remaining 4MB (HIMEM) are usually unsued! + +__esp32-psram__ is a C++ library that helps you manage large amounts of data on ESP32 devices by utilizing the full external PSRAM (SPI RAM) supporting the high memory (HIMEM) regions. This allows your applications to work with much larger datasets than would be possible using just internal RAM. + +- **Use any STL Class in PSRAM**: + - Adapt any [STL class](https://en.wikipedia.org/wiki/Standard_Template_Library) that accepts with an Allocator by using the [AllocatorPSRAM](https://pschatzmann.github.io/esp32-psram/html/classesp32__psram_1_1_p_s_r_a_m_allocator.html) + +- **Memory-Efficient Data Structures**: + - `VectorPSRAM`: Vector implementation that automatically stores data in PSRAM + - `VectorHIMEM`: Vector implementation for extremely large datasets using ESP32's high memory region + +- **File System Abstractions**: + - `FilePSRAM`: File-like interface backed by PSRAM + - `FileHIMEM`: File-like interface backed by high memory + - SD card-like API using familiar file operations to write to PSRAM or HIMEM. + +- **Streaming Data Handling**: + - `RingBufferStreamRAM`: Circular buffer implementation in RAM (Stream-based) + - `RingBufferStreamPSRAM`: Circular buffer implementation in PSRAM (Stream-based) + - `RingBufferStreamHIMEM`: Circular buffer implementation in high memory (Stream-based) + - Fully compatible with Arduino's Stream class + +- **Typed Ring Buffers**: + - `TypedRingBufferRAM`: Type-safe circular buffer for any data type using RAM + - `TypedRingBufferPSRAM`: PSRAM version for storing complex data structures + - `TypedRingBufferHIMEM`: High memory version for storing complex data structures + - Optimized for struct/class storage with proper memory management + + +## Installation + +1. Download the latest release from GitHub +2. Extract the ZIP file +3. Move the folder to your Arduino libraries directory (typically `~/Arduino/libraries/` on Linux/macOS or `Documents\Arduino\libraries\` on Windows) +4. Restart Arduino IDE + + +## API Reference + +- [Class Reference](https://pschatzmann.github.io/esp32-psram/html/namespaceesp32__psram.html) +- [Further Information](https://github.com/pschatzmann/esp32-psram/wiki) + +## Memory Performance Comparison + +| Memory Type | Access Speed | Capacity | Use Case | +|-------------|--------------|----------|----------| +| RAM (DRAM) | Very Fast | ~200-300KB | Small, performance-critical data | +| PSRAM | Fast | Up to 4MB | Medium-sized datasets, frequent access | +| HIMEM | Medium | Up to 8MB | Large datasets, less frequent access | + +## Hardware Compatibility + +| ESP32 Board | PSRAM Size | HIMEM Support | Notes | +|-------------|------------|--------------|-------| +| ESP32 | Up to 4MB | Yes | Most common ESP32 modules | +| ESP32-S2 | Up to 2MB | Limited | Check board specifications | +| ESP32-S3 | Up to 8MB | Yes | Best memory capabilities | +| ESP32-C3 | None | No | Not compatible with this library | + +## Design Philosophy + +The ESP32-PSRAM library is designed with these principles in mind: + +1. **Familiar interfaces**: API design mimics standard C++ containers and Arduino libraries +2. **Memory efficiency**: Automatic use of appropriate memory regions +3. **Type safety**: Template-based to work with any data type +4. **Flexibility**: Configurable for different memory types and use cases +5. **Zero overhead**: Direct memory access with minimal abstraction layers + + +## License + +MIT License + +## Contributing + +Contributions are welcome! Please feel free to submit a Pull Request. + +## Acknowledgements + +This library was inspired by the need for better memory management solutions on ESP32, especially for audio, image processing, and data logging applications. diff --git a/lib/esp32-psram/library.properties b/lib/esp32-psram/library.properties new file mode 100644 index 000000000..f8c80f991 --- /dev/null +++ b/lib/esp32-psram/library.properties @@ -0,0 +1,10 @@ +name=ESP32-PSRAM +version=0.1.3 +author=Phil Schatzmann +maintainer=https://github.com/pschatzmann +sentence=Memory management library for ESP32 using PSRAM and HIMEM +paragraph=A comprehensive memory management library that provides vector, file, and ring buffer implementations using ESP32's PSRAM and HIMEM. Allows applications to work with large datasets beyond internal memory limitations. +category=Data Storage +url=https://github.com/pschatzmann/esp32-psram +architectures=esp32 +depends= diff --git a/lib/esp32-psram/license.txt b/lib/esp32-psram/license.txt new file mode 100644 index 000000000..376642271 --- /dev/null +++ b/lib/esp32-psram/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Phil Schatzmann + +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. diff --git a/lib/esp32-psram/src/esp32-psram.h b/lib/esp32-psram/src/esp32-psram.h new file mode 100644 index 000000000..a69d9f4cd --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram.h @@ -0,0 +1,31 @@ +#pragma once + +#ifdef ESP32 +/** + * @file ESP32-PSRAM.h + * @brief Main include file for the ESP32-PSRAM library + * + * This header includes all components of the ESP32-PSRAM library and + * provides a using namespace directive for easier access to library features. + */ + +// Include all library components +#include "esp32-psram/AllocatorPSRAM.h" // PSRAM-backed vector +#include "esp32-psram/VectorPSRAM.h" // PSRAM-backed vector +#include "esp32-psram/VectorHIMEM.h" // HIMEM-backed vector +// #include "esp32-psram/InMemoryFile.h" // File interface using vectors +// #include "esp32-psram/PSRAM.h" // PSRAM file system +// #include "esp32-psram/HIMEM.h" // HIMEM file system +#include "esp32-psram/RingBufferStream.h" // Stream-based ring buffer +#include "esp32-psram/TypedRingBuffer.h" // Typed ring buffer for structured data + +#define stringPSRAM std::basic_string, AllocatorPSRAM> + +#ifndef ESP32_PSRAM_NO_NAMESPACE +using namespace esp32_psram; +#endif + +#else +#error "This library is only compatible with ESP32 platforms." +#endif // ESP32 + diff --git a/lib/esp32-psram/src/esp32-psram/AllocatorPSRAM.h b/lib/esp32-psram/src/esp32-psram/AllocatorPSRAM.h new file mode 100644 index 000000000..e18c7cc65 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/AllocatorPSRAM.h @@ -0,0 +1,159 @@ +#pragma once + +#include + +/** + * @namespace esp32_psram + * @brief Namespace containing ESP32 PSRAM-specific implementations + */ +namespace esp32_psram { + +/** + * @class AllocatorPSRAM + * @brief Custom allocator that uses ESP32's PSRAM for memory allocation + * @tparam T Type of elements to allocate + * + * This allocator uses ESP32's heap_caps_malloc with MALLOC_CAP_SPIRAM flag + * to ensure all memory is allocated in PSRAM instead of regular RAM. If PSRAM + * allocation fails, it falls back to regular RAM. + */ +template +class AllocatorPSRAM { + public: + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * @brief Default constructor + */ + AllocatorPSRAM() noexcept {} + + /** + * @brief Copy constructor from another allocator type + * @tparam U Type of the other allocator + * @param other The other allocator + */ + template + AllocatorPSRAM(const AllocatorPSRAM&) noexcept {} + + /** + * @brief Allocate memory from PSRAM + * @param n Number of elements to allocate + * @return Pointer to allocated memory + * @throws std::bad_alloc If allocation fails or size is too large + */ + pointer allocate(size_type n) { + // if (n > std::numeric_limits::max() / sizeof(T)) + // throw std::bad_alloc(); + // in Arduino excepitons are disabled! + assert(n <= std::numeric_limits::max() / sizeof(T)); + + pointer p = static_cast( + heap_caps_malloc(n * sizeof(T), MALLOC_CAP_SPIRAM)); + if (p == nullptr) { + p = static_cast(malloc(n * sizeof(T))); + } + + // if (!p) throw std::bad_alloc(); + + // in Arduino excepitons are disabled! + assert(p); + + return p; + } + + /** + * @brief Deallocate memory + * @param p Pointer to memory to deallocate + * @param size Size of allocation (unused) + */ + void deallocate(pointer p, size_type) noexcept { heap_caps_free(p); } + + /** + * @brief Rebind allocator to another type + * @tparam U Type to rebind the allocator to + */ + template + struct rebind { + using other = AllocatorPSRAM; + }; +}; + +/** + * @class AllocatorOnlyPSRAM + * @brief Custom allocator that uses ESP32's PSRAM for memory allocation + * @tparam T Type of elements to allocate + * + * This allocator uses ESP32's heap_caps_malloc with MALLOC_CAP_SPIRAM flag + * to ensure all memory is allocated in PSRAM instead of regular RAM. + * If PSRAM allocation fails, it does not fall back to regular RAM. + */ +template +class AllocatorOnlyPSRAM { + public: + using value_type = T; + using pointer = T*; + using const_pointer = const T*; + using reference = T&; + using const_reference = const T&; + using size_type = std::size_t; + using difference_type = std::ptrdiff_t; + + /** + * @brief Default constructor + */ + AllocatorOnlyPSRAM() noexcept {} + + /** + * @brief Copy constructor from another allocator type + * @tparam U Type of the other allocator + * @param other The other allocator + */ + template + AllocatorOnlyPSRAM(const AllocatorOnlyPSRAM&) noexcept {} + + /** + * @brief Allocate memory from PSRAM + * @param n Number of elements to allocate + * @return Pointer to allocated memory + * @throws std::bad_alloc If allocation fails or size is too large + */ + pointer allocate(size_type n) { + // if (n > std::numeric_limits::max() / sizeof(T)) + // throw std::bad_alloc(); + // in Arduino excepitons are disabled! + assert(n <= std::numeric_limits::max() / sizeof(T)); + + pointer p = static_cast( + heap_caps_malloc(n * sizeof(T), MALLOC_CAP_SPIRAM)); + // if (!p) throw std::bad_alloc(); + + // in Arduino excepitons are disabled! + assert(p); + + return p; + } + + /** + * @brief Deallocate memory + * @param p Pointer to memory to deallocate + * @param size Size of allocation (unused) + */ + void deallocate(pointer p, size_type) noexcept { heap_caps_free(p); } + + /** + * @brief Rebind allocator to another type + * @tparam U Type to rebind the allocator to + */ + template + struct rebind { + using other = AllocatorOnlyPSRAM; + }; +}; + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/HIMEM.h b/lib/esp32-psram/src/esp32-psram/HIMEM.h new file mode 100644 index 000000000..0b9efe4c4 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/HIMEM.h @@ -0,0 +1,54 @@ +#pragma once + +#include +#include "InMemoryFS.h" +#include "VectorHIMEM.h" + +namespace esp32_psram { + +/** + * @class HIMEMClass + * @brief Class for managing files stored in ESP32's High Memory (HIMEM) + * + * This class provides an interface similar to SD.h for managing files + * that are stored in HIMEM memory (beyond the 4MB boundary) rather than on an SD card. + * HIMEM offers larger storage capacity but slightly slower access than regular PSRAM. + */ +class HIMEMClass : public InMemoryFS, FileHIMEM> { +public: + /** + * @brief Initialize the HIMEM filesystem + * @return true if initialization was successful, false otherwise + */ + bool begin() override { + if (esp_himem_get_free_size() > 0) { + initialized = true; + return true; + } + initialized = false; + return false; + } + + /** + * @brief Get total space (returns available HIMEM) + * @return Total HIMEM size in bytes + */ + uint64_t totalBytes() override { + return esp_himem_get_phys_size(); + } + + /** + * @brief Get free space (returns free HIMEM) + * @return Free HIMEM size in bytes + */ + uint64_t freeBytes() override { + return esp_himem_get_free_size(); + } +}; + +/** + * @brief Global instance of HIMEMClass for easy access + */ +static HIMEMClass HIMEM; + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/HimemBlock.h b/lib/esp32-psram/src/esp32-psram/HimemBlock.h new file mode 100644 index 000000000..c6eb7d68a --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/HimemBlock.h @@ -0,0 +1,362 @@ +#pragma once + +#include +#include +#include +#include +// ESP32 HIMEM headers - using conditional inclusion for compatibility +#if __has_include("esp32/himem.h") +#include "esp32/himem.h" +#elif __has_include("esp_himem.h") +#include "esp_himem.h" +#else +// Fall back to Arduino ESP32 core path +extern "C" { +#include "esp32/himem.h" +} + +// Define missing constants if needed +#ifndef ESP_HIMEM_BLKSZ +#define ESP_HIMEM_BLKSZ (32 * 1024) +#endif +#endif + +// Make sure ESP_HIMEM_PROT_RW is defined +#ifndef ESP_HIMEM_PROT_RW +#define ESP_HIMEM_PROT_RW 0 +#endif + +namespace esp32_psram { + +static constexpr const char* TAG = "HIMEM"; // Tag for ESP logging + +/** + * @class HimemBlock + * @brief Manages a block of himem memory with mapping functionality + */ +class HimemBlock { + public: + /** + * @brief Default constructor + */ + HimemBlock() { ESP_LOGD(TAG, "HimemBlock constructor called"); } + + /** + * @brief Allocate a block of himem + * @param block_size Size of memory to allocate in bytes + * @return the allocated (block) size in bytes, 0 otherwise + */ + size_t allocate(size_t block_size) { + ESP_LOGI(TAG, "HimemBlock::allocate(%u bytes) - Current handle: %p", + block_size, handle); + + if (handle != 0) { + ESP_LOGW(TAG, "Cannot allocate: Block already allocated"); + return false; // Already allocated + } + + // Round up to the nearest multiple of ESP_HIMEM_BLKSZ (32K) + block_size = ((block_size + ESP_HIMEM_BLKSZ - 1) / ESP_HIMEM_BLKSZ) * + ESP_HIMEM_BLKSZ; + + size = block_size; + esp_err_t err = esp_himem_alloc(block_size, &handle); + if (err != ESP_OK) { + ESP_LOGE(TAG, "HIMEM allocation failed - error: %d, size: %d", err, + block_size); + return 0; + } + + ESP_LOGD(TAG, "- Successfully allocated %u bytes, handle: %p", block_size, + handle); + return block_size; + } + + /** + * @brief Read data from HIMEM at specified offset + * @param dest Destination buffer + * @param offset Offset in HIMEM to read from + * @param length Number of bytes to read + * @return Number of bytes actually read + */ + size_t read(void* dest, size_t offset, size_t length) { + ESP_LOGD(TAG, "HimemBlock::read(dst=%p, offset=%u, length=%u)", dest, + offset, length); + + if (!handle || offset >= size) { + ESP_LOGW(TAG, "Read failed: %s", + !handle ? "Invalid handle" : "Offset beyond size"); + return 0; + } + + // Ensure we don't read past the end + length = std::min(length, size - offset); + if (length == 0) { + ESP_LOGW(TAG, "Read failed: Zero length after bounds check"); + return 0; + } + + // Calculate which block this belongs to + size_t block_index = offset / ESP_HIMEM_BLKSZ; + size_t block_offset = offset % ESP_HIMEM_BLKSZ; + size_t bytes_read = 0; + + ESP_LOGD(TAG, "- Reading from block %u, offset %u", block_index, + block_offset); + uint8_t* dest_ptr = static_cast(dest); + + while (bytes_read < length) { + // Ensure the correct block is mapped + if (!ensure_block_mapped(block_index)) { + return bytes_read; + } + + // Calculate how much to read from this block + size_t block_remain = ESP_HIMEM_BLKSZ - block_offset; + size_t to_read = std::min(block_remain, length - bytes_read); + ESP_LOGD(TAG, "- Reading %u bytes from window at offset %u", to_read, + block_offset); + + // Copy the data + memcpy(dest_ptr + bytes_read, + static_cast(mapped_ptr) + block_offset, to_read); + + bytes_read += to_read; + block_index++; + block_offset = 0; // Reset offset for next blocks + } + + ESP_LOGD(TAG, "- Successfully read %u bytes", bytes_read); + return bytes_read; + } + + /** + * @brief Write data to HIMEM at specified offset + * @param src Source buffer + * @param offset Offset in HIMEM to write to + * @param length Number of bytes to write + * @return Number of bytes actually written + */ + size_t write(const void* src, size_t offset, size_t length) { + ESP_LOGD(TAG, "HimemBlock::write(src=%p, offset=%u, length=%u)", src, + offset, length); + + if (!handle || offset >= size) { + ESP_LOGW(TAG, "Write failed: %s", + !handle ? "Invalid handle" : "Offset beyond size"); + return 0; + } + + // Ensure we don't write past the end + length = std::min(length, size - offset); + if (length == 0) { + ESP_LOGW(TAG, "Write failed: Zero length after bounds check"); + return 0; + } + + // Calculate which block this belongs to + size_t block_index = offset / ESP_HIMEM_BLKSZ; + size_t block_offset = offset % ESP_HIMEM_BLKSZ; + size_t bytes_written = 0; + + ESP_LOGD(TAG, "- Writing to block %u, offset %u", block_index, + block_offset); + const uint8_t* src_ptr = static_cast(src); + + while (bytes_written < length) { + // Ensure the correct block is mapped + if (!ensure_block_mapped(block_index)) { + return bytes_written; + } + + // Calculate how much to write to this block + size_t block_remain = ESP_HIMEM_BLKSZ - block_offset; + size_t to_write = std::min(block_remain, length - bytes_written); + ESP_LOGD(TAG, "- Writing %u bytes to window at offset %u", to_write, + block_offset); + + // Copy the data + memcpy(static_cast(mapped_ptr) + block_offset, + src_ptr + bytes_written, to_write); + + bytes_written += to_write; + block_index++; + block_offset = 0; // Reset offset for next blocks + } + + ESP_LOGD(TAG, "- Successfully wrote %u bytes", bytes_written); + return bytes_written; + } + + bool getAddress(size_t offset, void* &result, size_t &available) { + size_t block_index = offset / ESP_HIMEM_BLKSZ; + size_t block_offset = offset % ESP_HIMEM_BLKSZ; + if (!ensure_block_mapped(block_index)) return false; + available = ESP_HIMEM_BLKSZ - block_offset; + result = static_cast(mapped_ptr)+block_offset; + return true; + } + + /** + * @brief Unmap the himem block + */ + void unmap() { + ESP_LOGD(TAG, "HimemBlock::unmap() - mapped_ptr=%p, range=%p", mapped_ptr, + range); + + if (mapped_ptr && range) { + ESP_LOGD(TAG, "- Unmapping memory and freeing range"); + esp_himem_unmap(range, mapped_ptr, ESP_HIMEM_BLKSZ); + esp_himem_free_map_range(range); + mapped_ptr = nullptr; + range = 0; + current_mapped_block = SIZE_MAX; // Reset currently mapped block + ESP_LOGD(TAG, "- Unmapped successfully"); + } else { + ESP_LOGD(TAG, "- Nothing to unmap"); + } + } + + /** + * @brief Free the himem block + */ + void free() { + ESP_LOGD(TAG, "HimemBlock::free() - handle=%p", handle); + + if (handle) { + ESP_LOGD(TAG, "- Unmapping before freeing"); + unmap(); + ESP_LOGD(TAG, "- Freeing HIMEM handle %p", handle); + esp_himem_free(handle); + handle = 0; + size = 0; + ESP_LOGD(TAG, " - Successfully freed HIMEM block"); + } else { + ESP_LOGD(TAG, "- Nothing to free"); + } + } + + /** + * @brief Get the size of the allocated block + * @return Size of the allocated block in bytes + */ + size_t get_size() const { + ESP_LOGD(TAG, "HimemBlock::get_size() = %u", size); + return size; + } + + /** + * @brief Destructor - ensures memory is properly freed + */ + ~HimemBlock() { + ESP_LOGD(TAG, "HimemBlock destructor called"); + free(); + } + + /** + * @brief Copy constructor (deleted) + */ + HimemBlock(const HimemBlock&) = delete; + + /** + * @brief Move constructor + */ + HimemBlock(HimemBlock&& other) noexcept + : handle(other.handle), + range(other.range), + mapped_ptr(other.mapped_ptr), + size(other.size), + current_mapped_block(other.current_mapped_block) { + ESP_LOGD(TAG, "HimemBlock move constructor - moving handle=%p, size=%u", + other.handle, other.size); + other.handle = 0; + other.range = 0; + other.mapped_ptr = nullptr; + other.size = 0; + other.current_mapped_block = SIZE_MAX; + } + + /** + * @brief Copy assignment operator (deleted) + */ + HimemBlock& operator=(const HimemBlock&) = delete; + + /** + * @brief Move assignment operator + */ + HimemBlock& operator=(HimemBlock&& other) noexcept { + ESP_LOGD(TAG, "HimemBlock move assignment - from handle=%p to handle=%p", + other.handle, handle); + + if (this != &other) { + ESP_LOGD(TAG, "Freeing current resources before move assignment"); + free(); + handle = other.handle; + range = other.range; + mapped_ptr = other.mapped_ptr; + size = other.size; + current_mapped_block = other.current_mapped_block; + ESP_LOGD(TAG, "Moved resources, new size=%u", size); + other.handle = 0; + other.range = 0; + other.mapped_ptr = nullptr; + other.size = 0; + other.current_mapped_block = SIZE_MAX; + } else { + ESP_LOGD(TAG, "Self-assignment detected, no action taken"); + } + return *this; + } + + protected: + esp_himem_handle_t handle = 0; + esp_himem_rangehandle_t range = 0; + void* mapped_ptr = nullptr; + size_t size = 0; + size_t current_mapped_block = + SIZE_MAX; // Track which block is currently mapped + + /** + * @brief Ensure a specific block is mapped into memory + * @param block_index The index of the block to map + * @return true if mapping successful, false otherwise + */ + bool ensure_block_mapped(size_t block_index) { + // If the requested block is already mapped, we're done + if (block_index == current_mapped_block) { + return true; + } + + // Unmap previous block if any + if (mapped_ptr) { + ESP_LOGD(TAG, "- Unmapping block %u before mapping new block %u", + current_mapped_block, block_index); + unmap(); // Unmap previous block + } + + // Allocate map range + ESP_LOGD(TAG, "- Allocating map range for block %u", block_index); + esp_err_t err = esp_himem_alloc_map_range(ESP_HIMEM_BLKSZ, &range); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to allocate map range: %d", err); + return false; + } + + // Map the current block + ESP_LOGD(TAG, "- Mapping block %u (offset %u)", block_index, + block_index * ESP_HIMEM_BLKSZ); + err = esp_himem_map(handle, range, block_index * ESP_HIMEM_BLKSZ, 0, + ESP_HIMEM_BLKSZ, ESP_HIMEM_PROT_RW, &mapped_ptr); + if (err != ESP_OK) { + ESP_LOGE(TAG, "Failed to map memory: %d", err); + esp_himem_free_map_range(range); + range = 0; + return false; + } + + current_mapped_block = block_index; + return true; + } +}; + +} // namespace esp32_psram diff --git a/lib/esp32-psram/src/esp32-psram/InMemoryFS.h_ b/lib/esp32-psram/src/esp32-psram/InMemoryFS.h_ new file mode 100644 index 000000000..f12e3a2a0 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/InMemoryFS.h_ @@ -0,0 +1,251 @@ +#pragma once + +#include + +#include + +#include "InMemoryFile.h" + +// Define Arduino file mode constants if not already defined +#ifndef FILE_READ +#define FILE_READ 0 +#endif +#ifndef FILE_WRITE +#define FILE_WRITE 1 +#endif +#ifndef FILE_APPEND +#define FILE_APPEND 2 +#endif + +namespace esp32_psram { + +/** + * @class InMemoryFS + * @brief Base class for memory-based file systems like PSRAM and HIMEM + * + * This class provides a common interface for in-memory file systems, + * with methods for file management and traversal. + * + * @tparam VectorType The vector implementation to use (VectorPSRAM or + * VectorHIMEM) + * @tparam FileType The file implementation to return (FilePSRAM or FileHIMEM) + */ +template +class InMemoryFS { + public: + /** + * @brief Initialize the file system + * @return true if initialization was successful, false otherwise + */ + virtual bool begin() = 0; + + /** + * @brief Check if a file exists + * @param filename Name of the file to check + * @return true if the file exists, false otherwise + */ + bool exists(const char* filename) { + if (!initialized) return false; + return fileData.find(std::string(filename)) != fileData.end(); + } + + /** + * @brief Open a file + * @param filename Name of the file to open + * @param mode Mode to open the file in (FILE_READ, FILE_WRITE, etc.) + * @return A file object for the opened file + */ + FileType open(const char* filename, uint8_t mode) { + ESP_LOGD("InMemoryFS", "Opening file %s with mode %d", filename, mode); + + if (!initialized) { + ESP_LOGW("InMemoryFS", "Filesystem not initialized"); + FileType emptyFile; + return emptyFile; + } + + // Convert Arduino file modes to our enum + FileMode fileMode; + if (mode == FILE_READ) { + fileMode = FileMode::READ; + } else if (mode == FILE_WRITE) { + fileMode = FileMode::WRITE; + } else if (mode == FILE_APPEND) { + fileMode = FileMode::APPEND; + } else { + fileMode = FileMode::READ_WRITE; + } + + std::string filenameStr(filename); + auto it = fileData.find(filenameStr); + FileType file; + + if (it != fileData.end()) { + // File exists, create a new file pointing to existing data + ESP_LOGD("InMemoryFS", "File exists, connecting to existing data"); + file.setVector(&(it->second)); + } else if (mode != FILE_READ) { + // File doesn't exist, create it for writing or appending + ESP_LOGD("InMemoryFS", "Creating new file for writing"); + fileData[filenameStr] = VectorType(); // Create empty vector in the map + file.setVector(&(fileData[filenameStr])); + } else { + // File doesn't exist and mode is READ + ESP_LOGW("InMemoryFS", "File doesn't exist and mode is READ"); + return file; // Return empty file + } + + // Configure the file + file.setName(filename); + file.open(fileMode); + + // Set up the next file callback + file.setNextFileCallback( + [this](const char* currentFileName, FileMode currentMode) -> FileType { + ESP_LOGD("InMemoryFS", "NextFile callback called for %s", + currentFileName); + + // Get the next filename + String nextName = this->getNextFileName(currentFileName); + if (nextName.isEmpty()) { + ESP_LOGD("InMemoryFS", "No next file found"); + return FileType(); // Return empty file if no next file + } + + // Convert FileMode to Arduino mode + uint8_t arduinoMode; + if (currentMode == FileMode::READ) + arduinoMode = FILE_READ; + else if (currentMode == FileMode::WRITE) + arduinoMode = FILE_WRITE; + else if (currentMode == FileMode::APPEND) + arduinoMode = FILE_APPEND; + else + arduinoMode = FILE_READ | FILE_WRITE; + + // Open and return the next file + ESP_LOGD("InMemoryFS", "Returning next file: %s", nextName.c_str()); + return this->open(nextName.c_str(), arduinoMode); + }); + + ESP_LOGD("InMemoryFS", "File opened successfully"); + return file; + } + + /** + * @brief Remove a file + * @param filename Name of the file to remove + * @return true if the file was removed, false otherwise + */ + bool remove(const char* filename) { + if (!initialized) return false; + + std::string filenameStr(filename); + auto it = fileData.find(filenameStr); + + if (it != fileData.end()) { + fileData.erase(it); + return true; + } + + return false; + } + + /** + * @brief Create a directory (no-op for compatibility) + * @param dirname Name of the directory + * @return Always returns true for compatibility + */ + bool mkdir(const char* dirname) { + // No directories in this implementation, just for compatibility + return true; + } + + /** + * @brief Remove a directory (no-op for compatibility) + * @param dirname Name of the directory + * @return Always returns true for compatibility + */ + bool rmdir(const char* dirname) { + // No directories in this implementation, just for compatibility + return true; + } + + /** + * @brief Get the name of the next file after the specified file + * @param currentFileName Name of the current file + * @return Name of the next file, or empty string if there are no more files + */ + String getNextFileName(const char* currentFileName) { + if (!initialized || fileData.empty()) { + return String(); + } + + if (currentFileName == nullptr || strlen(currentFileName) == 0 || + strcmp(currentFileName, "/") == 0) { + // Return the first file if current is empty or is root directory + return String(fileData.begin()->first.c_str()); + } + + std::string current(currentFileName); + auto it = fileData.find(current); + + if (it == fileData.end()) { + // Current file not found, find the next one alphabetically + for (auto& entry : fileData) { + if (entry.first > current) { + return String(entry.first.c_str()); + } + } + // No file after the specified name + return String(); + } else { + // Found the current file, get the next one + ++it; + if (it != fileData.end()) { + return String(it->first.c_str()); + } else { + // Was the last file + return String(); + } + } + } + + /** + * @brief Get the first file in the filesystem + * @return Name of the first file, or empty string if there are no files + */ + String getFirstFileName() { + if (!initialized || fileData.empty()) { + return String(); + } + return String(fileData.begin()->first.c_str()); + } + + /** + * @brief Get the total number of files + * @return Number of files in the filesystem + */ + size_t fileCount() const { + if (!initialized) return 0; + return fileData.size(); + } + + /** + * @brief Get total space + * @return Total memory size in bytes + */ + virtual uint64_t totalBytes() = 0; + + /** + * @brief Get free space + * @return Free memory size in bytes + */ + virtual uint64_t freeBytes() = 0; + + protected: + bool initialized = false; + std::map fileData; +}; + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/InMemoryFile.h_ b/lib/esp32-psram/src/esp32-psram/InMemoryFile.h_ new file mode 100644 index 000000000..8904ef23b --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/InMemoryFile.h_ @@ -0,0 +1,421 @@ +#pragma once + +#include + +#include "VectorHIMEM.h" +#include "VectorPSRAM.h" + +namespace esp32_psram { + +// Define file modes +enum class FileMode { READ, WRITE, APPEND, READ_WRITE }; + +/** + * @class InMemoryFile + * @brief A file-like interface for vector-backed storage in memory + * + * This class provides a file-like interface (compatible with Arduino's Stream) + * for reading and writing data to vector-backed storage. It can use either + * standard PSRAM or ESP32's HIMEM (high memory beyond the 4MB boundary) + * as its underlying storage mechanism through the VectorPSRAM and VectorHIMEM + * implementations. + * + * InMemoryFile offers familiar file operations like open, close, read, write, + * seek, and truncate while managing the data in memory rather than on disk. + * This makes it useful for temporary storage, data processing, or situations + * where file operations are needed but filesystem access is not available + * or desirable. + * + * The class can either manage its own internal vector or reference an external + * vector supplied by another component (like PSRAMClass or HIMEMClass). + * + * @tparam VectorType The vector implementation to use for storage (typically + * VectorPSRAM or VectorHIMEM) + * + * @note The performance characteristics will depend on the underlying vector + * implementation. HIMEM operations are generally slower than regular + * PSRAM operations but allow for larger storage capacity. + */ +template +class InMemoryFile : public Stream { + public: + // Define a single callback type that returns the next file directly + using NextFileCallback = + std::function(const char*, FileMode)>; + /** + * @brief Default constructor - initializes with internal vector + */ + InMemoryFile() : data_ptr(&internal_data) { + ESP_LOGD(TAG, "InMemoryFile constructor called"); + } + + /** + * @brief Constructor with filename and mode + * @param filename Name of the file + * @param mode Mode to open the file in + */ + InMemoryFile(const char* filename, FileMode mode) + : data_ptr(&internal_data), name_(filename) { + ESP_LOGD(TAG, "InMemoryFile constructor with name and mode called"); + open(mode); + } + + /** + * @brief Destructor - ensures proper cleanup + */ + virtual ~InMemoryFile() { + ESP_LOGD(TAG, "InMemoryFile destructor called"); + close(); + if (!using_external_vector) { + data_ptr = nullptr; + } + } + + /** + * @brief Set the vector to use for this file + * @param vec Pointer to the vector to use + */ + void setVector(VectorType* vec) { + ESP_LOGD(TAG, "Setting external vector pointer: %p", vec); + if (vec) { + data_ptr = vec; + using_external_vector = true; + } else { + data_ptr = &internal_data; + using_external_vector = false; + } + } + + /** + * @brief Set the name of this file + * @param name The name to set + */ + void setName(const char* name) { + ESP_LOGD(TAG, "Setting file name: %s", name); + name_ = name; + } + + /** + * @brief Open the file with the specified mode + * @param mode Mode to open the file in + * @return true if opened successfully, false otherwise + */ + bool open(FileMode mode) { + ESP_LOGD(TAG, "Opening file '%s' with mode %d", name_.c_str(), + static_cast(mode)); + this->mode = mode; + + if (mode == FileMode::WRITE) { + // Clear the vector for writing + data_ptr->clear(); + position_ = 0; + } else if (mode == FileMode::APPEND) { + // Position at end for appending + position_ = data_ptr->size(); + } else { + // READ or READ_WRITE - position at beginning + position_ = 0; + } + + open_ = true; + return true; + } + + /** + * @brief Close the file + */ + void close() { + ESP_LOGD(TAG, "Closing file '%s'", name_.c_str()); + open_ = false; + } + + /** + * @brief Check if file is open + * @return true if open, false otherwise + */ + bool isOpen() const { return open_; } + + /** + * @brief Get the name of the file + * @return File name + */ + String name() const { return name_; } + + /** + * @brief Get the size of the file + * @return File size in bytes + */ + size_t size() const { return data_ptr->size(); } + + // Stream interface implementation + + /** + * @brief Read a single byte from the file + * @return The next byte, or -1 if no data is available + */ + int read() override { + ESP_LOGD(TAG, "InMemoryFile::read() - position %u", (unsigned)position_); + if (!open_ || (mode != FileMode::READ && mode != FileMode::READ_WRITE)) { + ESP_LOGE(TAG, "read failed: file not open for reading"); + return -1; + } + + if (position_ >= data_ptr->size()) { + ESP_LOGD(TAG, "read at EOF: pos=%u, size=%u", (unsigned)position_, + (unsigned)data_ptr->size()); + return -1; // EOF + } + + uint8_t byte = (*data_ptr)[position_++]; + return byte; + } + + /** + * @brief Read multiple bytes from the file + * @param buffer Buffer to store the read data + * @param size Maximum number of bytes to read + * @return Number of bytes actually read + */ + size_t readBytes(char* buffer, size_t size) override { + ESP_LOGD(TAG, "InMemoryFile::readBytes: %u", (unsigned)size); + if (!open_ || (mode != FileMode::READ && mode != FileMode::READ_WRITE)) { + ESP_LOGE(TAG, "read failed: file not open for reading"); + return 0; + } + + // Calculate how many bytes we can actually read + size_t available_bytes = data_ptr->size() - position_; + size_t bytes_to_read = min(size, available_bytes); + + // Read the bytes + for (size_t i = 0; i < bytes_to_read; i++) { + buffer[i] = (*data_ptr)[position_ + i]; + } + + position_ += bytes_to_read; + return bytes_to_read; + } + + /** + * @brief Get the number of bytes available to read + * @return Number of bytes available + */ + int available() override { + if (!open_) return 0; + return data_ptr->size() - position_; + } + + /** + * @brief Peek at the next byte without advancing the position + * @return The next byte, or -1 if no data is available + */ + int peek() override { + if (!open_ || (mode != FileMode::READ && mode != FileMode::READ_WRITE)) { + return -1; + } + + if (position_ >= data_ptr->size()) { + return -1; // EOF + } + + return (*data_ptr)[position_]; + } + + /** + * @brief Ensure all data is committed to the storage + * No-op for this implementation since data is in memory + */ + void flush() override { + // No-op for in-memory implementation + } + + /** + * @brief Write a single byte to the file + * @param b The byte to write + * @return 1 if the byte was written, 0 otherwise + */ + size_t write(uint8_t b) override { + ESP_LOGD(TAG, "InMemoryFile::write: 1 byte"); + if (!open_ || (mode != FileMode::WRITE && mode != FileMode::APPEND && + mode != FileMode::READ_WRITE)) { + ESP_LOGE(TAG, "write failed: file not open for writing"); + return 0; + } + + if (position_ >= data_ptr->size()) { + // Append to the end + data_ptr->push_back(b); + } else { + // Replace existing byte + (*data_ptr)[position_] = b; + } + + position_++; + return 1; + } + + /** + * @brief Write multiple bytes to the file + * @param buffer Buffer containing the data to write + * @param size Number of bytes to write + * @return Number of bytes actually written + */ + size_t write(const uint8_t* buffer, size_t size) override { + ESP_LOGD(TAG, "InMemoryFile::write: %u", (unsigned)size); + if (!open_ || (mode != FileMode::WRITE && mode != FileMode::APPEND && + mode != FileMode::READ_WRITE)) { + ESP_LOGE(TAG, "write failed: file not open for writing"); + return 0; + } + + if (position_ >= data_ptr->size()) { + // Append to the end + data_ptr->reserve(data_ptr->size() + size); // Optimize capacity + for (size_t i = 0; i < size; i++) { + data_ptr->push_back(buffer[i]); + } + } else { + // Replace/insert bytes + size_t space_available = data_ptr->size() - position_; + size_t bytes_to_replace = min(size, space_available); + size_t bytes_to_append = size - bytes_to_replace; + + // Replace existing bytes + for (size_t i = 0; i < bytes_to_replace; i++) { + (*data_ptr)[position_ + i] = buffer[i]; + } + + // Append remaining bytes + for (size_t i = 0; i < bytes_to_append; i++) { + data_ptr->push_back(buffer[bytes_to_replace + i]); + } + } + + position_ += size; + return size; + } + + // File-specific methods + + /** + * @brief Set the current position in the file + * @param pos The position to seek to + * @return true if successful, false otherwise + */ + bool seek(size_t pos) { + ESP_LOGD(TAG, "InMemoryFile::seek: %u", (unsigned)pos); + if (!open_ || pos > data_ptr->size()) { + ESP_LOGE(TAG, "seek failed: file not open or position beyond size"); + return false; + } + + position_ = pos; + return true; + } + + /** + * @brief Get the current position in the file + * @return Current position + */ + size_t position() const { return position_; } + + /** + * @brief Truncate the file to the current position + */ + void truncate() { + ESP_LOGD(TAG, "InMemoryFile::truncate at position %u", (unsigned)position_); + if (!open_ || (mode != FileMode::WRITE && mode != FileMode::READ_WRITE)) { + ESP_LOGE(TAG, "truncate failed: file not open for writing"); + return; + } + + if (position_ < data_ptr->size()) { + // Create a new vector with just the data up to position_ + VectorType new_data; + new_data.reserve(position_); + for (size_t i = 0; i < position_; i++) { + new_data.push_back((*data_ptr)[i]); + } + + // Replace the old data + *data_ptr = std::move(new_data); + } + } + + operator bool() const { return open_; } + /** + * @brief Set callback for navigating to the next file + * + * This function sets a callback that will be used to retrieve the next + * file when getNextFile() is called. The callback takes the current file name + * and mode, and returns the next file object directly. + * + * @param callback Function that returns the next file + */ + void setNextFileCallback(NextFileCallback callback) { + ESP_LOGD(TAG, "Setting next file callback"); + nextFileCallback = callback; + } + + /** + * @brief Get the next file in the filesystem + * + * This method uses the registered callback to get the next file + * after this one in the filesystem. + * + * @return The next file, or an empty file if there is no next file or + * callback isn't set + */ + InMemoryFile getNextFile() { + if (!nextFileCallback || name_.isEmpty()) { + // Return empty file if callback isn't set or no name + InMemoryFile emptyFile; + return emptyFile; + } + + // Get the next file directly using the callback + return nextFileCallback(name_.c_str(), mode); + } + + /** + * @brief Reserve storage + * @param new_cap The new capacity of the file + */ + bool reserve(size_t new_cap) { + if (data_ptr == nullptr) return false; + data_ptr->reserve(new_cap); + return true; + } + + /** + * @brief Get the number of bytes that can be held in current storage. + * Please note that this might dynamically grow! + * @return The capacity of the file + */ + size_t capacity() const { + if (data_ptr == nullptr) return 0; + return data_ptr->capacity(); + } + + private: + VectorType* data_ptr = + nullptr; // Pointer to vector data (internal or external) + VectorType internal_data; // Internal vector for standalone use + bool using_external_vector = false; + size_t position_ = 0; + bool open_ = false; + FileMode mode = FileMode::READ; + String name_; + + // Single callback for getting the next file + NextFileCallback nextFileCallback = nullptr; + + // Tags for debug logging + static constexpr const char* TAG = "InMemoryFile"; +}; + +// Type aliases for convenience +using FilePSRAM = InMemoryFile>; +using FileHIMEM = InMemoryFile>; + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/PSRAM.h_ b/lib/esp32-psram/src/esp32-psram/PSRAM.h_ new file mode 100644 index 000000000..e365c4fa2 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/PSRAM.h_ @@ -0,0 +1,54 @@ +#pragma once + +#include +#include "InMemoryFS.h" +#include "VectorPSRAM.h" + + +namespace esp32_psram { + +/** + * @class PSRAMClass + * @brief Class for managing files stored in ESP32's PSRAM + * + * This class provides an interface similar to SD.h for managing files + * that are stored in PSRAM memory rather than on an SD card. + */ +class PSRAMClass : public InMemoryFS, FilePSRAM> { +public: + /** + * @brief Initialize the PSRAM filesystem + * @return true if initialization was successful, false otherwise + */ + bool begin() override { + if (ESP.getFreePsram() > 0) { + initialized = true; + return true; + } + initialized = false; + return false; + } + + /** + * @brief Get total space (returns available PSRAM) + * @return Total PSRAM size in bytes + */ + uint64_t totalBytes() override { + return ESP.getPsramSize(); + } + + /** + * @brief Get free space (returns free PSRAM) + * @return Free PSRAM size in bytes + */ + uint64_t freeBytes() override { + return ESP.getFreePsram(); + } +}; + +/** + * @brief Global instance of PSRAMClass for easy access + */ +static PSRAMClass PSRAM; + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/RingBufferStream.h b/lib/esp32-psram/src/esp32-psram/RingBufferStream.h new file mode 100644 index 000000000..b32046789 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/RingBufferStream.h @@ -0,0 +1,250 @@ +#pragma once + +#include +#include +#include "VectorPSRAM.h" +#include "VectorHIMEM.h" + +namespace esp32_psram { + +/** + * @class RingBufferStream + * @brief A circular buffer implementation that extends Arduino's Stream + * @tparam VectorType The vector type to use as underlying storage + * + * This class implements a ring buffer (circular buffer) that uses a vector container + * for storage. It extends Arduino's Stream class to provide standard stream functionality. + * The buffer can be used with any vector type, including VectorPSRAM and VectorHIMEM. + */ +template +class RingBufferStream : public Stream { +private: + VectorType buffer; + size_t readIndex = 0; + size_t writeIndex = 0; + bool full = false; + size_t maxSize; + +public: + /** + * @brief Constructor with specified buffer size + * @param size The size of the buffer in bytes + */ + RingBufferStream(size_t size) : maxSize(size) { + buffer.resize(size); + } + + /** + * @brief Get the number of bytes available for reading + * @return Number of bytes available + */ + int available() override { + if (full) { + return maxSize; + } + if (writeIndex >= readIndex) { + return writeIndex - readIndex; + } else { + return maxSize - (readIndex - writeIndex); + } + } + + /** + * @brief Read a byte from the buffer + * @return The byte read, or -1 if the buffer is empty + */ + int read() override { + if (isEmpty()) { + return -1; + } + + uint8_t value = buffer[readIndex]; + readIndex = (readIndex + 1) % maxSize; + full = false; + return value; + } + + /** + * @brief Look at the next byte in the buffer without removing it + * @return The next byte to be read, or -1 if the buffer is empty + */ + int peek() override { + if (isEmpty()) { + return -1; + } + + return buffer[readIndex]; + } + + /** + * @brief Write a byte to the buffer + * @param value The byte to write + * @return 1 if the byte was written, 0 if the buffer is full + */ + size_t write(uint8_t value) override { + if (full) { + return 0; + } + + buffer[writeIndex] = value; + writeIndex = (writeIndex + 1) % maxSize; + + // Check if buffer is now full + if (writeIndex == readIndex) { + full = true; + } + + return 1; + } + + /** + * @brief Write multiple bytes to the buffer + * @param data Pointer to the data to write + * @param size Number of bytes to write + * @return Number of bytes written + */ + size_t write(const uint8_t *data, size_t size) { + size_t bytesWritten = 0; + + for (size_t i = 0; i < size; i++) { + if (write(data[i])) { + bytesWritten++; + } else { + break; + } + } + + return bytesWritten; + } + + /** + * @brief Clear the buffer, removing all content + */ + void flush() override { + readIndex = 0; + writeIndex = 0; + full = false; + } + + /** + * @brief Check if the buffer is empty + * @return true if the buffer is empty, false otherwise + */ + bool isEmpty() const { + return !full && (readIndex == writeIndex); + } + + /** + * @brief Check if the buffer is full + * @return true if the buffer is full, false otherwise + */ + bool isFull() const { + return full; + } + + /** + * @brief Get the number of bytes that can be written without blocking + * @return Number of bytes available for writing + */ + int availableForWrite() override { + if (full) { + return 0; + } + if (readIndex > writeIndex) { + return readIndex - writeIndex; + } else { + return maxSize - (writeIndex - readIndex); + } + } + + /** + * @brief Get the total capacity of the buffer + * @return Total buffer capacity in bytes + */ + size_t size() const { + return maxSize; + } + + /** + * @brief Get the number of bytes currently in the buffer + * @return Number of bytes in the buffer + */ + size_t used() const { + return available(); + } + + /** + * @brief Get the number of bytes still available in the buffer + * @return Number of free bytes in the buffer + */ + size_t free() const { + return maxSize - available(); + } + + /** + * @brief Read multiple bytes from the buffer + * @param buffer Buffer to store the read data + * @param size Maximum number of bytes to read + * @return Number of bytes actually read + */ + size_t readBytes(char* buffer, size_t size) override { + size_t bytesRead = 0; + + for (size_t i = 0; i < size; i++) { + int value = read(); + if (value >= 0) { + buffer[i] = (char)value; + bytesRead++; + } else { + break; + } + } + + return bytesRead; + } + + /** + * @brief Read multiple bytes from the buffer + * @param buffer Buffer to store the read data + * @param size Maximum number of bytes to read + * @return Number of bytes actually read + */ + size_t readBytes(uint8_t* buffer, size_t size) { + return readBytes(reinterpret_cast(buffer), size); + } + + /** + * @brief Get direct access to the underlying vector + * @return Reference to the underlying vector + */ + VectorType& getVector() { + return buffer; + } + + /** + * @brief Get const access to the underlying vector + * @return Const reference to the underlying vector + */ + const VectorType& getVector() const { + return buffer; + } +}; + +/** + * @brief Type alias for a RingBufferStream that uses PSRAM-backed vector storage + */ +using RingBufferStreamPSRAM = RingBufferStream>; + +/** + * @brief Type alias for a RingBufferStream that uses HIMEM-backed vector storage + */ +using RingBufferStreamHIMEM = RingBufferStream>; + +/** + * @brief Type alias for a RingBufferStream that uses std::vector storage + */ + +using RingBufferStreamRAM = RingBufferStream>; + + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/TypedRingBuffer.h b/lib/esp32-psram/src/esp32-psram/TypedRingBuffer.h new file mode 100644 index 000000000..84ec9ab21 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/TypedRingBuffer.h @@ -0,0 +1,227 @@ + +#pragma once + +#include +#include +#include "VectorPSRAM.h" +#include "VectorHIMEM.h" + +namespace esp32_psram { + +/** + * @class TypedRingBuffer + * @brief A generic ring buffer implementation for any data type + * @tparam T The data type to store in the buffer + * @tparam VectorType The vector type to use as underlying storage + * + * This class implements a ring buffer (circular buffer) that uses a vector container + * for storage. Unlike the Stream-based RingBuffer, this can store any data type. + */ +template +class TypedRingBuffer { +private: + VectorType buffer; + size_t readIndex = 0; + size_t writeIndex = 0; + bool full = false; + size_t maxSize; + +public: + /** + * @brief Constructor with specified buffer capacity + * @param capacity The maximum number of elements the buffer can hold + */ + TypedRingBuffer(size_t capacity) : maxSize(capacity) { + buffer.resize(capacity); + } + + /** + * @brief Push an element to the buffer + * @param value The value to add + * @return true if the element was added, false if the buffer is full + */ + bool push(const T& value) { + if (full) { + return false; + } + + buffer[writeIndex] = value; + advanceWriteIndex(); + return true; + } + + /** + * @brief Push an element to the buffer, overwriting oldest data if full + * @param value The value to add + * @return true if an old element was overwritten, false otherwise + */ + bool pushOverwrite(const T& value) { + bool overwritten = full; + + buffer[writeIndex] = value; + advanceWriteIndex(); + + return overwritten; + } + + /** + * @brief Pop an element from the buffer + * @param value Reference to store the popped value + * @return true if an element was popped, false if the buffer is empty + */ + bool pop(T& value) { + if (isEmpty()) { + return false; + } + + value = buffer[readIndex]; + advanceReadIndex(); + return true; + } + + /** + * @brief Peek at the next element without removing it + * @param value Reference to store the peeked value + * @return true if an element was peeked, false if the buffer is empty + */ + bool peek(T& value) const { + if (isEmpty()) { + return false; + } + + value = buffer[readIndex]; + return true; + } + + /** + * @brief Get the element at a specific index relative to the read position + * @param index The relative index from current read position + * @param value Reference to store the value + * @return true if the element exists, false otherwise + */ + bool peekAt(size_t index, T& value) const { + if (isEmpty() || index >= available()) { + return false; + } + + size_t actualIndex = (readIndex + index) % maxSize; + value = buffer[actualIndex]; + return true; + } + + /** + * @brief Clear the buffer, removing all content + */ + void clear() { + readIndex = 0; + writeIndex = 0; + full = false; + } + + /** + * @brief Check if the buffer is empty + * @return true if the buffer is empty, false otherwise + */ + bool isEmpty() const { + return !full && (readIndex == writeIndex); + } + + /** + * @brief Check if the buffer is full + * @return true if the buffer is full, false otherwise + */ + bool isFull() const { + return full; + } + + /** + * @brief Get the number of elements in the buffer + * @return Number of elements in the buffer + */ + size_t available() const { + if (full) { + return maxSize; + } + if (writeIndex >= readIndex) { + return writeIndex - readIndex; + } else { + return maxSize - (readIndex - writeIndex); + } + } + + /** + * @brief Get the number of empty slots in the buffer + * @return Number of empty slots + */ + size_t availableForWrite() const { + return maxSize - available(); + } + + /** + * @brief Get the total capacity of the buffer + * @return Total buffer capacity + */ + size_t capacity() const { + return maxSize; + } + + /** + * @brief Get direct access to the underlying vector + * @return Reference to the underlying vector + */ + VectorType& getVector() { + return buffer; + } + + /** + * @brief Get const access to the underlying vector + * @return Const reference to the underlying vector + */ + const VectorType& getVector() const { + return buffer; + } + +private: + /** + * @brief Advance the write index + */ + void advanceWriteIndex() { + writeIndex = (writeIndex + 1) % maxSize; + if (writeIndex == readIndex) { + full = true; + } + } + + /** + * @brief Advance the read index + */ + void advanceReadIndex() { + readIndex = (readIndex + 1) % maxSize; + full = false; + } +}; + +/** + * @brief Type alias for a typed ring buffer that uses std::vector (in RAM) + */ +template +using TypedRingBufferRAM = TypedRingBuffer>; +/** + * @brief Type alias for a typed ring buffer that uses HIMEM-backed vector storage + */ +template +using TypedRingBufferHIMEM = TypedRingBuffer>; + +/** + * @brief Type alias for a typed ring buffer that uses PSRAM-backed vector storage + */ +template +using TypedRingBufferPSRAM = TypedRingBuffer>; + +/** + * @brief Type alias for a typed ring buffer that uses HIMEM-backed vector storage + */ +// template +// using TypedRingBufferHIMEM = TypedRingBuffer>; + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/VectorHIMEM.h b/lib/esp32-psram/src/esp32-psram/VectorHIMEM.h new file mode 100644 index 000000000..ed00d27d4 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/VectorHIMEM.h @@ -0,0 +1,529 @@ +#pragma once + +#include "HimemBlock.h" + +namespace esp32_psram { + + +/** + * @class VectorHIMEM + * @brief Vector implementation that uses ESP32's high memory (himem) for + * storage + * @tparam T Type of elements stored in the vector + */ +template +class VectorHIMEM { + public: + // Type definitions + using value_type = T; + using reference = T&; + using const_reference = const T&; + using pointer = T*; + using const_pointer = const T*; + using size_type = size_t; + using difference_type = std::ptrdiff_t; + + /** + * @brief Default constructor - creates an empty vector + */ + VectorHIMEM() = default; + + /** + * @brief Constructs a vector with the given number of default-initialized + * elements + * @param count The size of the vector + */ + explicit VectorHIMEM(size_type count) { resize(count); } + + /** + * @brief Constructs a vector with the given number of copies of a value + * @param count The size of the vector + * @param value The value to initialize elements with + */ + VectorHIMEM(size_type count, const T& value) { resize(count, value); } + + /** + * @brief Copy constructor + * @param other The vector to copy from + */ + VectorHIMEM(const VectorHIMEM& other) { + if (other.element_count > 0) { + if (reallocate(other.element_count)) { + T temp; + VectorHIMEM& other_ = const_cast(other); + for (size_t i = 0; i < other.element_count; ++i) { + other_.memory.read((void*)&temp, i * sizeof(T), sizeof(T)); + memory.write((void*)&temp, i * sizeof(T), sizeof(T)); + } + element_count = other.element_count; + } + } + } + + /** + * @brief Move constructor + * @param other The vector to move from + */ + VectorHIMEM(VectorHIMEM&& other) noexcept + : memory(std::move(other.memory)), + element_count(other.element_count), + element_capacity(other.element_capacity) { + other.element_count = 0; + other.element_capacity = 0; + } + + /** + * @brief Initializer list constructor + * @param init The initializer list to copy from + */ + VectorHIMEM(std::initializer_list init) { + if (init.size() > 0) { + if (reallocate(init.size())) { + size_t i = 0; + for (const auto& item : init) { + memory.write(&item, i * sizeof(T), sizeof(T)); + ++i; + } + element_count = init.size(); + } + } + } + + /** + * @brief Destructor - ensures all elements are properly destroyed + */ + ~VectorHIMEM() { clear(); } + + /** + * @brief Copy assignment operator + * @param other The vector to copy from + * @return Reference to this vector + */ + VectorHIMEM& operator=(const VectorHIMEM& other) { + if (this != &other) { + clear(); + if (other.element_count > 0) { + if (reallocate(other.element_count)) { + T temp; + for (size_t i = 0; i < other.element_count; ++i) { + const_cast(&other.memory)->read(&temp, i * sizeof(T), sizeof(T)); + memory.write(&temp, i * sizeof(T), sizeof(T)); + } + element_count = other.element_count; + } + } + } + return *this; + } + + /** + * @brief Move assignment operator + * @param other The vector to move from + * @return Reference to this vector + */ + VectorHIMEM& operator=(VectorHIMEM&& other) noexcept { + if (this != &other) { + clear(); + memory = std::move(other.memory); + element_count = other.element_count; + element_capacity = other.element_capacity; + other.element_count = 0; + other.element_capacity = 0; + } + return *this; + } + + /** + * @brief Initializer list assignment operator + * @param ilist The initializer list to copy from + * @return Reference to this vector + */ + VectorHIMEM& operator=(std::initializer_list ilist) { + clear(); + if (ilist.size() > 0) { + if (reallocate(ilist.size())) { + size_t i = 0; + for (const auto& item : ilist) { + memory.write(&item, i * sizeof(T), sizeof(T)); + ++i; + } + element_count = ilist.size(); + } + } + return *this; + } + + /** + * @brief Access element with bounds checking + * @param pos The position of the element + * @return Reference to the element at position pos + * @throws std::out_of_range if pos is not within the range of the vector + */ + reference at(size_type pos) { + if (pos >= element_count) { + throw std::out_of_range("VectorHIMEM: index out of range"); + } + static T temp; + memory.read(&temp, pos * sizeof(T), sizeof(T)); + return temp; + } + + /** + * @brief Access element with bounds checking (const version) + * @param pos The position of the element + * @return Const reference to the element at position pos + * @throws std::out_of_range if pos is not within the range of the vector + */ + const_reference at(size_type pos) const { + if (pos >= element_count) { + throw std::out_of_range("VectorHIMEM: index out of range"); + } + static T temp; + memory.read(&temp, pos * sizeof(T), sizeof(T)); + return temp; + } + + /** + * @brief Access element without bounds checking + * @param pos The position of the element + * @return Reference to the element at position pos + */ + reference operator[](size_type pos) { + static T temp; + memory.read(&temp, pos * sizeof(T), sizeof(T)); + return temp; + } + + // Add const version of operator[] + const_reference operator[](size_type pos) const { + static T result; + // Need to cast away const for the read operation since it doesn't modify content + HimemBlock& non_const_memory = const_cast(memory); + non_const_memory.read(&result, pos * sizeof(T), sizeof(T)); + return result; + } + + + /** + * @brief Access the first element + * @return Reference to the first element + */ + reference front() { + static T temp; + memory.read(&temp, 0, sizeof(T)); + return temp; + } + + /** + * @brief Access the first element (const version) + * @return Const reference to the first element + */ + const_reference front() const { + static T temp; + memory.read(&temp, 0, sizeof(T)); + return temp; + } + + /** + * @brief Access the last element + * @return Reference to the last element + */ + reference back() { + static T temp; + memory.read(&temp, (element_count - 1) * sizeof(T), sizeof(T)); + return temp; + } + + /** + * @brief Access the last element (const version) + * @return Const reference to the last element + */ + const_reference back() const { + static T temp; + memory.read(&temp, (element_count - 1) * sizeof(T), sizeof(T)); + return temp; + } + + /** + * @brief Check if the vector is empty + * @return true if the vector is empty, false otherwise + */ + bool empty() const { return element_count == 0; } + + /** + * @brief Get the number of elements + * @return The number of elements in the vector + */ + size_type size() const { return element_count; } + + /** + * @brief Get the maximum possible number of elements + * @return The maximum possible number of elements the vector can hold + */ + size_type max_size() const { + return std::numeric_limits::max() / sizeof(T); + } + + /** + * @brief Reserve storage + * @param new_cap The new capacity of the vector + */ + void reserve(size_type new_cap) { + if (new_cap > element_capacity) { + reallocate(new_cap); + } + } + + /** + * @brief Get the number of elements that can be held in current storage + * @return The capacity of the vector + */ + size_type capacity() const { return element_capacity; } + + /** + * @brief Clear the contents + */ + void clear() { + // We're using plain memory so no destructors to call + element_count = 0; + } + + /** + * @brief Add an element to the end + * @param value The value to append + */ + void push_back(const T& value) { + if (element_count >= element_capacity) { + size_t new_capacity = + element_capacity == 0 ? min_elements : element_capacity * 2; + if (!reallocate(new_capacity)) { + ESP_LOGE(TAG, "Failed to reallocate for push_back"); + return; + } + } + + // Write the new element at the end + memory.write(&value, element_count * sizeof(T), sizeof(T)); + ++element_count; + } + + /** + * @brief Add an element to the end by moving it + * @param value The value to append + */ + void push_back(T&& value) { + // For POD types, this is the same as the const& version + push_back(static_cast(value)); + } + + /** + * @brief Remove the last element + */ + void pop_back() { + if (element_count > 0) { + --element_count; + } + } + + /** + * @brief Change the number of elements stored + * @param count The new size of the vector + */ + void resize(size_type count) { + if (count > element_capacity) { + if (!reallocate(count)) { + return; + } + } + element_count = count; + } + + /** + * @brief Change the number of elements stored + * @param count The new size of the vector + * @param value The value to initialize new elements with + */ + void resize(size_type count, const value_type& value) { + size_t old_size = element_count; + + if (count > element_count) { + // Need to add elements + if (count > element_capacity) { + if (!reallocate(count)) { + return; + } + } + + // Initialize new elements with value + for (size_t i = old_size; i < count; ++i) { + memory.write(&value, i * sizeof(T), sizeof(T)); + } + } + + element_count = count; + } + + /** + * @brief Erase an element + * @param pos Index of the element to erase + */ + void erase(size_type pos) { + if (pos >= element_count) { + return; + } + + // Move each element down by one, overwriting the erased element + T temp; + for (size_t i = pos + 1; i < element_count; ++i) { + memory.read(&temp, i * sizeof(T), sizeof(T)); + memory.write(&temp, (i - 1) * sizeof(T), sizeof(T)); + } + + --element_count; + } + + /** + * @brief Insert an element at a specific position + * @param pos Position where the element should be inserted + * @param value The value to insert + */ + void insert(size_type pos, const T& value) { + if (pos > element_count) { + return; + } + + if (element_count >= element_capacity) { + size_t new_capacity = + element_capacity == 0 ? min_elements : element_capacity * 2; + if (!reallocate(new_capacity)) { + return; + } + } + + // Move elements up to make space + T temp; + for (size_t i = element_count; i > pos; --i) { + memory.read(&temp, (i - 1) * sizeof(T), sizeof(T)); + memory.write(&temp, i * sizeof(T), sizeof(T)); + } + + // Insert new element + memory.write(&value, pos * sizeof(T), sizeof(T)); + ++element_count; + } + + /** + * @brief Swap the contents of this vector with another + * @param other Vector to swap with + */ + void swap(VectorHIMEM& other) noexcept { + std::swap(memory, other.memory); + std::swap(element_count, other.element_count); + std::swap(element_capacity, other.element_capacity); + } + + protected: + HimemBlock memory; + size_t element_count = 0; + size_t element_capacity = 0; + static constexpr size_t min_elements = 16; // Minimum allocation size + + /** + * @brief Calculate required memory size in bytes for a given number of + * elements + * @param count Number of elements + * @return Size in bytes + */ + static size_t calculate_size_bytes(size_t count) { return count * sizeof(T); } + + /** + * @brief Reallocate memory with a new capacity + * @param new_capacity The new capacity to allocate + * @return true if reallocation was successful, false otherwise + */ + bool reallocate(size_t new_capacity) { + if (new_capacity <= element_capacity) { + return true; // No need to reallocate + } + + // Calculate new size (at least min_elements) + new_capacity = std::max(new_capacity, min_elements); + + // Create a new memory block + HimemBlock new_memory; + element_capacity = new_memory.allocate(calculate_size_bytes(new_capacity)) / sizeof(T); + if (element_capacity == 0) { + ESP_LOGE(TAG, "Failed to allocate new memory block"); + return false; + } + + // Copy existing elements if any + if (element_count > 0) { + T temp; + for (size_t i = 0; i < element_count; ++i) { + // Read from old memory + memory.read(&temp, i * sizeof(T), sizeof(T)); + + // Write to new memory + new_memory.write(&temp, i * sizeof(T), sizeof(T)); + } + } + + // Swap the memory blocks + memory = std::move(new_memory); + + return true; + } + + +}; + +/** + * @brief Equality comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if the vectors are equal, false otherwise + */ +template +bool operator==(const VectorHIMEM& lhs, const VectorHIMEM& rhs) { + if (lhs.size() != rhs.size()) { + return false; + } + + T lhs_val, rhs_val; + for (size_t i = 0; i < lhs.size(); ++i) { + lhs_val = lhs[i]; // Uses operator[] which calls read() + rhs_val = rhs[i]; + if (!(lhs_val == rhs_val)) { + return false; + } + } + + return true; +} + +/** + * @brief Inequality comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if the vectors are not equal, false otherwise + */ +template +bool operator!=(const VectorHIMEM& lhs, const VectorHIMEM& rhs) { + return !(lhs == rhs); +} + +/** + * @brief Swap the contents of two vectors + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + */ +template +void swap(VectorHIMEM& lhs, VectorHIMEM& rhs) noexcept { + lhs.swap(rhs); +} + +} // namespace esp32_psram \ No newline at end of file diff --git a/lib/esp32-psram/src/esp32-psram/VectorPSRAM.h b/lib/esp32-psram/src/esp32-psram/VectorPSRAM.h new file mode 100644 index 000000000..07bfce6c8 --- /dev/null +++ b/lib/esp32-psram/src/esp32-psram/VectorPSRAM.h @@ -0,0 +1,521 @@ +#pragma once + +#include +#include +#include +#include +#include "AllocatorPSRAM.h" + +/** + * @namespace esp32_psram + * @brief Namespace containing ESP32 PSRAM-specific implementations + */ +namespace esp32_psram { + + +/** + * @brief Equality comparison operator for allocators + * @tparam T Type of first allocator + * @tparam U Type of second allocator + * @return Always true since all instances are equivalent + */ +template +bool operator==(const AllocatorPSRAM&, const AllocatorPSRAM&) noexcept { + return true; +} + +/** + * @brief Inequality comparison operator for allocators + * @tparam T Type of first allocator + * @tparam U Type of second allocator + * @return Always false since all instances are equivalent + */ +template +bool operator!=(const AllocatorPSRAM&, const AllocatorPSRAM&) noexcept { + return false; +} + +/** + * @class VectorPSRAM + * @brief Vector implementation that uses ESP32's PSRAM for storage + * @tparam T Type of elements stored in the vector + * + * This class provides an interface identical to std::vector but allocates + * all memory in ESP32's PSRAM, which helps preserve the limited internal RAM. + * It wraps std::vector with a custom allocator that uses PSRAM. + */ +template +class VectorPSRAM { +private: + using vector_type = std::vector>; + vector_type vec; + +public: + // Type definitions + using value_type = typename vector_type::value_type; + using allocator_type = typename vector_type::allocator_type; + using size_type = typename vector_type::size_type; + using difference_type = typename vector_type::difference_type; + using reference = typename vector_type::reference; + using const_reference = typename vector_type::const_reference; + using pointer = typename vector_type::pointer; + using const_pointer = typename vector_type::const_pointer; + using iterator = typename vector_type::iterator; + using const_iterator = typename vector_type::const_iterator; + using reverse_iterator = typename vector_type::reverse_iterator; + using const_reverse_iterator = typename vector_type::const_reverse_iterator; + + /** + * @brief Default constructor - creates an empty vector + */ + VectorPSRAM() : vec(AllocatorPSRAM()) {} + + /** + * @brief Constructs a vector with the given number of default-initialized elements + * @param count The size of the vector + */ + explicit VectorPSRAM(size_type count) : vec(count, AllocatorPSRAM()) {} + + /** + * @brief Constructs a vector with the given number of copies of a value + * @param count The size of the vector + * @param value The value to initialize elements with + */ + VectorPSRAM(size_type count, const T& value) : vec(count, value, AllocatorPSRAM()) {} + + /** + * @brief Constructs a vector with the contents of the range [first, last) + * @tparam InputIt Input iterator type + * @param first Iterator to the first element in the range + * @param last Iterator to one past the last element in the range + */ + template + VectorPSRAM(InputIt first, InputIt last) : vec(first, last, AllocatorPSRAM()) {} + + /** + * @brief Copy constructor + * @param other The vector to copy from + */ + VectorPSRAM(const VectorPSRAM& other) : vec(other.vec) {} + + /** + * @brief Move constructor + * @param other The vector to move from + */ + VectorPSRAM(VectorPSRAM&& other) noexcept : vec(std::move(other.vec)) {} + + /** + * @brief Initializer list constructor + * @param init The initializer list to copy from + */ + VectorPSRAM(std::initializer_list init) : vec(init, AllocatorPSRAM()) {} + + /** + * @brief Copy assignment operator + * @param other The vector to copy from + * @return Reference to this vector + */ + VectorPSRAM& operator=(const VectorPSRAM& other) { + vec = other.vec; + return *this; + } + + /** + * @brief Move assignment operator + * @param other The vector to move from + * @return Reference to this vector + */ + VectorPSRAM& operator=(VectorPSRAM&& other) noexcept { + vec = std::move(other.vec); + return *this; + } + + /** + * @brief Initializer list assignment operator + * @param ilist The initializer list to copy from + * @return Reference to this vector + */ + VectorPSRAM& operator=(std::initializer_list ilist) { + vec = ilist; + return *this; + } + + /** + * @brief Access element with bounds checking + * @param pos The position of the element + * @return Reference to the element at position pos + * @throws std::out_of_range if pos is not within the range of the vector + */ + reference at(size_type pos) { return vec.at(pos); } + + /** + * @brief Access element with bounds checking (const version) + * @param pos The position of the element + * @return Const reference to the element at position pos + * @throws std::out_of_range if pos is not within the range of the vector + */ + const_reference at(size_type pos) const { return vec.at(pos); } + + /** + * @brief Access element without bounds checking + * @param pos The position of the element + * @return Reference to the element at position pos + */ + reference operator[](size_type pos) { return vec[pos]; } + + /** + * @brief Access element without bounds checking (const version) + * @param pos The position of the element + * @return Const reference to the element at position pos + */ + const_reference operator[](size_type pos) const { return vec[pos]; } + + /** + * @brief Access the first element + * @return Reference to the first element + */ + reference front() { return vec.front(); } + + /** + * @brief Access the first element (const version) + * @return Const reference to the first element + */ + const_reference front() const { return vec.front(); } + + /** + * @brief Access the last element + * @return Reference to the last element + */ + reference back() { return vec.back(); } + + /** + * @brief Access the last element (const version) + * @return Const reference to the last element + */ + const_reference back() const { return vec.back(); } + + /** + * @brief Get pointer to the underlying array + * @return Pointer to the underlying array + */ + T* data() noexcept { return vec.data(); } + + /** + * @brief Get pointer to the underlying array (const version) + * @return Const pointer to the underlying array + */ + const T* data() const noexcept { return vec.data(); } + + /** + * @brief Get iterator to the beginning + * @return Iterator to the first element + */ + iterator begin() noexcept { return vec.begin(); } + + /** + * @brief Get const iterator to the beginning + * @return Const iterator to the first element + */ + const_iterator begin() const noexcept { return vec.begin(); } + + /** + * @brief Get const iterator to the beginning + * @return Const iterator to the first element + */ + const_iterator cbegin() const noexcept { return vec.cbegin(); } + + /** + * @brief Get iterator to the end + * @return Iterator to one past the last element + */ + iterator end() noexcept { return vec.end(); } + + /** + * @brief Get const iterator to the end + * @return Const iterator to one past the last element + */ + const_iterator end() const noexcept { return vec.end(); } + + /** + * @brief Get const iterator to the end + * @return Const iterator to one past the last element + */ + const_iterator cend() const noexcept { return vec.cend(); } + + /** + * @brief Get reverse iterator to the beginning + * @return Reverse iterator to the first element + */ + reverse_iterator rbegin() noexcept { return vec.rbegin(); } + + /** + * @brief Get const reverse iterator to the beginning + * @return Const reverse iterator to the first element + */ + const_reverse_iterator rbegin() const noexcept { return vec.rbegin(); } + + /** + * @brief Get const reverse iterator to the beginning + * @return Const reverse iterator to the first element + */ + const_reverse_iterator crbegin() const noexcept { return vec.crbegin(); } + + /** + * @brief Get reverse iterator to the end + * @return Reverse iterator to one past the last element + */ + reverse_iterator rend() noexcept { return vec.rend(); } + + /** + * @brief Get const reverse iterator to the end + * @return Const reverse iterator to one past the last element + */ + const_reverse_iterator rend() const noexcept { return vec.rend(); } + + /** + * @brief Get const reverse iterator to the end + * @return Const reverse iterator to one past the last element + */ + const_reverse_iterator crend() const noexcept { return vec.crend(); } + + /** + * @brief Check if the vector is empty + * @return true if the vector is empty, false otherwise + */ + bool empty() const noexcept { return vec.empty(); } + + /** + * @brief Get the number of elements + * @return The number of elements in the vector + */ + size_type size() const noexcept { return vec.size(); } + + /** + * @brief Get the maximum possible number of elements + * @return The maximum possible number of elements the vector can hold + */ + size_type max_size() const noexcept { return vec.max_size(); } + + /** + * @brief Reserve storage + * @param new_cap The new capacity of the vector + * @throws std::length_error if new_cap > max_size() + */ + void reserve(size_type new_cap) { vec.reserve(new_cap); } + + /** + * @brief Get the number of elements that can be held in current storage + * @return The capacity of the vector + */ + size_type capacity() const noexcept { return vec.capacity(); } + + /** + * @brief Reduce memory usage by freeing unused memory + */ + void shrink_to_fit() { vec.shrink_to_fit(); } + + /** + * @brief Clear the contents + */ + void clear() noexcept { vec.clear(); } + + /** + * @brief Insert an element + * @param pos Iterator to the position before which the element will be inserted + * @param value The value to insert + * @return Iterator to the inserted element + */ + iterator insert(const_iterator pos, const T& value) { return vec.insert(pos, value); } + + /** + * @brief Insert an element by moving it + * @param pos Iterator to the position before which the element will be inserted + * @param value The value to insert + * @return Iterator to the inserted element + */ + iterator insert(const_iterator pos, T&& value) { return vec.insert(pos, std::move(value)); } + + /** + * @brief Insert multiple copies of an element + * @param pos Iterator to the position before which the elements will be inserted + * @param count Number of copies to insert + * @param value The value to insert + * @return Iterator to the first inserted element + */ + iterator insert(const_iterator pos, size_type count, const T& value) { return vec.insert(pos, count, value); } + + /** + * @brief Insert elements from a range + * @tparam InputIt Input iterator type + * @param pos Iterator to the position before which the elements will be inserted + * @param first Iterator to the first element in the range + * @param last Iterator to one past the last element in the range + * @return Iterator to the first inserted element + */ + template + iterator insert(const_iterator pos, InputIt first, InputIt last) { return vec.insert(pos, first, last); } + + /** + * @brief Insert elements from an initializer list + * @param pos Iterator to the position before which the elements will be inserted + * @param ilist The initializer list to insert from + * @return Iterator to the first inserted element + */ + iterator insert(const_iterator pos, std::initializer_list ilist) { return vec.insert(pos, ilist); } + + /** + * @brief Construct an element in-place + * @tparam Args Types of arguments to forward to the constructor + * @param pos Iterator to the position before which the element will be constructed + * @param args Arguments to forward to the constructor + * @return Iterator to the inserted element + */ + template + iterator emplace(const_iterator pos, Args&&... args) { return vec.emplace(pos, std::forward(args)...); } + + /** + * @brief Erase an element + * @param pos Iterator to the element to erase + * @return Iterator to the element after the erased element + */ + iterator erase(const_iterator pos) { return vec.erase(pos); } + + /** + * @brief Erase a range of elements + * @param first Iterator to the first element to erase + * @param last Iterator to one past the last element to erase + * @return Iterator to the element after the erased range + */ + iterator erase(const_iterator first, const_iterator last) { return vec.erase(first, last); } + + /** + * @brief Add an element to the end + * @param value The value to append + */ + void push_back(const T& value) { vec.push_back(value); } + + /** + * @brief Add an element to the end by moving it + * @param value The value to append + */ + void push_back(T&& value) { vec.push_back(std::move(value)); } + + /** + * @brief Construct an element in-place at the end + * @tparam Args Types of arguments to forward to the constructor + * @param args Arguments to forward to the constructor + * @return Reference to the inserted element + */ + template + reference emplace_back(Args&&... args) { return vec.emplace_back(std::forward(args)...); } + + /** + * @brief Remove the last element + */ + void pop_back() { vec.pop_back(); } + + /** + * @brief Change the number of elements stored + * @param count The new size of the vector + */ + void resize(size_type count) { vec.resize(count); } + + /** + * @brief Change the number of elements stored + * @param count The new size of the vector + * @param value The value to initialize new elements with + */ + void resize(size_type count, const value_type& value) { vec.resize(count, value); } + + /** + * @brief Swap the contents + * @param other Vector to swap with + */ + void swap(VectorPSRAM& other) noexcept { vec.swap(other.vec); } +}; + +/** + * @brief Equality comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if the vectors are equal, false otherwise + */ +template +bool operator==(const VectorPSRAM& lhs, const VectorPSRAM& rhs) { + return std::equal(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); +} + +/** + * @brief Inequality comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if the vectors are not equal, false otherwise + */ +template +bool operator!=(const VectorPSRAM& lhs, const VectorPSRAM& rhs) { + return !(lhs == rhs); +} + +/** + * @brief Less than comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if lhs is lexicographically less than rhs, false otherwise + */ +template +bool operator<(const VectorPSRAM& lhs, const VectorPSRAM& rhs) { + return std::lexicographical_compare(lhs.begin(), lhs.end(), rhs.begin(), rhs.end()); +} + +/** + * @brief Less than or equal comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if lhs is lexicographically less than or equal to rhs, false otherwise + */ +template +bool operator<=(const VectorPSRAM& lhs, const VectorPSRAM& rhs) { + return !(rhs < lhs); +} + +/** + * @brief Greater than comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if lhs is lexicographically greater than rhs, false otherwise + */ +template +bool operator>(const VectorPSRAM& lhs, const VectorPSRAM& rhs) { + return rhs < lhs; +} + +/** + * @brief Greater than or equal comparison operator + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + * @return true if lhs is lexicographically greater than or equal to rhs, false otherwise + */ +template +bool operator>=(const VectorPSRAM& lhs, const VectorPSRAM& rhs) { + return !(lhs < rhs); +} + +/** + * @brief Swap the contents of two vectors + * @tparam T Type of elements in the vectors + * @param lhs First vector + * @param rhs Second vector + */ +template +void swap(VectorPSRAM& lhs, VectorPSRAM& rhs) noexcept { + lhs.swap(rhs); +} + +} // namespace esp32_psram + diff --git a/lib/espMqttClient/src/MqttClient.cpp b/lib/espMqttClient/src/MqttClient.cpp index dc21f7456..a5d498e2c 100644 --- a/lib/espMqttClient/src/MqttClient.cpp +++ b/lib/espMqttClient/src/MqttClient.cpp @@ -74,7 +74,7 @@ MqttClient::MqttClient(espMqttClientTypes::UseInternalTask useInternalTask, uint MqttClient::~MqttClient() { disconnect(true); - _clearQueue(2); + clearQueue(true); #if defined(ARDUINO_ARCH_ESP32) vSemaphoreDelete(_xSemaphore); if (_useInternalTask == espMqttClientTypes::UseInternalTask::YES) { diff --git a/lib/semver/Semver200_parser.cpp b/lib/semver/Semver200_parser.cpp index 83385208c..e5956be0e 100644 --- a/lib/semver/Semver200_parser.cpp +++ b/lib/semver/Semver200_parser.cpp @@ -50,7 +50,7 @@ inline Transition mkx(const char c, Parser_state p, State_transition_hook pth) { } inline void Parse_error(const std::string & s) { - // emsesp::EMSESP::logger().err("parse error: %s", s.c_str()); + // EMSESP::logger().err("parse error: %s", s.c_str()); } /// Advance parser state machine by a single step. diff --git a/lib/uuid-console/src/shell_log.cpp b/lib/uuid-console/src/shell_log.cpp index decf47e67..0ae54eab7 100644 --- a/lib/uuid-console/src/shell_log.cpp +++ b/lib/uuid-console/src/shell_log.cpp @@ -106,7 +106,15 @@ void Shell::output_logs() { } while (1) { - print(uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3)); + time_t offset = time(nullptr) - uuid::get_uptime_sec(); + if (offset < 1500000000L) { + print(uuid::log::format_timestamp_ms(message.content_->uptime_ms, 3)); + } else { + time_t t1 = offset + (time_t)(message.content_->uptime_ms / 1000); + char timestr[25]; + strftime(timestr, 25, "%FT%T", localtime(&t1)); + printf("%s.%03d", timestr, (uint16_t)(message.content_->uptime_ms % 1000)); + } printf(" %c %lu: [%s] ", uuid::log::format_level_char(message.content_->level), message.id_, message.content_->name); if ((message.content_->level == uuid::log::Level::ERR) || (message.content_->level == uuid::log::Level::WARNING)) { diff --git a/lib/uuid-syslog/src/syslog.cpp b/lib/uuid-syslog/src/syslog.cpp index 9c7a7c0ab..024fa6665 100644 --- a/lib/uuid-syslog/src/syslog.cpp +++ b/lib/uuid-syslog/src/syslog.cpp @@ -17,6 +17,7 @@ */ #include "uuid/syslog.h" +#include "../../src/core/emsesp.h" #ifndef UUID_SYSLOG_HAVE_GETTIMEOFDAY #if defined(ARDUINO_ARCH_ESP8266) || defined(ARDUINO_ARCH_ESP32) @@ -122,7 +123,6 @@ void SyslogService::remove_queued_messages(uuid::log::Level level) { } log_message_id_ -= offset; - log_message_fails_ += offset; } void SyslogService::log_level(uuid::log::Level level) { @@ -231,8 +231,7 @@ SyslogService::QueuedLogMessage::QueuedLogMessage(unsigned long id, std::shared_ : id_(id) , content_(std::move(content)) { // Added for EMS-ESP - // if (time_good_ || emsesp::EMSESP::system_.network_connected()) { - if (time_good_) { + if (time_good_ || emsesp::EMSESP::system_.network_connected()) { #if UUID_SYSLOG_HAVE_GETTIMEOFDAY if (gettimeofday(&time_, nullptr) != 0) { time_.tv_sec = (time_t)-1; @@ -347,7 +346,6 @@ void SyslogService::loop() { } bool SyslogService::can_transmit() { - // TODO this should be checked also for Eth if (!host_.empty() && (uint32_t)ip_ == 0) { WiFi.hostByName(host_.c_str(), ip_); } @@ -524,7 +522,7 @@ bool SyslogService::transmit(const QueuedLogMessage & message) { // (unsigned long)message.time_.tv_usec); // added for EMS-ESP - udp_.printf("%04u-%02u-%02uT%02u:%02u:%02u.%06lu%+02d:%02d", + udp_.printf("%04u-%02u-%02uT%02u:%02u:%02u.%06lu%+03d:%02d", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, @@ -538,7 +536,7 @@ bool SyslogService::transmit(const QueuedLogMessage & message) { udp_.print('-'); } - udp_.printf(" %s %s - - - ", hostname_.c_str(), message.content_->name); + udp_.printf(" %s %s - - - ", hostname_.c_str(), message.content_->name ? message.content_->name : "emsesp"); char id_c_str[15]; snprintf(id_c_str, sizeof(id_c_str), " %lu: ", message.id_); diff --git a/lib_standalone/Arduino.cpp b/lib_standalone/Arduino.cpp index 69cb01aef..16b286985 100644 --- a/lib_standalone/Arduino.cpp +++ b/lib_standalone/Arduino.cpp @@ -147,5 +147,6 @@ double ledcSetup(uint8_t chan, double freq, uint8_t bit_num) { void ledcAttachPin(uint8_t pin, uint8_t chan) {}; void ledcWrite(uint8_t chan, uint32_t duty) {}; void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) {}; +void rgbLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val) {}; #endif \ No newline at end of file diff --git a/lib_standalone/Arduino.h b/lib_standalone/Arduino.h index adecdc7d0..1ac2aea3b 100644 --- a/lib_standalone/Arduino.h +++ b/lib_standalone/Arduino.h @@ -59,6 +59,8 @@ typedef double double_t; #define snprintf snprintf_P // to keep backwards compatibility +#define IRAM_ATTR + void pinMode(uint8_t pin, uint8_t mode); void digitalWrite(uint8_t pin, uint8_t value); int digitalRead(uint8_t pin); @@ -72,6 +74,7 @@ double ledcSetup(uint8_t chan, double freq, uint8_t bit_num); void ledcAttachPin(uint8_t pin, uint8_t chan); void ledcWrite(uint8_t chan, uint32_t duty); void neopixelWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); +void rgbLedWrite(uint8_t pin, uint8_t red_val, uint8_t green_val, uint8_t blue_val); #define PROGMEM #define PGM_P const char * diff --git a/lib_standalone/ArduinoJson.h b/lib_standalone/ArduinoJson.h index 1d27ef04a..5fbf79b27 100644 --- a/lib_standalone/ArduinoJson.h +++ b/lib_standalone/ArduinoJson.h @@ -1,5 +1,5 @@ // ArduinoJson - https://arduinojson.org -// Copyright © 2014-2024, Benoit BLANCHON +// Copyright © 2014-2025, Benoit BLANCHON // MIT License #pragma once @@ -7,220 +7,220 @@ #ifdef __cplusplus #if __cplusplus < 201103L && (!defined(_MSC_VER) || _MSC_VER < 1910) -# error ArduinoJson requires C++11 or newer. Configure your compiler for C++11 or downgrade ArduinoJson to 6.20. +#error ArduinoJson requires C++11 or newer. Configure your compiler for C++11 or downgrade ArduinoJson to 6.20. #endif #ifndef ARDUINOJSON_ENABLE_STD_STREAM -# ifdef __has_include -# if __has_include() && \ +#ifdef __has_include +#if __has_include() && \ __has_include() && \ !defined(min) && \ !defined(max) -# define ARDUINOJSON_ENABLE_STD_STREAM 1 -# else -# define ARDUINOJSON_ENABLE_STD_STREAM 0 -# endif -# else -# ifdef ARDUINO -# define ARDUINOJSON_ENABLE_STD_STREAM 0 -# else -# define ARDUINOJSON_ENABLE_STD_STREAM 1 -# endif -# endif +#define ARDUINOJSON_ENABLE_STD_STREAM 1 +#else +#define ARDUINOJSON_ENABLE_STD_STREAM 0 +#endif +#else +#ifdef ARDUINO +#define ARDUINOJSON_ENABLE_STD_STREAM 0 +#else +#define ARDUINOJSON_ENABLE_STD_STREAM 1 +#endif +#endif #endif #ifndef ARDUINOJSON_ENABLE_STD_STRING -# ifdef __has_include -# if __has_include() && !defined(min) && !defined(max) -# define ARDUINOJSON_ENABLE_STD_STRING 1 -# else -# define ARDUINOJSON_ENABLE_STD_STRING 0 -# endif -# else -# ifdef ARDUINO -# define ARDUINOJSON_ENABLE_STD_STRING 0 -# else -# define ARDUINOJSON_ENABLE_STD_STRING 1 -# endif -# endif +#ifdef __has_include +#if __has_include() && !defined(min) && !defined(max) +#define ARDUINOJSON_ENABLE_STD_STRING 1 +#else +#define ARDUINOJSON_ENABLE_STD_STRING 0 +#endif +#else +#ifdef ARDUINO +#define ARDUINOJSON_ENABLE_STD_STRING 0 +#else +#define ARDUINOJSON_ENABLE_STD_STRING 1 +#endif +#endif #endif #ifndef ARDUINOJSON_ENABLE_STRING_VIEW -# ifdef __has_include -# if __has_include() && __cplusplus >= 201703L -# define ARDUINOJSON_ENABLE_STRING_VIEW 1 -# else -# define ARDUINOJSON_ENABLE_STRING_VIEW 0 -# endif -# else -# define ARDUINOJSON_ENABLE_STRING_VIEW 0 -# endif +#ifdef __has_include +#if __has_include() && __cplusplus >= 201703L +#define ARDUINOJSON_ENABLE_STRING_VIEW 1 +#else +#define ARDUINOJSON_ENABLE_STRING_VIEW 0 +#endif +#else +#define ARDUINOJSON_ENABLE_STRING_VIEW 0 +#endif #endif #ifndef ARDUINOJSON_SIZEOF_POINTER -# if defined(__SIZEOF_POINTER__) -# define ARDUINOJSON_SIZEOF_POINTER __SIZEOF_POINTER__ -# elif defined(_WIN64) && _WIN64 -# define ARDUINOJSON_SIZEOF_POINTER 8 // 64 bits -# else -# define ARDUINOJSON_SIZEOF_POINTER 4 // assume 32 bits otherwise -# endif +#if defined(__SIZEOF_POINTER__) +#define ARDUINOJSON_SIZEOF_POINTER __SIZEOF_POINTER__ +#elif defined(_WIN64) && _WIN64 +#define ARDUINOJSON_SIZEOF_POINTER 8 // 64 bits +#else +#define ARDUINOJSON_SIZEOF_POINTER 4 // assume 32 bits otherwise +#endif #endif #ifndef ARDUINOJSON_USE_DOUBLE -# if ARDUINOJSON_SIZEOF_POINTER >= 4 // 32 & 64 bits systems -# define ARDUINOJSON_USE_DOUBLE 1 -# else -# define ARDUINOJSON_USE_DOUBLE 0 -# endif +#if ARDUINOJSON_SIZEOF_POINTER >= 4 // 32 & 64 bits systems +#define ARDUINOJSON_USE_DOUBLE 1 +#else +#define ARDUINOJSON_USE_DOUBLE 0 +#endif #endif #ifndef ARDUINOJSON_USE_LONG_LONG -# if ARDUINOJSON_SIZEOF_POINTER >= 4 // 32 & 64 bits systems -# define ARDUINOJSON_USE_LONG_LONG 1 -# else -# define ARDUINOJSON_USE_LONG_LONG 0 -# endif +#if ARDUINOJSON_SIZEOF_POINTER >= 4 // 32 & 64 bits systems +#define ARDUINOJSON_USE_LONG_LONG 1 +#else +#define ARDUINOJSON_USE_LONG_LONG 0 +#endif #endif #ifndef ARDUINOJSON_DEFAULT_NESTING_LIMIT -# define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10 +#define ARDUINOJSON_DEFAULT_NESTING_LIMIT 10 #endif #ifndef ARDUINOJSON_SLOT_ID_SIZE -# if ARDUINOJSON_SIZEOF_POINTER <= 2 -# define ARDUINOJSON_SLOT_ID_SIZE 1 -# elif ARDUINOJSON_SIZEOF_POINTER == 4 -# define ARDUINOJSON_SLOT_ID_SIZE 2 -# else -# define ARDUINOJSON_SLOT_ID_SIZE 4 -# endif +#if ARDUINOJSON_SIZEOF_POINTER <= 2 +#define ARDUINOJSON_SLOT_ID_SIZE 1 +#elif ARDUINOJSON_SIZEOF_POINTER == 4 +#define ARDUINOJSON_SLOT_ID_SIZE 2 +#else +#define ARDUINOJSON_SLOT_ID_SIZE 4 +#endif #endif #ifndef ARDUINOJSON_POOL_CAPACITY -# if ARDUINOJSON_SLOT_ID_SIZE == 1 -# define ARDUINOJSON_POOL_CAPACITY 16 // 96 bytes -# elif ARDUINOJSON_SLOT_ID_SIZE == 2 -# define ARDUINOJSON_POOL_CAPACITY 128 // 1024 bytes -# else -# define ARDUINOJSON_POOL_CAPACITY 256 // 4096 bytes -# endif +#if ARDUINOJSON_SLOT_ID_SIZE == 1 +#define ARDUINOJSON_POOL_CAPACITY 16 // 96 bytes +#elif ARDUINOJSON_SLOT_ID_SIZE == 2 +#define ARDUINOJSON_POOL_CAPACITY 128 // 1024 bytes +#else +#define ARDUINOJSON_POOL_CAPACITY 256 // 4096 bytes +#endif #endif #ifndef ARDUINOJSON_INITIAL_POOL_COUNT -# define ARDUINOJSON_INITIAL_POOL_COUNT 4 +#define ARDUINOJSON_INITIAL_POOL_COUNT 4 #endif #ifndef ARDUINOJSON_AUTO_SHRINK -# if ARDUINOJSON_SIZEOF_POINTER <= 2 -# define ARDUINOJSON_AUTO_SHRINK 0 -# else -# define ARDUINOJSON_AUTO_SHRINK 1 -# endif +#if ARDUINOJSON_SIZEOF_POINTER <= 2 +#define ARDUINOJSON_AUTO_SHRINK 0 +#else +#define ARDUINOJSON_AUTO_SHRINK 1 +#endif #endif #ifndef ARDUINOJSON_STRING_LENGTH_SIZE -# if ARDUINOJSON_SIZEOF_POINTER <= 2 -# define ARDUINOJSON_STRING_LENGTH_SIZE 1 // up to 255 characters -# else -# define ARDUINOJSON_STRING_LENGTH_SIZE 2 // up to 65535 characters -# endif +#if ARDUINOJSON_SIZEOF_POINTER <= 2 +#define ARDUINOJSON_STRING_LENGTH_SIZE 1 // up to 255 characters +#else +#define ARDUINOJSON_STRING_LENGTH_SIZE 2 // up to 65535 characters +#endif #endif #ifdef ARDUINO -# ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING -# define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 -# endif -# ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM -# define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1 -# endif -# ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT -# define ARDUINOJSON_ENABLE_ARDUINO_PRINT 1 -# endif -# ifndef ARDUINOJSON_ENABLE_PROGMEM -# define ARDUINOJSON_ENABLE_PROGMEM 1 -# endif -#else // ARDUINO -# ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING -# define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 -# endif -# ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM -# define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0 -# endif -# ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT -# define ARDUINOJSON_ENABLE_ARDUINO_PRINT 0 -# endif -# ifndef ARDUINOJSON_ENABLE_PROGMEM -# ifdef __AVR__ -# define ARDUINOJSON_ENABLE_PROGMEM 1 -# else -# define ARDUINOJSON_ENABLE_PROGMEM 0 -# endif -# endif -#endif // ARDUINO +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1 +#endif +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM +#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 1 +#endif +#ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT +#define ARDUINOJSON_ENABLE_ARDUINO_PRINT 1 +#endif +#ifndef ARDUINOJSON_ENABLE_PROGMEM +#define ARDUINOJSON_ENABLE_PROGMEM 1 +#endif +#else // ARDUINO +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STRING +#define ARDUINOJSON_ENABLE_ARDUINO_STRING 0 +#endif +#ifndef ARDUINOJSON_ENABLE_ARDUINO_STREAM +#define ARDUINOJSON_ENABLE_ARDUINO_STREAM 0 +#endif +#ifndef ARDUINOJSON_ENABLE_ARDUINO_PRINT +#define ARDUINOJSON_ENABLE_ARDUINO_PRINT 0 +#endif +#ifndef ARDUINOJSON_ENABLE_PROGMEM +#ifdef __AVR__ +#define ARDUINOJSON_ENABLE_PROGMEM 1 +#else +#define ARDUINOJSON_ENABLE_PROGMEM 0 +#endif +#endif +#endif // ARDUINO #ifndef ARDUINOJSON_DECODE_UNICODE -# define ARDUINOJSON_DECODE_UNICODE 1 +#define ARDUINOJSON_DECODE_UNICODE 1 #endif #ifndef ARDUINOJSON_ENABLE_COMMENTS -# define ARDUINOJSON_ENABLE_COMMENTS 0 +#define ARDUINOJSON_ENABLE_COMMENTS 0 #endif #ifndef ARDUINOJSON_ENABLE_NAN -# define ARDUINOJSON_ENABLE_NAN 0 +#define ARDUINOJSON_ENABLE_NAN 0 #endif #ifndef ARDUINOJSON_ENABLE_INFINITY -# define ARDUINOJSON_ENABLE_INFINITY 0 +#define ARDUINOJSON_ENABLE_INFINITY 0 #endif #ifndef ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD -# define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7 +#define ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD 1e7 #endif #ifndef ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD -# define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5 +#define ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD 1e-5 #endif #ifndef ARDUINOJSON_LITTLE_ENDIAN -# if defined(_MSC_VER) || \ - (defined(__BYTE_ORDER__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || \ - defined(__LITTLE_ENDIAN__) || defined(__i386) || defined(__x86_64) -# define ARDUINOJSON_LITTLE_ENDIAN 1 -# else -# define ARDUINOJSON_LITTLE_ENDIAN 0 -# endif +#if defined(_MSC_VER) || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN__) || defined(__i386) \ + || defined(__x86_64) +#define ARDUINOJSON_LITTLE_ENDIAN 1 +#else +#define ARDUINOJSON_LITTLE_ENDIAN 0 +#endif #endif #ifndef ARDUINOJSON_ENABLE_ALIGNMENT -# if defined(__AVR) -# define ARDUINOJSON_ENABLE_ALIGNMENT 0 -# else -# define ARDUINOJSON_ENABLE_ALIGNMENT 1 -# endif +#if defined(__AVR) +#define ARDUINOJSON_ENABLE_ALIGNMENT 0 +#else +#define ARDUINOJSON_ENABLE_ALIGNMENT 1 +#endif #endif #ifndef ARDUINOJSON_TAB -# define ARDUINOJSON_TAB " " +#define ARDUINOJSON_TAB " " #endif #ifndef ARDUINOJSON_STRING_BUFFER_SIZE -# define ARDUINOJSON_STRING_BUFFER_SIZE 32 +#define ARDUINOJSON_STRING_BUFFER_SIZE 32 #endif #ifndef ARDUINOJSON_DEBUG -# ifdef __PLATFORMIO_BUILD_DEBUG__ -# define ARDUINOJSON_DEBUG 1 -# else -# define ARDUINOJSON_DEBUG 0 -# endif +#ifdef __PLATFORMIO_BUILD_DEBUG__ +#define ARDUINOJSON_DEBUG 1 +#else +#define ARDUINOJSON_DEBUG 0 +#endif #endif #if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_DOUBLE -# define ARDUINOJSON_USE_EXTENSIONS 1 +#define ARDUINOJSON_USE_EXTENSIONS 1 #else -# define ARDUINOJSON_USE_EXTENSIONS 0 +#define ARDUINOJSON_USE_EXTENSIONS 0 #endif #if defined(nullptr) -# error nullptr is defined as a macro. Remove the faulty #define or #undef nullptr +#error nullptr is defined as a macro. Remove the faulty #define or #undef nullptr #endif -#if ARDUINOJSON_ENABLE_ARDUINO_STRING || ARDUINOJSON_ENABLE_ARDUINO_STREAM || \ - ARDUINOJSON_ENABLE_ARDUINO_PRINT || \ - (ARDUINOJSON_ENABLE_PROGMEM && defined(ARDUINO)) +#if ARDUINOJSON_ENABLE_ARDUINO_STRING || ARDUINOJSON_ENABLE_ARDUINO_STREAM || ARDUINOJSON_ENABLE_ARDUINO_PRINT \ + || (ARDUINOJSON_ENABLE_PROGMEM && defined(ARDUINO)) #include #endif #if !ARDUINOJSON_DEBUG -# ifdef __clang__ -# pragma clang system_header -# elif defined __GNUC__ -# pragma GCC system_header -# endif +#ifdef __clang__ +#pragma clang system_header +#elif defined __GNUC__ +#pragma GCC system_header +#endif +#endif +#ifdef true +#undef true +#endif +#ifdef false +#undef false #endif #define ARDUINOJSON_CONCAT_(A, B) A##B #define ARDUINOJSON_CONCAT2(A, B) ARDUINOJSON_CONCAT_(A, B) -#define ARDUINOJSON_CONCAT3(A, B, C) \ - ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), C) -#define ARDUINOJSON_CONCAT4(A, B, C, D) \ - ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT3(A, B, C), D) -#define ARDUINOJSON_CONCAT5(A, B, C, D, E) \ - ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT4(A, B, C, D), E) +#define ARDUINOJSON_CONCAT3(A, B, C) ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT2(A, B), C) +#define ARDUINOJSON_CONCAT4(A, B, C, D) ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT3(A, B, C), D) +#define ARDUINOJSON_CONCAT5(A, B, C, D, E) ARDUINOJSON_CONCAT2(ARDUINOJSON_CONCAT4(A, B, C, D), E) #define ARDUINOJSON_BIN2ALPHA_0000() A #define ARDUINOJSON_BIN2ALPHA_0001() B #define ARDUINOJSON_BIN2ALPHA_0010() C @@ -239,212 +239,215 @@ #define ARDUINOJSON_BIN2ALPHA_1111() P #define ARDUINOJSON_BIN2ALPHA_(A, B, C, D) ARDUINOJSON_BIN2ALPHA_##A##B##C##D() #define ARDUINOJSON_BIN2ALPHA(A, B, C, D) ARDUINOJSON_BIN2ALPHA_(A, B, C, D) -#define ARDUINOJSON_VERSION "7.3.0" +#define ARDUINOJSON_VERSION "7.4.2" #define ARDUINOJSON_VERSION_MAJOR 7 -#define ARDUINOJSON_VERSION_MINOR 3 -#define ARDUINOJSON_VERSION_REVISION 0 -#define ARDUINOJSON_VERSION_MACRO V730 +#define ARDUINOJSON_VERSION_MINOR 4 +#define ARDUINOJSON_VERSION_REVISION 2 +#define ARDUINOJSON_VERSION_MACRO V742 #ifndef ARDUINOJSON_VERSION_NAMESPACE -# define ARDUINOJSON_VERSION_NAMESPACE \ - ARDUINOJSON_CONCAT5( \ - ARDUINOJSON_VERSION_MACRO, \ - ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_PROGMEM, \ - ARDUINOJSON_USE_LONG_LONG, \ - ARDUINOJSON_USE_DOUBLE, 1), \ - ARDUINOJSON_BIN2ALPHA( \ - ARDUINOJSON_ENABLE_NAN, ARDUINOJSON_ENABLE_INFINITY, \ - ARDUINOJSON_ENABLE_COMMENTS, ARDUINOJSON_DECODE_UNICODE), \ - ARDUINOJSON_SLOT_ID_SIZE, ARDUINOJSON_STRING_LENGTH_SIZE) +#define ARDUINOJSON_VERSION_NAMESPACE \ + ARDUINOJSON_CONCAT5(ARDUINOJSON_VERSION_MACRO, \ + ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_PROGMEM, ARDUINOJSON_USE_LONG_LONG, ARDUINOJSON_USE_DOUBLE, 1), \ + ARDUINOJSON_BIN2ALPHA(ARDUINOJSON_ENABLE_NAN, ARDUINOJSON_ENABLE_INFINITY, ARDUINOJSON_ENABLE_COMMENTS, ARDUINOJSON_DECODE_UNICODE), \ + ARDUINOJSON_SLOT_ID_SIZE, \ + ARDUINOJSON_STRING_LENGTH_SIZE) #endif -#define ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE \ - namespace ArduinoJson { \ - inline namespace ARDUINOJSON_VERSION_NAMESPACE { -#define ARDUINOJSON_END_PUBLIC_NAMESPACE \ - } \ - } -#define ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE \ - namespace ArduinoJson { \ - inline namespace ARDUINOJSON_VERSION_NAMESPACE { \ - namespace detail { -#define ARDUINOJSON_END_PRIVATE_NAMESPACE \ - } \ - } \ - } +#define ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE \ + namespace ArduinoJson { \ + inline namespace ARDUINOJSON_VERSION_NAMESPACE { +#define ARDUINOJSON_END_PUBLIC_NAMESPACE \ + } \ + } +#define ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE \ + namespace ArduinoJson { \ + inline namespace ARDUINOJSON_VERSION_NAMESPACE { \ + namespace detail { +#define ARDUINOJSON_END_PRIVATE_NAMESPACE \ + } \ + } \ + } ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE template struct Converter; ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -class InvalidConversion; // Error here? See https://arduinojson.org/v7/invalid-conversion/ +class InvalidConversion; // Error here? See https://arduinojson.org/v7/invalid-conversion/ ARDUINOJSON_END_PRIVATE_NAMESPACE #include #include #include ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE class Allocator { - public: - virtual void* allocate(size_t size) = 0; - virtual void deallocate(void* ptr) = 0; - virtual void* reallocate(void* ptr, size_t new_size) = 0; - protected: - ~Allocator() = default; + public: + virtual void * allocate(size_t size) = 0; + virtual void deallocate(void * ptr) = 0; + virtual void * reallocate(void * ptr, size_t new_size) = 0; + + protected: + ~Allocator() = default; }; namespace detail { class DefaultAllocator : public Allocator { - public: - void* allocate(size_t size) override { - return malloc(size); - } - void deallocate(void* ptr) override { - free(ptr); - } - void* reallocate(void* ptr, size_t new_size) override { - return realloc(ptr, new_size); - } - static Allocator* instance() { - static DefaultAllocator allocator; - return &allocator; - } - private: - DefaultAllocator() = default; - ~DefaultAllocator() = default; + public: + void * allocate(size_t size) override { + return malloc(size); + } + void deallocate(void * ptr) override { + free(ptr); + } + void * reallocate(void * ptr, size_t new_size) override { + return realloc(ptr, new_size); + } + static Allocator * instance() { + static DefaultAllocator allocator; + return &allocator; + } + + private: + DefaultAllocator() = default; + ~DefaultAllocator() = default; }; -} // namespace detail +} // namespace detail ARDUINOJSON_END_PUBLIC_NAMESPACE #if ARDUINOJSON_DEBUG #include -# define ARDUINOJSON_ASSERT(X) assert(X) +#define ARDUINOJSON_ASSERT(X) assert(X) #else -# define ARDUINOJSON_ASSERT(X) ((void)0) +#define ARDUINOJSON_ASSERT(X) ((void)0) #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template struct uint_; template <> struct uint_<8> { - using type = uint8_t; + using type = uint8_t; }; template <> struct uint_<16> { - using type = uint16_t; + using type = uint16_t; }; template <> struct uint_<32> { - using type = uint32_t; + using type = uint32_t; }; template -using uint_t = typename uint_::type; -using SlotId = uint_t; -using SlotCount = SlotId; +using uint_t = typename uint_::type; +using SlotId = uint_t; +using SlotCount = SlotId; const SlotId NULL_SLOT = SlotId(-1); template class Slot { - public: - Slot() : ptr_(nullptr), id_(NULL_SLOT) {} - Slot(T* p, SlotId id) : ptr_(p), id_(id) { - ARDUINOJSON_ASSERT((p == nullptr) == (id == NULL_SLOT)); - } - explicit operator bool() const { - return ptr_ != nullptr; - } - SlotId id() const { - return id_; - } - T* ptr() const { - return ptr_; - } - T* operator->() const { - ARDUINOJSON_ASSERT(ptr_ != nullptr); - return ptr_; - } - private: - T* ptr_; - SlotId id_; + public: + Slot() + : ptr_(nullptr) + , id_(NULL_SLOT) { + } + Slot(T * p, SlotId id) + : ptr_(p) + , id_(id) { + ARDUINOJSON_ASSERT((p == nullptr) == (id == NULL_SLOT)); + } + explicit operator bool() const { + return ptr_ != nullptr; + } + SlotId id() const { + return id_; + } + T * ptr() const { + return ptr_; + } + T * operator->() const { + ARDUINOJSON_ASSERT(ptr_ != nullptr); + return ptr_; + } + + private: + T * ptr_; + SlotId id_; }; template class MemoryPool { - public: - void create(SlotCount cap, Allocator* allocator) { - ARDUINOJSON_ASSERT(cap > 0); - slots_ = reinterpret_cast(allocator->allocate(slotsToBytes(cap))); - capacity_ = slots_ ? cap : 0; - usage_ = 0; - } - void destroy(Allocator* allocator) { - if (slots_) - allocator->deallocate(slots_); - slots_ = nullptr; - capacity_ = 0; - usage_ = 0; - } - Slot allocSlot() { - if (!slots_) - return {}; - if (usage_ >= capacity_) - return {}; - auto index = usage_++; - return {slots_ + index, SlotId(index)}; - } - T* getSlot(SlotId id) const { - ARDUINOJSON_ASSERT(id < usage_); - return slots_ + id; - } - void clear() { - usage_ = 0; - } - void shrinkToFit(Allocator* allocator) { - auto newSlots = reinterpret_cast( - allocator->reallocate(slots_, slotsToBytes(usage_))); - if (newSlots) { - slots_ = newSlots; - capacity_ = usage_; + public: + void create(SlotCount cap, Allocator * allocator) { + ARDUINOJSON_ASSERT(cap > 0); + slots_ = reinterpret_cast(allocator->allocate(slotsToBytes(cap))); + capacity_ = slots_ ? cap : 0; + usage_ = 0; } - } - SlotCount usage() const { - return usage_; - } - static SlotCount bytesToSlots(size_t n) { - return static_cast(n / sizeof(T)); - } - static size_t slotsToBytes(SlotCount n) { - return n * sizeof(T); - } - private: - SlotCount capacity_; - SlotCount usage_; - T* slots_; + void destroy(Allocator * allocator) { + if (slots_) + allocator->deallocate(slots_); + slots_ = nullptr; + capacity_ = 0; + usage_ = 0; + } + Slot allocSlot() { + if (!slots_) + return {}; + if (usage_ >= capacity_) + return {}; + auto index = usage_++; + return {slots_ + index, SlotId(index)}; + } + T * getSlot(SlotId id) const { + ARDUINOJSON_ASSERT(id < usage_); + return slots_ + id; + } + void clear() { + usage_ = 0; + } + void shrinkToFit(Allocator * allocator) { + auto newSlots = reinterpret_cast(allocator->reallocate(slots_, slotsToBytes(usage_))); + if (newSlots) { + slots_ = newSlots; + capacity_ = usage_; + } + } + SlotCount usage() const { + return usage_; + } + static SlotCount bytesToSlots(size_t n) { + return static_cast(n / sizeof(T)); + } + static size_t slotsToBytes(SlotCount n) { + return n * sizeof(T); + } + + private: + SlotCount capacity_; + SlotCount usage_; + T * slots_; }; template struct conditional { - using type = TrueType; + using type = TrueType; }; template struct conditional { - using type = FalseType; + using type = FalseType; }; template -using conditional_t = - typename conditional::type; +using conditional_t = typename conditional::type; template struct decay { - using type = T; + using type = T; }; template -struct decay : decay {}; +struct decay : decay {}; template -struct decay : decay {}; +struct decay : decay {}; template -struct decay : decay {}; +struct decay : decay {}; template -struct decay : decay {}; +struct decay : decay {}; template using decay_t = typename decay::type; template struct enable_if {}; template struct enable_if { - using type = T; + using type = T; }; template using enable_if_t = typename enable_if::type; @@ -452,23 +455,23 @@ template struct function_traits; template struct function_traits { - using return_type = ReturnType; - using arg1_type = Arg1; + using return_type = ReturnType; + using arg1_type = Arg1; }; template struct function_traits { - using return_type = ReturnType; - using arg1_type = Arg1; - using arg2_type = Arg2; + using return_type = ReturnType; + using arg1_type = Arg1; + using arg2_type = Arg2; }; template struct integral_constant { - static const T value = v; + static const T value = v; }; template using bool_constant = integral_constant; -using true_type = bool_constant; -using false_type = bool_constant; +using true_type = bool_constant; +using false_type = bool_constant; template struct is_array : false_type {}; template @@ -477,35 +480,35 @@ template struct is_array : true_type {}; template struct remove_reference { - using type = T; + using type = T; }; template -struct remove_reference { - using type = T; +struct remove_reference { + using type = T; }; template using remove_reference_t = typename remove_reference::type; template class is_base_of { - protected: // <- to avoid GCC's "all member functions in class are private" - static int probe(const TBase*); - static char probe(...); - public: - static const bool value = - sizeof(probe(reinterpret_cast*>(0))) == - sizeof(int); + protected: // <- to avoid GCC's "all member functions in class are private" + static int probe(const TBase *); + static char probe(...); + + public: + static const bool value = sizeof(probe(reinterpret_cast *>(0))) == sizeof(int); }; template -T&& declval(); +T && declval(); template struct is_class { - protected: // <- to avoid GCC's "all member functions in class are private" - template - static int probe(void (U::*)(void)); - template - static char probe(...); - public: - static const bool value = sizeof(probe(0)) == sizeof(int); + protected: // <- to avoid GCC's "all member functions in class are private" + template + static int probe(void (U::*)(void)); + template + static char probe(...); + + public: + static const bool value = sizeof(probe(0)) == sizeof(int); }; template struct is_const : false_type {}; @@ -513,28 +516,29 @@ template struct is_const : true_type {}; ARDUINOJSON_END_PRIVATE_NAMESPACE #ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable : 4244) +#pragma warning(push) +#pragma warning(disable : 4244) #endif #ifdef __ICCARM__ -#pragma diag_suppress=Pa093 +#pragma diag_suppress = Pa093 #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template struct is_convertible { - protected: // <- to avoid GCC's "all member functions in class are private" - static int probe(To); - static char probe(...); - static const From& from_; - public: - static const bool value = sizeof(probe(from_)) == sizeof(int); + protected: // <- to avoid GCC's "all member functions in class are private" + static int probe(To); + static char probe(...); + static const From & from_; + + public: + static const bool value = sizeof(probe(from_)) == sizeof(int); }; ARDUINOJSON_END_PRIVATE_NAMESPACE #ifdef _MSC_VER -# pragma warning(pop) +#pragma warning(pop) #endif #ifdef __ICCARM__ -#pragma diag_default=Pa093 +#pragma diag_default = Pa093 #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template @@ -543,72 +547,56 @@ template struct is_same : true_type {}; template struct remove_cv { - using type = T; + using type = T; }; template struct remove_cv { - using type = T; + using type = T; }; template struct remove_cv { - using type = T; + using type = T; }; template struct remove_cv { - using type = T; + using type = T; }; template using remove_cv_t = typename remove_cv::type; template -struct is_floating_point - : integral_constant>::value || - is_same>::value> {}; +struct is_floating_point : integral_constant>::value || is_same>::value> {}; template -struct is_integral : integral_constant, signed char>::value || - is_same, unsigned char>::value || - is_same, signed short>::value || - is_same, unsigned short>::value || - is_same, signed int>::value || - is_same, unsigned int>::value || - is_same, signed long>::value || - is_same, unsigned long>::value || - is_same, signed long long>::value || - is_same, unsigned long long>::value || - is_same, char>::value || - is_same, bool>::value> {}; +struct is_integral + : integral_constant< + bool, + is_same, signed char>::value || is_same, unsigned char>::value || is_same, signed short>::value + || is_same, unsigned short>::value || is_same, signed int>::value || is_same, unsigned int>::value + || is_same, signed long>::value || is_same, unsigned long>::value || is_same, signed long long>::value + || is_same, unsigned long long>::value || is_same, char>::value || is_same, bool>::value> {}; template struct is_enum { - static const bool value = is_convertible::value && - !is_class::value && !is_integral::value && - !is_floating_point::value; + static const bool value = is_convertible::value && !is_class::value && !is_integral::value && !is_floating_point::value; }; template struct is_pointer : false_type {}; template -struct is_pointer : true_type {}; +struct is_pointer : true_type {}; template -struct is_signed : integral_constant, char>::value || - is_same, signed char>::value || - is_same, signed short>::value || - is_same, signed int>::value || - is_same, signed long>::value || - is_same, signed long long>::value || - is_same, float>::value || - is_same, double>::value> {}; +struct is_signed + : integral_constant, char>::value || is_same, signed char>::value || is_same, signed short>::value + || is_same, signed int>::value || is_same, signed long>::value + || is_same, signed long long>::value || is_same, float>::value || is_same, double>::value> { +}; template struct is_unsigned : integral_constant, unsigned char>::value || - is_same, unsigned short>::value || - is_same, unsigned int>::value || - is_same, unsigned long>::value || - is_same, unsigned long long>::value || - is_same, bool>::value> {}; + is_same, unsigned char>::value || is_same, unsigned short>::value + || is_same, unsigned int>::value || is_same, unsigned long>::value + || is_same, unsigned long long>::value || is_same, bool>::value> {}; template struct type_identity { - using type = T; + using type = T; }; template struct make_unsigned; @@ -638,34 +626,34 @@ template using make_unsigned_t = typename make_unsigned::type; template struct remove_const { - using type = T; + using type = T; }; template struct remove_const { - using type = T; + using type = T; }; template using remove_const_t = typename remove_const::type; template struct make_void { - using type = void; + using type = void; }; template -using void_t = typename make_void::type; +using void_t = typename make_void::type; using nullptr_t = decltype(nullptr); template -T&& forward(remove_reference_t& t) noexcept { - return static_cast(t); +T && forward(remove_reference_t & t) noexcept { + return static_cast(t); } template -remove_reference_t&& move(T&& t) { - return static_cast&&>(t); +remove_reference_t && move(T && t) { + return static_cast &&>(t); } template -void swap_(T& a, T& b) { - T tmp = move(a); - a = move(b); - b = move(tmp); +void swap_(T & a, T & b) { + T tmp = move(a); + a = move(b); + b = move(tmp); } ARDUINOJSON_END_PRIVATE_NAMESPACE #include @@ -673,273 +661,269 @@ ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE using PoolCount = SlotId; template class MemoryPoolList { - struct FreeSlot { - SlotId next; - }; - static_assert(sizeof(FreeSlot) <= sizeof(T), "T is too small"); - public: - using Pool = MemoryPool; - MemoryPoolList() = default; - ~MemoryPoolList() { - ARDUINOJSON_ASSERT(count_ == 0); - } - friend void swap(MemoryPoolList& a, MemoryPoolList& b) { - bool aUsedPreallocated = a.pools_ == a.preallocatedPools_; - bool bUsedPreallocated = b.pools_ == b.preallocatedPools_; - if (aUsedPreallocated && bUsedPreallocated) { - for (PoolCount i = 0; i < ARDUINOJSON_INITIAL_POOL_COUNT; i++) - swap_(a.preallocatedPools_[i], b.preallocatedPools_[i]); - } else if (bUsedPreallocated) { - for (PoolCount i = 0; i < b.count_; i++) - a.preallocatedPools_[i] = b.preallocatedPools_[i]; - b.pools_ = a.pools_; - a.pools_ = a.preallocatedPools_; - } else if (aUsedPreallocated) { - for (PoolCount i = 0; i < a.count_; i++) - b.preallocatedPools_[i] = a.preallocatedPools_[i]; - a.pools_ = b.pools_; - b.pools_ = b.preallocatedPools_; - } else { - swap_(a.pools_, b.pools_); + struct FreeSlot { + SlotId next; + }; + static_assert(sizeof(FreeSlot) <= sizeof(T), "T is too small"); + + public: + using Pool = MemoryPool; + MemoryPoolList() = default; + ~MemoryPoolList() { + ARDUINOJSON_ASSERT(count_ == 0); } - swap_(a.count_, b.count_); - swap_(a.capacity_, b.capacity_); - swap_(a.freeList_, b.freeList_); - } - MemoryPoolList& operator=(MemoryPoolList&& src) { - ARDUINOJSON_ASSERT(count_ == 0); - if (src.pools_ == src.preallocatedPools_) { - memcpy(preallocatedPools_, src.preallocatedPools_, - sizeof(preallocatedPools_)); - pools_ = preallocatedPools_; - } else { - pools_ = src.pools_; - src.pools_ = nullptr; + friend void swap(MemoryPoolList & a, MemoryPoolList & b) { + bool aUsedPreallocated = a.pools_ == a.preallocatedPools_; + bool bUsedPreallocated = b.pools_ == b.preallocatedPools_; + if (aUsedPreallocated && bUsedPreallocated) { + for (PoolCount i = 0; i < ARDUINOJSON_INITIAL_POOL_COUNT; i++) + swap_(a.preallocatedPools_[i], b.preallocatedPools_[i]); + } else if (bUsedPreallocated) { + for (PoolCount i = 0; i < b.count_; i++) + a.preallocatedPools_[i] = b.preallocatedPools_[i]; + b.pools_ = a.pools_; + a.pools_ = a.preallocatedPools_; + } else if (aUsedPreallocated) { + for (PoolCount i = 0; i < a.count_; i++) + b.preallocatedPools_[i] = a.preallocatedPools_[i]; + a.pools_ = b.pools_; + b.pools_ = b.preallocatedPools_; + } else { + swap_(a.pools_, b.pools_); + } + swap_(a.count_, b.count_); + swap_(a.capacity_, b.capacity_); + swap_(a.freeList_, b.freeList_); } - count_ = src.count_; - capacity_ = src.capacity_; - src.count_ = 0; - src.capacity_ = 0; - return *this; - } - Slot allocSlot(Allocator* allocator) { - if (freeList_ != NULL_SLOT) { - return allocFromFreeList(); + MemoryPoolList & operator=(MemoryPoolList && src) { + ARDUINOJSON_ASSERT(count_ == 0); + if (src.pools_ == src.preallocatedPools_) { + memcpy(preallocatedPools_, src.preallocatedPools_, sizeof(preallocatedPools_)); + pools_ = preallocatedPools_; + } else { + pools_ = src.pools_; + src.pools_ = nullptr; + } + count_ = src.count_; + capacity_ = src.capacity_; + src.count_ = 0; + src.capacity_ = 0; + return *this; } - if (count_) { - auto slot = allocFromLastPool(); - if (slot) - return slot; + Slot allocSlot(Allocator * allocator) { + if (freeList_ != NULL_SLOT) { + return allocFromFreeList(); + } + if (count_) { + auto slot = allocFromLastPool(); + if (slot) + return slot; + } + auto pool = addPool(allocator); + if (!pool) + return {}; + return allocFromLastPool(); } - auto pool = addPool(allocator); - if (!pool) - return {}; - return allocFromLastPool(); - } - void freeSlot(Slot slot) { - reinterpret_cast(slot.ptr())->next = freeList_; - freeList_ = slot.id(); - } - T* getSlot(SlotId id) const { - if (id == NULL_SLOT) - return nullptr; - auto poolIndex = SlotId(id / ARDUINOJSON_POOL_CAPACITY); - auto indexInPool = SlotId(id % ARDUINOJSON_POOL_CAPACITY); - ARDUINOJSON_ASSERT(poolIndex < count_); - return pools_[poolIndex].getSlot(indexInPool); - } - void clear(Allocator* allocator) { - for (PoolCount i = 0; i < count_; i++) - pools_[i].destroy(allocator); - count_ = 0; - freeList_ = NULL_SLOT; - if (pools_ != preallocatedPools_) { - allocator->deallocate(pools_); - pools_ = preallocatedPools_; - capacity_ = ARDUINOJSON_INITIAL_POOL_COUNT; + void freeSlot(Slot slot) { + reinterpret_cast(slot.ptr())->next = freeList_; + freeList_ = slot.id(); } - } - SlotCount usage() const { - SlotCount total = 0; - for (PoolCount i = 0; i < count_; i++) - total = SlotCount(total + pools_[i].usage()); - return total; - } - size_t size() const { - return Pool::slotsToBytes(usage()); - } - void shrinkToFit(Allocator* allocator) { - if (count_ > 0) - pools_[count_ - 1].shrinkToFit(allocator); - if (pools_ != preallocatedPools_ && count_ != capacity_) { - pools_ = static_cast( - allocator->reallocate(pools_, count_ * sizeof(Pool))); - ARDUINOJSON_ASSERT(pools_ != nullptr); // realloc to smaller can't fail - capacity_ = count_; + T * getSlot(SlotId id) const { + if (id == NULL_SLOT) + return nullptr; + auto poolIndex = SlotId(id / ARDUINOJSON_POOL_CAPACITY); + auto indexInPool = SlotId(id % ARDUINOJSON_POOL_CAPACITY); + ARDUINOJSON_ASSERT(poolIndex < count_); + return pools_[poolIndex].getSlot(indexInPool); } - } - private: - Slot allocFromFreeList() { - ARDUINOJSON_ASSERT(freeList_ != NULL_SLOT); - auto id = freeList_; - auto slot = getSlot(freeList_); - freeList_ = reinterpret_cast(slot)->next; - return {slot, id}; - } - Slot allocFromLastPool() { - ARDUINOJSON_ASSERT(count_ > 0); - auto poolIndex = SlotId(count_ - 1); - auto slot = pools_[poolIndex].allocSlot(); - if (!slot) - return {}; - return {slot.ptr(), - SlotId(poolIndex * ARDUINOJSON_POOL_CAPACITY + slot.id())}; - } - Pool* addPool(Allocator* allocator) { - if (count_ == capacity_ && !increaseCapacity(allocator)) - return nullptr; - auto pool = &pools_[count_++]; - SlotCount poolCapacity = ARDUINOJSON_POOL_CAPACITY; - if (count_ == maxPools) // last pool is smaller because of NULL_SLOT - poolCapacity--; - pool->create(poolCapacity, allocator); - return pool; - } - bool increaseCapacity(Allocator* allocator) { - if (capacity_ == maxPools) - return false; - void* newPools; - auto newCapacity = PoolCount(capacity_ * 2); - if (pools_ == preallocatedPools_) { - newPools = allocator->allocate(newCapacity * sizeof(Pool)); - if (!newPools) - return false; - memcpy(newPools, preallocatedPools_, sizeof(preallocatedPools_)); - } else { - newPools = allocator->reallocate(pools_, newCapacity * sizeof(Pool)); - if (!newPools) - return false; + void clear(Allocator * allocator) { + for (PoolCount i = 0; i < count_; i++) + pools_[i].destroy(allocator); + count_ = 0; + freeList_ = NULL_SLOT; + if (pools_ != preallocatedPools_) { + allocator->deallocate(pools_); + pools_ = preallocatedPools_; + capacity_ = ARDUINOJSON_INITIAL_POOL_COUNT; + } } - pools_ = static_cast(newPools); - capacity_ = newCapacity; - return true; - } - Pool preallocatedPools_[ARDUINOJSON_INITIAL_POOL_COUNT]; - Pool* pools_ = preallocatedPools_; - PoolCount count_ = 0; - PoolCount capacity_ = ARDUINOJSON_INITIAL_POOL_COUNT; - SlotId freeList_ = NULL_SLOT; - public: - static const PoolCount maxPools = - PoolCount(NULL_SLOT / ARDUINOJSON_POOL_CAPACITY + 1); + SlotCount usage() const { + SlotCount total = 0; + for (PoolCount i = 0; i < count_; i++) + total = SlotCount(total + pools_[i].usage()); + return total; + } + size_t size() const { + return Pool::slotsToBytes(usage()); + } + void shrinkToFit(Allocator * allocator) { + if (count_ > 0) + pools_[count_ - 1].shrinkToFit(allocator); + if (pools_ != preallocatedPools_ && count_ != capacity_) { + pools_ = static_cast(allocator->reallocate(pools_, count_ * sizeof(Pool))); + ARDUINOJSON_ASSERT(pools_ != nullptr); // realloc to smaller can't fail + capacity_ = count_; + } + } + + private: + Slot allocFromFreeList() { + ARDUINOJSON_ASSERT(freeList_ != NULL_SLOT); + auto id = freeList_; + auto slot = getSlot(freeList_); + freeList_ = reinterpret_cast(slot)->next; + return {slot, id}; + } + Slot allocFromLastPool() { + ARDUINOJSON_ASSERT(count_ > 0); + auto poolIndex = SlotId(count_ - 1); + auto slot = pools_[poolIndex].allocSlot(); + if (!slot) + return {}; + return {slot.ptr(), SlotId(poolIndex * ARDUINOJSON_POOL_CAPACITY + slot.id())}; + } + Pool * addPool(Allocator * allocator) { + if (count_ == capacity_ && !increaseCapacity(allocator)) + return nullptr; + auto pool = &pools_[count_++]; + SlotCount poolCapacity = ARDUINOJSON_POOL_CAPACITY; + if (count_ == maxPools) // last pool is smaller because of NULL_SLOT + poolCapacity--; + pool->create(poolCapacity, allocator); + return pool; + } + bool increaseCapacity(Allocator * allocator) { + if (capacity_ == maxPools) + return false; + void * newPools; + auto newCapacity = PoolCount(capacity_ * 2); + if (pools_ == preallocatedPools_) { + newPools = allocator->allocate(newCapacity * sizeof(Pool)); + if (!newPools) + return false; + memcpy(newPools, preallocatedPools_, sizeof(preallocatedPools_)); + } else { + newPools = allocator->reallocate(pools_, newCapacity * sizeof(Pool)); + if (!newPools) + return false; + } + pools_ = static_cast(newPools); + capacity_ = newCapacity; + return true; + } + Pool preallocatedPools_[ARDUINOJSON_INITIAL_POOL_COUNT]; + Pool * pools_ = preallocatedPools_; + PoolCount count_ = 0; + PoolCount capacity_ = ARDUINOJSON_INITIAL_POOL_COUNT; + SlotId freeList_ = NULL_SLOT; + + public: + static const PoolCount maxPools = PoolCount(NULL_SLOT / ARDUINOJSON_POOL_CAPACITY + 1); }; ARDUINOJSON_END_PRIVATE_NAMESPACE #ifdef _MSC_VER -# pragma warning(push) -# pragma warning(disable : 4310) +#pragma warning(push) +#pragma warning(disable : 4310) #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template struct numeric_limits; template struct numeric_limits::value>> { - static constexpr T lowest() { - return 0; - } - static constexpr T highest() { - return T(-1); - } + static constexpr T lowest() { + return 0; + } + static constexpr T highest() { + return T(-1); + } }; template -struct numeric_limits< - T, enable_if_t::value && is_signed::value>> { - static constexpr T lowest() { - return T(T(1) << (sizeof(T) * 8 - 1)); - } - static constexpr T highest() { - return T(~lowest()); - } +struct numeric_limits::value && is_signed::value>> { + static constexpr T lowest() { + return T(T(1) << (sizeof(T) * 8 - 1)); + } + static constexpr T highest() { + return T(~lowest()); + } }; ARDUINOJSON_END_PRIVATE_NAMESPACE #ifdef _MSC_VER -# pragma warning(pop) +#pragma warning(pop) #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE struct StringNode { - using references_type = uint_t; - using length_type = uint_t; - struct StringNode* next; - references_type references; - length_type length; - char data[1]; - static constexpr size_t maxLength = numeric_limits::highest(); - static constexpr size_t sizeForLength(size_t n) { - return n + 1 + offsetof(StringNode, data); - } - static StringNode* create(size_t length, Allocator* allocator) { - if (length > maxLength) - return nullptr; - auto size = sizeForLength(length); - if (size < length) // integer overflow - return nullptr; // (not testable on 64-bit) - auto node = reinterpret_cast(allocator->allocate(size)); - if (node) { - node->length = length_type(length); - node->references = 1; + using references_type = uint_t; + using length_type = uint_t; + struct StringNode * next; + references_type references; + length_type length; + char data[1]; + static constexpr size_t maxLength = numeric_limits::highest(); + static constexpr size_t sizeForLength(size_t n) { + return n + 1 + offsetof(StringNode, data); + } + static StringNode * create(size_t length, Allocator * allocator) { + if (length > maxLength) + return nullptr; + auto size = sizeForLength(length); + if (size < length) // integer overflow + return nullptr; // (not testable on 64-bit) + auto node = reinterpret_cast(allocator->allocate(size)); + if (node) { + node->length = length_type(length); + node->references = 1; + } + return node; + } + static StringNode * resize(StringNode * node, size_t length, Allocator * allocator) { + ARDUINOJSON_ASSERT(node != nullptr); + StringNode * newNode; + if (length <= maxLength) + newNode = reinterpret_cast(allocator->reallocate(node, sizeForLength(length))); + else + newNode = nullptr; + if (newNode) + newNode->length = length_type(length); + else + allocator->deallocate(node); + return newNode; + } + static void destroy(StringNode * node, Allocator * allocator) { + allocator->deallocate(node); } - return node; - } - static StringNode* resize(StringNode* node, size_t length, - Allocator* allocator) { - ARDUINOJSON_ASSERT(node != nullptr); - StringNode* newNode; - if (length <= maxLength) - newNode = reinterpret_cast( - allocator->reallocate(node, sizeForLength(length))); - else - newNode = nullptr; - if (newNode) - newNode->length = length_type(length); - else - allocator->deallocate(node); - return newNode; - } - static void destroy(StringNode* node, Allocator* allocator) { - allocator->deallocate(node); - } }; constexpr size_t sizeofString(size_t n) { - return StringNode::sizeForLength(n); + return StringNode::sizeForLength(n); } ARDUINOJSON_END_PRIVATE_NAMESPACE -#ifdef _MSC_VER // Visual Studio -# define FORCE_INLINE // __forceinline causes C4714 when returning std::string -# ifndef ARDUINOJSON_DEPRECATED -# define ARDUINOJSON_DEPRECATED(msg) __declspec(deprecated(msg)) -# endif -#elif defined(__GNUC__) // GCC or Clang -# define FORCE_INLINE __attribute__((always_inline)) -# ifndef ARDUINOJSON_DEPRECATED -# if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) -# define ARDUINOJSON_DEPRECATED(msg) __attribute__((deprecated(msg))) -# else -# define ARDUINOJSON_DEPRECATED(msg) __attribute__((deprecated)) -# endif -# endif -#else // Other compilers -# define FORCE_INLINE -# ifndef ARDUINOJSON_DEPRECATED -# define ARDUINOJSON_DEPRECATED(msg) -# endif +#ifdef _MSC_VER // Visual Studio +#define FORCE_INLINE // __forceinline causes C4714 when returning std::string +#ifndef ARDUINOJSON_DEPRECATED +#define ARDUINOJSON_DEPRECATED(msg) __declspec(deprecated(msg)) +#endif +#elif defined(__GNUC__) // GCC or Clang +#define FORCE_INLINE __attribute__((always_inline)) +#ifndef ARDUINOJSON_DEPRECATED +#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) +#define ARDUINOJSON_DEPRECATED(msg) __attribute__((deprecated(msg))) +#else +#define ARDUINOJSON_DEPRECATED(msg) __attribute__((deprecated)) +#endif +#endif +#else // Other compilers +#define FORCE_INLINE +#ifndef ARDUINOJSON_DEPRECATED +#define ARDUINOJSON_DEPRECATED(msg) +#endif #endif #if defined(__has_attribute) -# if __has_attribute(no_sanitize) -# define ARDUINOJSON_NO_SANITIZE(check) __attribute__((no_sanitize(check))) -# else -# define ARDUINOJSON_NO_SANITIZE(check) -# endif +#if __has_attribute(no_sanitize) +#define ARDUINOJSON_NO_SANITIZE(check) __attribute__((no_sanitize(check))) #else -# define ARDUINOJSON_NO_SANITIZE(check) +#define ARDUINOJSON_NO_SANITIZE(check) +#endif +#else +#define ARDUINOJSON_NO_SANITIZE(check) #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template @@ -951,156 +935,155 @@ struct StringAdapter; template struct SizedStringAdapter; template -using StringAdapterFor = - StringAdapter::value, TString, - remove_cv_t>>>; +using StringAdapterFor = StringAdapter::value, TString, remove_cv_t>>>; template using AdaptedString = typename StringAdapterFor::AdaptedString; template -AdaptedString adaptString(TString&& s) { - return StringAdapterFor::adapt(detail::forward(s)); +AdaptedString adaptString(TString && s) { + return StringAdapterFor::adapt(detail::forward(s)); } template ::value, int> = 0> -AdaptedString adaptString(TChar* p) { - return StringAdapter::adapt(p); +AdaptedString adaptString(TChar * p) { + return StringAdapter::adapt(p); } template -AdaptedString adaptString(TChar* p, size_t n) { - return SizedStringAdapter::adapt(p, n); +AdaptedString adaptString(TChar * p, size_t n) { + return SizedStringAdapter::adapt(p, n); } template -struct IsChar - : integral_constant::value && sizeof(T) == 1> {}; +struct IsChar : integral_constant::value && sizeof(T) == 1> {}; class RamString { - public: - static const size_t typeSortKey = 2; + public: + static const size_t typeSortKey = 2; #if ARDUINOJSON_SIZEOF_POINTER <= 2 - static constexpr size_t sizeMask = size_t(-1) >> 1; + static constexpr size_t sizeMask = size_t(-1) >> 1; #else - static constexpr size_t sizeMask = size_t(-1); + static constexpr size_t sizeMask = size_t(-1); #endif - RamString(const char* str, size_t sz, bool isStatic = false) - : str_(str), size_(sz & sizeMask), static_(isStatic) { - ARDUINOJSON_ASSERT(size_ == sz); - } - bool isNull() const { - return !str_; - } - size_t size() const { - return size_; - } - char operator[](size_t i) const { - ARDUINOJSON_ASSERT(str_ != 0); - ARDUINOJSON_ASSERT(i <= size()); - return str_[i]; - } - const char* data() const { - return str_; - } - bool isStatic() const { - return static_; - } - protected: - const char* str_; + RamString(const char * str, size_t sz, bool isStatic = false) + : str_(str) + , size_(sz & sizeMask) + , static_(isStatic) { + ARDUINOJSON_ASSERT(size_ == sz); + } + bool isNull() const { + return !str_; + } + size_t size() const { + return size_; + } + char operator[](size_t i) const { + ARDUINOJSON_ASSERT(str_ != 0); + ARDUINOJSON_ASSERT(i <= size()); + return str_[i]; + } + const char * data() const { + return str_; + } + bool isStatic() const { + return static_; + } + + protected: + const char * str_; #if ARDUINOJSON_SIZEOF_POINTER <= 2 - size_t size_ : sizeof(size_t) * 8 - 1; - bool static_ : 1; + size_t size_ : sizeof(size_t) * 8 - 1; + bool static_ : 1; #else - size_t size_; - bool static_; + size_t size_; + bool static_; #endif }; template -struct StringAdapter::value>> { - using AdaptedString = RamString; - static AdaptedString adapt(const TChar* p) { - auto str = reinterpret_cast(p); - return AdaptedString(str, str ? ::strlen(str) : 0); - } +struct StringAdapter::value>> { + using AdaptedString = RamString; + static AdaptedString adapt(const TChar * p) { + auto str = reinterpret_cast(p); + return AdaptedString(str, str ? ::strlen(str) : 0); + } +}; +template +struct StringAdapter::value>> { + using AdaptedString = RamString; + static AdaptedString adapt(const TChar * p) { + auto str = reinterpret_cast(p); + return AdaptedString(str, str ? ::strlen(str) : 0); + } }; template struct StringAdapter { - using AdaptedString = RamString; - static AdaptedString adapt(const char (&p)[N]) { - return RamString(p, N - 1, true); - } + using AdaptedString = RamString; + static AdaptedString adapt(const char (&p)[N]) { + return RamString(p, N - 1, true); + } }; template struct StringAdapter::value>> { - using AdaptedString = RamString; - static AdaptedString adapt(const TChar* p) { - auto str = reinterpret_cast(p); - return AdaptedString(str, str ? ::strlen(str) : 0); - } + using AdaptedString = RamString; + static AdaptedString adapt(const TChar * p) { + ARDUINOJSON_ASSERT(p); + auto str = reinterpret_cast(p); + return AdaptedString(str, ::strlen(str)); + } }; template -struct SizedStringAdapter::value>> { - using AdaptedString = RamString; - static AdaptedString adapt(const TChar* p, size_t n) { - return AdaptedString(reinterpret_cast(p), n); - } +struct SizedStringAdapter::value>> { + using AdaptedString = RamString; + static AdaptedString adapt(const TChar * p, size_t n) { + return AdaptedString(reinterpret_cast(p), n); + } }; namespace string_traits_impl { template struct has_cstr : false_type {}; template -struct has_cstr().c_str()), - const char*>::value>> : true_type {}; +struct has_cstr().c_str()), const char *>::value>> : true_type {}; template struct has_data : false_type {}; template -struct has_data().data()), - const char*>::value>> : true_type {}; +struct has_data().data()), const char *>::value>> : true_type {}; template struct has_length : false_type {}; template -struct has_length< - T, enable_if_t().length())>::value>> - : true_type {}; +struct has_length().length())>::value>> : true_type {}; template struct has_size : false_type {}; template -struct has_size< - T, enable_if_t().size()), size_t>::value>> - : true_type {}; -} // namespace string_traits_impl +struct has_size().size()), size_t>::value>> : true_type {}; +} // namespace string_traits_impl template struct string_traits { - enum { - has_cstr = string_traits_impl::has_cstr::value, - has_length = string_traits_impl::has_length::value, - has_data = string_traits_impl::has_data::value, - has_size = string_traits_impl::has_size::value - }; + enum { + has_cstr = string_traits_impl::has_cstr::value, + has_length = string_traits_impl::has_length::value, + has_data = string_traits_impl::has_data::value, + has_size = string_traits_impl::has_size::value + }; }; template -struct StringAdapter< - T, - enable_if_t<(string_traits::has_cstr || string_traits::has_data) && - (string_traits::has_length || string_traits::has_size)>> { - using AdaptedString = RamString; - static AdaptedString adapt(const T& s) { - return AdaptedString(get_data(s), get_size(s)); - } - private: - template - static enable_if_t::has_size, size_t> get_size(const U& s) { - return s.size(); - } - template - static enable_if_t::has_size, size_t> get_size(const U& s) { - return s.length(); - } - template - static enable_if_t::has_data, const char*> get_data( - const U& s) { - return s.data(); - } - template - static enable_if_t::has_data, const char*> get_data( - const U& s) { - return s.c_str(); - } +struct StringAdapter::has_cstr || string_traits::has_data) && (string_traits::has_length || string_traits::has_size)>> { + using AdaptedString = RamString; + static AdaptedString adapt(const T & s) { + return AdaptedString(get_data(s), get_size(s)); + } + + private: + template + static enable_if_t::has_size, size_t> get_size(const U & s) { + return s.size(); + } + template + static enable_if_t::has_size, size_t> get_size(const U & s) { + return s.length(); + } + template + static enable_if_t::has_data, const char *> get_data(const U & s) { + return s.data(); + } + template + static enable_if_t::has_data, const char *> get_data(const U & s) { + return s.c_str(); + } }; ARDUINOJSON_END_PRIVATE_NAMESPACE #if ARDUINOJSON_ENABLE_PROGMEM @@ -1111,596 +1094,588 @@ class __FlashStringHelper; #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE struct pgm_p { - pgm_p(const void* p) : address(reinterpret_cast(p)) {} - const char* address; + pgm_p(const void * p) + : address(reinterpret_cast(p)) { + } + const char * address; }; ARDUINOJSON_END_PRIVATE_NAMESPACE #ifndef strlen_P inline size_t strlen_P(ArduinoJson::detail::pgm_p s) { - const char* p = s.address; - ARDUINOJSON_ASSERT(p != NULL); - while (pgm_read_byte(p)) - p++; - return size_t(p - s.address); + const char * p = s.address; + ARDUINOJSON_ASSERT(p != NULL); + while (pgm_read_byte(p)) + p++; + return size_t(p - s.address); } #endif #ifndef strncmp_P -inline int strncmp_P(const char* a, ArduinoJson::detail::pgm_p b, size_t n) { - const char* s1 = a; - const char* s2 = b.address; - ARDUINOJSON_ASSERT(s1 != NULL); - ARDUINOJSON_ASSERT(s2 != NULL); - while (n-- > 0) { - char c1 = *s1++; - char c2 = static_cast(pgm_read_byte(s2++)); - if (c1 < c2) - return -1; - if (c1 > c2) - return 1; - if (c1 == 0 /* and c2 as well */) - return 0; - } - return 0; +inline int strncmp_P(const char * a, ArduinoJson::detail::pgm_p b, size_t n) { + const char * s1 = a; + const char * s2 = b.address; + ARDUINOJSON_ASSERT(s1 != NULL); + ARDUINOJSON_ASSERT(s2 != NULL); + while (n-- > 0) { + char c1 = *s1++; + char c2 = static_cast(pgm_read_byte(s2++)); + if (c1 < c2) + return -1; + if (c1 > c2) + return 1; + if (c1 == 0 /* and c2 as well */) + return 0; + } + return 0; } #endif #ifndef strcmp_P -inline int strcmp_P(const char* a, ArduinoJson::detail::pgm_p b) { - const char* s1 = a; - const char* s2 = b.address; - ARDUINOJSON_ASSERT(s1 != NULL); - ARDUINOJSON_ASSERT(s2 != NULL); - for (;;) { - char c1 = *s1++; - char c2 = static_cast(pgm_read_byte(s2++)); - if (c1 < c2) - return -1; - if (c1 > c2) - return 1; - if (c1 == 0 /* and c2 as well */) - return 0; - } +inline int strcmp_P(const char * a, ArduinoJson::detail::pgm_p b) { + const char * s1 = a; + const char * s2 = b.address; + ARDUINOJSON_ASSERT(s1 != NULL); + ARDUINOJSON_ASSERT(s2 != NULL); + for (;;) { + char c1 = *s1++; + char c2 = static_cast(pgm_read_byte(s2++)); + if (c1 < c2) + return -1; + if (c1 > c2) + return 1; + if (c1 == 0 /* and c2 as well */) + return 0; + } } #endif #ifndef memcmp_P -inline int memcmp_P(const void* a, ArduinoJson::detail::pgm_p b, size_t n) { - const uint8_t* p1 = reinterpret_cast(a); - const char* p2 = b.address; - ARDUINOJSON_ASSERT(p1 != NULL); - ARDUINOJSON_ASSERT(p2 != NULL); - while (n-- > 0) { - uint8_t v1 = *p1++; - uint8_t v2 = pgm_read_byte(p2++); - if (v1 != v2) - return v1 - v2; - } - return 0; +inline int memcmp_P(const void * a, ArduinoJson::detail::pgm_p b, size_t n) { + const uint8_t * p1 = reinterpret_cast(a); + const char * p2 = b.address; + ARDUINOJSON_ASSERT(p1 != NULL); + ARDUINOJSON_ASSERT(p2 != NULL); + while (n-- > 0) { + uint8_t v1 = *p1++; + uint8_t v2 = pgm_read_byte(p2++); + if (v1 != v2) + return v1 - v2; + } + return 0; } #endif #ifndef memcpy_P -inline void* memcpy_P(void* dst, ArduinoJson::detail::pgm_p src, size_t n) { - uint8_t* d = reinterpret_cast(dst); - const char* s = src.address; - ARDUINOJSON_ASSERT(d != NULL); - ARDUINOJSON_ASSERT(s != NULL); - while (n-- > 0) { - *d++ = pgm_read_byte(s++); - } - return dst; +inline void * memcpy_P(void * dst, ArduinoJson::detail::pgm_p src, size_t n) { + uint8_t * d = reinterpret_cast(dst); + const char * s = src.address; + ARDUINOJSON_ASSERT(d != NULL); + ARDUINOJSON_ASSERT(s != NULL); + while (n-- > 0) { + *d++ = pgm_read_byte(s++); + } + return dst; } #endif #ifndef pgm_read_dword inline uint32_t pgm_read_dword(ArduinoJson::detail::pgm_p p) { - uint32_t result; - memcpy_P(&result, p.address, 4); - return result; + uint32_t result; + memcpy_P(&result, p.address, 4); + return result; } #endif #ifndef pgm_read_float inline float pgm_read_float(ArduinoJson::detail::pgm_p p) { - float result; - memcpy_P(&result, p.address, sizeof(float)); - return result; + float result; + memcpy_P(&result, p.address, sizeof(float)); + return result; } #endif #ifndef pgm_read_double -# if defined(__SIZEOF_DOUBLE__) && defined(__SIZEOF_FLOAT__) && \ - __SIZEOF_DOUBLE__ == __SIZEOF_FLOAT__ +#if defined(__SIZEOF_DOUBLE__) && defined(__SIZEOF_FLOAT__) && __SIZEOF_DOUBLE__ == __SIZEOF_FLOAT__ inline double pgm_read_double(ArduinoJson::detail::pgm_p p) { - return pgm_read_float(p.address); + return pgm_read_float(p.address); } -# else +#else inline double pgm_read_double(ArduinoJson::detail::pgm_p p) { - double result; - memcpy_P(&result, p.address, sizeof(double)); - return result; + double result; + memcpy_P(&result, p.address, sizeof(double)); + return result; } -# endif +#endif #endif #ifndef pgm_read_ptr -inline void* pgm_read_ptr(ArduinoJson::detail::pgm_p p) { - void* result; - memcpy_P(&result, p.address, sizeof(result)); - return result; +inline void * pgm_read_ptr(ArduinoJson::detail::pgm_p p) { + void * result; + memcpy_P(&result, p.address, sizeof(result)); + return result; } #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE class FlashString { - public: - static const size_t typeSortKey = 1; - FlashString(const __FlashStringHelper* str, size_t sz) - : str_(reinterpret_cast(str)), size_(sz) {} - bool isNull() const { - return !str_; - } - char operator[](size_t i) const { - ARDUINOJSON_ASSERT(str_ != 0); - ARDUINOJSON_ASSERT(i <= size_); - return static_cast(pgm_read_byte(str_ + i)); - } - const char* data() const { - return nullptr; - } - size_t size() const { - return size_; - } - friend bool stringEquals(FlashString a, RamString b) { - ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); - ARDUINOJSON_ASSERT(!a.isNull()); - ARDUINOJSON_ASSERT(!b.isNull()); - if (a.size() != b.size()) - return false; - return ::memcmp_P(b.data(), a.str_, a.size_) == 0; - } - friend int stringCompare(FlashString a, RamString b) { - ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); - ARDUINOJSON_ASSERT(!a.isNull()); - ARDUINOJSON_ASSERT(!b.isNull()); - size_t minsize = a.size() < b.size() ? a.size() : b.size(); - int res = ::memcmp_P(b.data(), a.str_, minsize); - if (res) - return -res; - if (a.size() < b.size()) - return -1; - if (a.size() > b.size()) - return 1; - return 0; - } - friend void stringGetChars(FlashString s, char* p, size_t n) { - ARDUINOJSON_ASSERT(s.size() <= n); - ::memcpy_P(p, s.str_, n); - } - bool isStatic() const { - return false; - } - private: - const char* str_; - size_t size_; + public: + static const size_t typeSortKey = 1; + FlashString(const __FlashStringHelper * str, size_t sz) + : str_(reinterpret_cast(str)) + , size_(sz) { + } + bool isNull() const { + return !str_; + } + char operator[](size_t i) const { + ARDUINOJSON_ASSERT(str_ != 0); + ARDUINOJSON_ASSERT(i <= size_); + return static_cast(pgm_read_byte(str_ + i)); + } + const char * data() const { + return nullptr; + } + size_t size() const { + return size_; + } + friend bool stringEquals(FlashString a, RamString b) { + ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); + ARDUINOJSON_ASSERT(!a.isNull()); + ARDUINOJSON_ASSERT(!b.isNull()); + if (a.size() != b.size()) + return false; + return ::memcmp_P(b.data(), a.str_, a.size_) == 0; + } + friend int stringCompare(FlashString a, RamString b) { + ARDUINOJSON_ASSERT(a.typeSortKey < b.typeSortKey); + ARDUINOJSON_ASSERT(!a.isNull()); + ARDUINOJSON_ASSERT(!b.isNull()); + size_t minsize = a.size() < b.size() ? a.size() : b.size(); + int res = ::memcmp_P(b.data(), a.str_, minsize); + if (res) + return -res; + if (a.size() < b.size()) + return -1; + if (a.size() > b.size()) + return 1; + return 0; + } + friend void stringGetChars(FlashString s, char * p, size_t n) { + ARDUINOJSON_ASSERT(s.size() <= n); + ::memcpy_P(p, s.str_, n); + } + bool isStatic() const { + return false; + } + + private: + const char * str_; + size_t size_; }; template <> -struct StringAdapter { - using AdaptedString = FlashString; - static AdaptedString adapt(const __FlashStringHelper* s) { - return AdaptedString(s, s ? strlen_P(reinterpret_cast(s)) : 0); - } +struct StringAdapter { + using AdaptedString = FlashString; + static AdaptedString adapt(const __FlashStringHelper * s) { + return AdaptedString(s, s ? strlen_P(reinterpret_cast(s)) : 0); + } }; template <> -struct SizedStringAdapter { - using AdaptedString = FlashString; - static AdaptedString adapt(const __FlashStringHelper* s, size_t n) { - return AdaptedString(s, n); - } +struct SizedStringAdapter { + using AdaptedString = FlashString; + static AdaptedString adapt(const __FlashStringHelper * s, size_t n) { + return AdaptedString(s, n); + } }; ARDUINOJSON_END_PRIVATE_NAMESPACE #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -enable_if_t -stringCompare(TAdaptedString1 s1, TAdaptedString2 s2) { - ARDUINOJSON_ASSERT(!s1.isNull()); - ARDUINOJSON_ASSERT(!s2.isNull()); - size_t size1 = s1.size(); - size_t size2 = s2.size(); - size_t n = size1 < size2 ? size1 : size2; - for (size_t i = 0; i < n; i++) { - if (s1[i] != s2[i]) - return s1[i] - s2[i]; - } - if (size1 < size2) - return -1; - if (size1 > size2) - return 1; - return 0; +enable_if_t stringCompare(TAdaptedString1 s1, TAdaptedString2 s2) { + ARDUINOJSON_ASSERT(!s1.isNull()); + ARDUINOJSON_ASSERT(!s2.isNull()); + size_t size1 = s1.size(); + size_t size2 = s2.size(); + size_t n = size1 < size2 ? size1 : size2; + for (size_t i = 0; i < n; i++) { + if (s1[i] != s2[i]) + return s1[i] - s2[i]; + } + if (size1 < size2) + return -1; + if (size1 > size2) + return 1; + return 0; } template -enable_if_t<(TAdaptedString1::typeSortKey > TAdaptedString2::typeSortKey), int> -stringCompare(TAdaptedString1 s1, TAdaptedString2 s2) { - return -stringCompare(s2, s1); +enable_if_t<(TAdaptedString1::typeSortKey > TAdaptedString2::typeSortKey), int> stringCompare(TAdaptedString1 s1, TAdaptedString2 s2) { + return -stringCompare(s2, s1); } template -enable_if_t -stringEquals(TAdaptedString1 s1, TAdaptedString2 s2) { - ARDUINOJSON_ASSERT(!s1.isNull()); - ARDUINOJSON_ASSERT(!s2.isNull()); - size_t size1 = s1.size(); - size_t size2 = s2.size(); - if (size1 != size2) - return false; - for (size_t i = 0; i < size1; i++) { - if (s1[i] != s2[i]) - return false; - } - return true; +enable_if_t stringEquals(TAdaptedString1 s1, TAdaptedString2 s2) { + ARDUINOJSON_ASSERT(!s1.isNull()); + ARDUINOJSON_ASSERT(!s2.isNull()); + size_t size1 = s1.size(); + size_t size2 = s2.size(); + if (size1 != size2) + return false; + for (size_t i = 0; i < size1; i++) { + if (s1[i] != s2[i]) + return false; + } + return true; } template -enable_if_t<(TAdaptedString1::typeSortKey > TAdaptedString2::typeSortKey), bool> -stringEquals(TAdaptedString1 s1, TAdaptedString2 s2) { - return stringEquals(s2, s1); +enable_if_t<(TAdaptedString1::typeSortKey > TAdaptedString2::typeSortKey), bool> stringEquals(TAdaptedString1 s1, TAdaptedString2 s2) { + return stringEquals(s2, s1); } template -static void stringGetChars(TAdaptedString s, char* p, size_t n) { - ARDUINOJSON_ASSERT(s.size() <= n); - for (size_t i = 0; i < n; i++) { - p[i] = s[i]; - } +static void stringGetChars(TAdaptedString s, char * p, size_t n) { + ARDUINOJSON_ASSERT(s.size() <= n); + for (size_t i = 0; i < n; i++) { + p[i] = s[i]; + } } class StringPool { - public: - StringPool() = default; - StringPool(const StringPool&) = delete; - void operator=(StringPool&& src) = delete; - ~StringPool() { - ARDUINOJSON_ASSERT(strings_ == nullptr); - } - friend void swap(StringPool& a, StringPool& b) { - swap_(a.strings_, b.strings_); - } - void clear(Allocator* allocator) { - while (strings_) { - auto node = strings_; - strings_ = node->next; - StringNode::destroy(node, allocator); + public: + StringPool() = default; + StringPool(const StringPool &) = delete; + void operator=(StringPool && src) = delete; + ~StringPool() { + ARDUINOJSON_ASSERT(strings_ == nullptr); } - } - size_t size() const { - size_t total = 0; - for (auto node = strings_; node; node = node->next) - total += sizeofString(node->length); - return total; - } - template - StringNode* add(TAdaptedString str, Allocator* allocator) { - ARDUINOJSON_ASSERT(str.isNull() == false); - auto node = get(str); - if (node) { - node->references++; - return node; + friend void swap(StringPool & a, StringPool & b) { + swap_(a.strings_, b.strings_); } - size_t n = str.size(); - node = StringNode::create(n, allocator); - if (!node) - return nullptr; - stringGetChars(str, node->data, n); - node->data[n] = 0; // force NUL terminator - add(node); - return node; - } - void add(StringNode* node) { - ARDUINOJSON_ASSERT(node != nullptr); - node->next = strings_; - strings_ = node; - } - template - StringNode* get(const TAdaptedString& str) const { - for (auto node = strings_; node; node = node->next) { - if (stringEquals(str, adaptString(node->data, node->length))) + void clear(Allocator * allocator) { + while (strings_) { + auto node = strings_; + strings_ = node->next; + StringNode::destroy(node, allocator); + } + } + size_t size() const { + size_t total = 0; + for (auto node = strings_; node; node = node->next) + total += sizeofString(node->length); + return total; + } + template + StringNode * add(TAdaptedString str, Allocator * allocator) { + ARDUINOJSON_ASSERT(str.isNull() == false); + auto node = get(str); + if (node) { + node->references++; + return node; + } + size_t n = str.size(); + node = StringNode::create(n, allocator); + if (!node) + return nullptr; + stringGetChars(str, node->data, n); + node->data[n] = 0; // force NUL terminator + add(node); return node; } - return nullptr; - } - void dereference(const char* s, Allocator* allocator) { - StringNode* prev = nullptr; - for (auto node = strings_; node; node = node->next) { - if (node->data == s) { - if (--node->references == 0) { - if (prev) - prev->next = node->next; - else - strings_ = node->next; - StringNode::destroy(node, allocator); - } - return; - } - prev = node; + void add(StringNode * node) { + ARDUINOJSON_ASSERT(node != nullptr); + node->next = strings_; + strings_ = node; } - } - private: - StringNode* strings_ = nullptr; + template + StringNode * get(const TAdaptedString & str) const { + for (auto node = strings_; node; node = node->next) { + if (stringEquals(str, adaptString(node->data, node->length))) + return node; + } + return nullptr; + } + void dereference(const char * s, Allocator * allocator) { + StringNode * prev = nullptr; + for (auto node = strings_; node; node = node->next) { + if (node->data == s) { + if (--node->references == 0) { + if (prev) + prev->next = node->next; + else + strings_ = node->next; + StringNode::destroy(node, allocator); + } + return; + } + prev = node; + } + } + + private: + StringNode * strings_ = nullptr; }; ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE template class SerializedValue { - public: - explicit SerializedValue(T str) : str_(str) {} - operator T() const { - return str_; - } - const char* data() const { - return str_.c_str(); - } - size_t size() const { - return str_.length(); - } - private: - T str_; + public: + explicit SerializedValue(T str) + : str_(str) { + } + operator T() const { + return str_; + } + const char * data() const { + return str_.c_str(); + } + size_t size() const { + return str_.length(); + } + + private: + T str_; }; template -class SerializedValue { - public: - explicit SerializedValue(TChar* p, size_t n) : data_(p), size_(n) {} - operator TChar*() const { - return data_; - } - TChar* data() const { - return data_; - } - size_t size() const { - return size_; - } - private: - TChar* data_; - size_t size_; +class SerializedValue { + public: + explicit SerializedValue(TChar * p, size_t n) + : data_(p) + , size_(n) { + } + operator TChar *() const { + return data_; + } + TChar * data() const { + return data_; + } + size_t size() const { + return size_; + } + + private: + TChar * data_; + size_t size_; }; -using RawString = SerializedValue; +using RawString = SerializedValue; template inline SerializedValue serialized(T str) { - return SerializedValue(str); + return SerializedValue(str); } template -inline SerializedValue serialized(TChar* p) { - return SerializedValue(p, detail::adaptString(p).size()); +inline SerializedValue serialized(TChar * p) { + return SerializedValue(p, detail::adaptString(p).size()); } template -inline SerializedValue serialized(TChar* p, size_t n) { - return SerializedValue(p, n); +inline SerializedValue serialized(TChar * p, size_t n) { + return SerializedValue(p, n); } ARDUINOJSON_END_PUBLIC_NAMESPACE #if defined(__clang__) -# pragma clang diagnostic push -# pragma clang diagnostic ignored "-Wconversion" +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wconversion" #elif defined(__GNUC__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wconversion" +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE #ifndef isnan template bool isnan(T x) { - return x != x; + return x != x; } #endif #ifndef isinf template bool isinf(T x) { - return x != 0.0 && x * 2 == x; + return x != 0.0 && x * 2 == x; } #endif template struct alias_cast_t { - union { - F raw; - T data; - }; + union { + F raw; + T data; + }; }; template T alias_cast(F raw_data) { - alias_cast_t ac; - ac.raw = raw_data; - return ac.data; + alias_cast_t ac; + ac.raw = raw_data; + return ac.data; } ARDUINOJSON_END_PRIVATE_NAMESPACE #if ARDUINOJSON_ENABLE_PROGMEM #endif ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE #if ARDUINOJSON_ENABLE_PROGMEM -# ifndef ARDUINOJSON_DEFINE_PROGMEM_ARRAY -# define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, ...) \ - static type const name[] PROGMEM = __VA_ARGS__; -# endif +#ifndef ARDUINOJSON_DEFINE_PROGMEM_ARRAY +#define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, ...) static type const name[] PROGMEM = __VA_ARGS__; +#endif template -inline const T* pgm_read(const T* const* p) { - return reinterpret_cast(pgm_read_ptr(p)); +inline const T * pgm_read(const T * const * p) { + return reinterpret_cast(pgm_read_ptr(p)); } -inline uint32_t pgm_read(const uint32_t* p) { - return pgm_read_dword(p); +inline uint32_t pgm_read(const uint32_t * p) { + return pgm_read_dword(p); } -inline double pgm_read(const double* p) { - return pgm_read_double(p); +inline double pgm_read(const double * p) { + return pgm_read_double(p); } -inline float pgm_read(const float* p) { - return pgm_read_float(p); +inline float pgm_read(const float * p) { + return pgm_read_float(p); } #else -# ifndef ARDUINOJSON_DEFINE_PROGMEM_ARRAY -# define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, ...) \ - static type const name[] = __VA_ARGS__; -# endif +#ifndef ARDUINOJSON_DEFINE_PROGMEM_ARRAY +#define ARDUINOJSON_DEFINE_PROGMEM_ARRAY(type, name, ...) static type const name[] = __VA_ARGS__; +#endif template -inline T pgm_read(const T* p) { - return *p; +inline T pgm_read(const T * p) { + return *p; } #endif template class pgm_ptr { - public: - explicit pgm_ptr(const T* ptr) : ptr_(ptr) {} - T operator[](intptr_t index) const { - return pgm_read(ptr_ + index); - } - private: - const T* ptr_; + public: + explicit pgm_ptr(const T * ptr) + : ptr_(ptr) { + } + T operator[](intptr_t index) const { + return pgm_read(ptr_ + index); + } + + private: + const T * ptr_; }; template struct FloatTraits {}; template struct FloatTraits { - using mantissa_type = uint64_t; - static const short mantissa_bits = 52; - static const mantissa_type mantissa_max = - (mantissa_type(1) << mantissa_bits) - 1; - using exponent_type = int16_t; - static const exponent_type exponent_max = 308; - static pgm_ptr positiveBinaryPowersOfTen() { - ARDUINOJSON_DEFINE_PROGMEM_ARRAY( // - uint64_t, factors, - { - 0x4024000000000000, // 1e1 - 0x4059000000000000, // 1e2 - 0x40C3880000000000, // 1e4 - 0x4197D78400000000, // 1e8 - 0x4341C37937E08000, // 1e16 - 0x4693B8B5B5056E17, // 1e32 - 0x4D384F03E93FF9F5, // 1e64 - 0x5A827748F9301D32, // 1e128 - 0x75154FDD7F73BF3C, // 1e256 - }); - return pgm_ptr(reinterpret_cast(factors)); - } - static pgm_ptr negativeBinaryPowersOfTen() { - ARDUINOJSON_DEFINE_PROGMEM_ARRAY( // - uint64_t, factors, - { - 0x3FB999999999999A, // 1e-1 - 0x3F847AE147AE147B, // 1e-2 - 0x3F1A36E2EB1C432D, // 1e-4 - 0x3E45798EE2308C3A, // 1e-8 - 0x3C9CD2B297D889BC, // 1e-16 - 0x3949F623D5A8A733, // 1e-32 - 0x32A50FFD44F4A73D, // 1e-64 - 0x255BBA08CF8C979D, // 1e-128 - 0x0AC8062864AC6F43 // 1e-256 - }); - return pgm_ptr(reinterpret_cast(factors)); - } - static T nan() { - return forge(0x7ff8000000000000); - } - static T inf() { - return forge(0x7ff0000000000000); - } - static T highest() { - return forge(0x7FEFFFFFFFFFFFFF); - } - template // int64_t - static T highest_for( - enable_if_t::value && is_signed::value && - sizeof(TOut) == 8, - signed>* = 0) { - return forge(0x43DFFFFFFFFFFFFF); // 9.2233720368547748e+18 - } - template // uint64_t - static T highest_for( - enable_if_t::value && is_unsigned::value && - sizeof(TOut) == 8, - unsigned>* = 0) { - return forge(0x43EFFFFFFFFFFFFF); // 1.8446744073709549568e+19 - } - static T lowest() { - return forge(0xFFEFFFFFFFFFFFFF); - } - static T forge(uint64_t bits) { - return alias_cast(bits); - } + using mantissa_type = uint64_t; + static const short mantissa_bits = 52; + static const mantissa_type mantissa_max = (mantissa_type(1) << mantissa_bits) - 1; + using exponent_type = int16_t; + static const exponent_type exponent_max = 308; + static pgm_ptr positiveBinaryPowersOfTen() { + ARDUINOJSON_DEFINE_PROGMEM_ARRAY( // + uint64_t, + factors, + { + 0x4024000000000000, // 1e1 + 0x4059000000000000, // 1e2 + 0x40C3880000000000, // 1e4 + 0x4197D78400000000, // 1e8 + 0x4341C37937E08000, // 1e16 + 0x4693B8B5B5056E17, // 1e32 + 0x4D384F03E93FF9F5, // 1e64 + 0x5A827748F9301D32, // 1e128 + 0x75154FDD7F73BF3C, // 1e256 + }); + return pgm_ptr(reinterpret_cast(factors)); + } + static pgm_ptr negativeBinaryPowersOfTen() { + ARDUINOJSON_DEFINE_PROGMEM_ARRAY( // + uint64_t, + factors, + { + 0x3FB999999999999A, // 1e-1 + 0x3F847AE147AE147B, // 1e-2 + 0x3F1A36E2EB1C432D, // 1e-4 + 0x3E45798EE2308C3A, // 1e-8 + 0x3C9CD2B297D889BC, // 1e-16 + 0x3949F623D5A8A733, // 1e-32 + 0x32A50FFD44F4A73D, // 1e-64 + 0x255BBA08CF8C979D, // 1e-128 + 0x0AC8062864AC6F43 // 1e-256 + }); + return pgm_ptr(reinterpret_cast(factors)); + } + static T nan() { + return forge(0x7ff8000000000000); + } + static T inf() { + return forge(0x7ff0000000000000); + } + static T highest() { + return forge(0x7FEFFFFFFFFFFFFF); + } + template // int64_t + static T highest_for(enable_if_t::value && is_signed::value && sizeof(TOut) == 8, signed> * = 0) { + return forge(0x43DFFFFFFFFFFFFF); // 9.2233720368547748e+18 + } + template // uint64_t + static T highest_for(enable_if_t::value && is_unsigned::value && sizeof(TOut) == 8, unsigned> * = 0) { + return forge(0x43EFFFFFFFFFFFFF); // 1.8446744073709549568e+19 + } + static T lowest() { + return forge(0xFFEFFFFFFFFFFFFF); + } + static T forge(uint64_t bits) { + return alias_cast(bits); + } }; template struct FloatTraits { - using mantissa_type = uint32_t; - static const short mantissa_bits = 23; - static const mantissa_type mantissa_max = - (mantissa_type(1) << mantissa_bits) - 1; - using exponent_type = int8_t; - static const exponent_type exponent_max = 38; - static pgm_ptr positiveBinaryPowersOfTen() { - ARDUINOJSON_DEFINE_PROGMEM_ARRAY(uint32_t, factors, - { - 0x41200000, // 1e1f - 0x42c80000, // 1e2f - 0x461c4000, // 1e4f - 0x4cbebc20, // 1e8f - 0x5a0e1bca, // 1e16f - 0x749dc5ae // 1e32f - }); - return pgm_ptr(reinterpret_cast(factors)); - } - static pgm_ptr negativeBinaryPowersOfTen() { - ARDUINOJSON_DEFINE_PROGMEM_ARRAY(uint32_t, factors, - { - 0x3dcccccd, // 1e-1f - 0x3c23d70a, // 1e-2f - 0x38d1b717, // 1e-4f - 0x322bcc77, // 1e-8f - 0x24e69595, // 1e-16f - 0x0a4fb11f // 1e-32f - }); - return pgm_ptr(reinterpret_cast(factors)); - } - static T forge(uint32_t bits) { - return alias_cast(bits); - } - static T nan() { - return forge(0x7fc00000); - } - static T inf() { - return forge(0x7f800000); - } - static T highest() { - return forge(0x7f7fffff); - } - template // int32_t - static T highest_for( - enable_if_t::value && is_signed::value && - sizeof(TOut) == 4, - signed>* = 0) { - return forge(0x4EFFFFFF); // 2.14748352E9 - } - template // uint32_t - static T highest_for( - enable_if_t::value && is_unsigned::value && - sizeof(TOut) == 4, - unsigned>* = 0) { - return forge(0x4F7FFFFF); // 4.29496704E9 - } - template // int64_t - static T highest_for( - enable_if_t::value && is_signed::value && - sizeof(TOut) == 8, - signed>* = 0) { - return forge(0x5EFFFFFF); // 9.22337148709896192E18 - } - template // uint64_t - static T highest_for( - enable_if_t::value && is_unsigned::value && - sizeof(TOut) == 8, - unsigned>* = 0) { - return forge(0x5F7FFFFF); // 1.844674297419792384E19 - } - static T lowest() { - return forge(0xFf7fffff); - } + using mantissa_type = uint32_t; + static const short mantissa_bits = 23; + static const mantissa_type mantissa_max = (mantissa_type(1) << mantissa_bits) - 1; + using exponent_type = int8_t; + static const exponent_type exponent_max = 38; + static pgm_ptr positiveBinaryPowersOfTen() { + ARDUINOJSON_DEFINE_PROGMEM_ARRAY(uint32_t, + factors, + { + 0x41200000, // 1e1f + 0x42c80000, // 1e2f + 0x461c4000, // 1e4f + 0x4cbebc20, // 1e8f + 0x5a0e1bca, // 1e16f + 0x749dc5ae // 1e32f + }); + return pgm_ptr(reinterpret_cast(factors)); + } + static pgm_ptr negativeBinaryPowersOfTen() { + ARDUINOJSON_DEFINE_PROGMEM_ARRAY(uint32_t, + factors, + { + 0x3dcccccd, // 1e-1f + 0x3c23d70a, // 1e-2f + 0x38d1b717, // 1e-4f + 0x322bcc77, // 1e-8f + 0x24e69595, // 1e-16f + 0x0a4fb11f // 1e-32f + }); + return pgm_ptr(reinterpret_cast(factors)); + } + static T forge(uint32_t bits) { + return alias_cast(bits); + } + static T nan() { + return forge(0x7fc00000); + } + static T inf() { + return forge(0x7f800000); + } + static T highest() { + return forge(0x7f7fffff); + } + template // int32_t + static T highest_for(enable_if_t::value && is_signed::value && sizeof(TOut) == 4, signed> * = 0) { + return forge(0x4EFFFFFF); // 2.14748352E9 + } + template // uint32_t + static T highest_for(enable_if_t::value && is_unsigned::value && sizeof(TOut) == 4, unsigned> * = 0) { + return forge(0x4F7FFFFF); // 4.29496704E9 + } + template // int64_t + static T highest_for(enable_if_t::value && is_signed::value && sizeof(TOut) == 8, signed> * = 0) { + return forge(0x5EFFFFFF); // 9.22337148709896192E18 + } + template // uint64_t + static T highest_for(enable_if_t::value && is_unsigned::value && sizeof(TOut) == 8, unsigned> * = 0) { + return forge(0x5F7FFFFF); // 1.844674297419792384E19 + } + static T lowest() { + return forge(0xFf7fffff); + } }; template inline TFloat make_float(TFloat m, TExponent e) { - using traits = FloatTraits; - auto powersOfTen = e > 0 ? traits::positiveBinaryPowersOfTen() - : traits::negativeBinaryPowersOfTen(); - if (e <= 0) - e = TExponent(-e); - for (uint8_t index = 0; e != 0; index++) { - if (e & 1) - m *= powersOfTen[index]; - e >>= 1; - } - return m; + using traits = FloatTraits; + auto powersOfTen = e > 0 ? traits::positiveBinaryPowersOfTen() : traits::negativeBinaryPowersOfTen(); + if (e <= 0) + e = TExponent(-e); + for (uint8_t index = 0; e != 0; index++) { + if (e & 1) + m *= powersOfTen[index]; + e >>= 1; + } + return m; } ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE @@ -1712,948 +1687,953 @@ using JsonFloat = float; ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -enable_if_t::value && is_unsigned::value && - is_integral::value && sizeof(TOut) <= sizeof(TIn), - bool> -canConvertNumber(TIn value) { - return value <= TIn(numeric_limits::highest()); +enable_if_t::value && is_unsigned::value && is_integral::value && sizeof(TOut) <= sizeof(TIn), bool> canConvertNumber(TIn value) { + return value <= TIn(numeric_limits::highest()); } template -enable_if_t::value && is_unsigned::value && - is_integral::value && sizeof(TIn) < sizeof(TOut), - bool> +enable_if_t::value && is_unsigned::value && is_integral::value && sizeof(TIn) < sizeof(TOut), bool> canConvertNumber(TIn) { + return true; +} +template +enable_if_t::value && is_floating_point::value, bool> canConvertNumber(TIn) { + return true; +} +template +enable_if_t::value && is_signed::value && is_integral::value && is_signed::value && sizeof(TOut) < sizeof(TIn), bool> +canConvertNumber(TIn value) { + return value >= TIn(numeric_limits::lowest()) && value <= TIn(numeric_limits::highest()); +} +template +enable_if_t::value && is_signed::value && is_integral::value && is_signed::value && sizeof(TIn) <= sizeof(TOut), bool> canConvertNumber(TIn) { - return true; + return true; } template -enable_if_t::value && is_floating_point::value, bool> -canConvertNumber(TIn) { - return true; -} -template -enable_if_t::value && is_signed::value && - is_integral::value && is_signed::value && - sizeof(TOut) < sizeof(TIn), - bool> +enable_if_t::value && is_signed::value && is_integral::value && is_unsigned::value && sizeof(TOut) >= sizeof(TIn), bool> canConvertNumber(TIn value) { - return value >= TIn(numeric_limits::lowest()) && - value <= TIn(numeric_limits::highest()); + if (value < 0) + return false; + return TOut(value) <= numeric_limits::highest(); } template -enable_if_t::value && is_signed::value && - is_integral::value && is_signed::value && - sizeof(TIn) <= sizeof(TOut), - bool> -canConvertNumber(TIn) { - return true; -} -template -enable_if_t::value && is_signed::value && - is_integral::value && is_unsigned::value && - sizeof(TOut) >= sizeof(TIn), - bool> +enable_if_t::value && is_signed::value && is_integral::value && is_unsigned::value && sizeof(TOut) < sizeof(TIn), bool> canConvertNumber(TIn value) { - if (value < 0) - return false; - return TOut(value) <= numeric_limits::highest(); + if (value < 0) + return false; + return value <= TIn(numeric_limits::highest()); } template -enable_if_t::value && is_signed::value && - is_integral::value && is_unsigned::value && - sizeof(TOut) < sizeof(TIn), - bool> -canConvertNumber(TIn value) { - if (value < 0) - return false; - return value <= TIn(numeric_limits::highest()); +enable_if_t::value && is_integral::value && sizeof(TOut) < sizeof(TIn), bool> canConvertNumber(TIn value) { + return value >= numeric_limits::lowest() && value <= numeric_limits::highest(); } template -enable_if_t::value && is_integral::value && - sizeof(TOut) < sizeof(TIn), - bool> -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && - value <= numeric_limits::highest(); +enable_if_t::value && is_integral::value && sizeof(TOut) >= sizeof(TIn), bool> canConvertNumber(TIn value) { + return value >= numeric_limits::lowest() && value <= FloatTraits::template highest_for(); } template -enable_if_t::value && is_integral::value && - sizeof(TOut) >= sizeof(TIn), - bool> -canConvertNumber(TIn value) { - return value >= numeric_limits::lowest() && - value <= FloatTraits::template highest_for(); -} -template -enable_if_t::value && is_floating_point::value, - bool> -canConvertNumber(TIn) { - return true; +enable_if_t::value && is_floating_point::value, bool> canConvertNumber(TIn) { + return true; } template TOut convertNumber(TIn value) { - return canConvertNumber(value) ? TOut(value) : 0; + return canConvertNumber(value) ? TOut(value) : 0; } ARDUINOJSON_END_PRIVATE_NAMESPACE #if defined(__clang__) -# pragma clang diagnostic pop +#pragma clang diagnostic pop #elif defined(__GNUC__) -# pragma GCC diagnostic pop +#pragma GCC diagnostic pop #endif #if ARDUINOJSON_ENABLE_STD_STREAM #include #endif ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE class JsonString { - friend struct detail::StringAdapter; - public: - JsonString() : str_(nullptr, 0, true) {} - JsonString(const char* data, bool isStatic = false) - : str_(data, data ? ::strlen(data) : 0, isStatic) {} - template ::value && - !detail::is_same::value, - int> = 0> - JsonString(const char* data, TSize sz, bool isStatic = false) - : str_(data, size_t(sz), isStatic) {} - const char* c_str() const { - return str_.data(); - } - bool isNull() const { - return str_.isNull(); - } - bool isStatic() const { - return str_.isStatic(); - } - size_t size() const { - return str_.size(); - } - explicit operator bool() const { - return str_.data() != 0; - } - friend bool operator==(JsonString lhs, JsonString rhs) { - if (lhs.size() != rhs.size()) - return false; - if (lhs.c_str() == rhs.c_str()) - return true; - if (!lhs.c_str()) - return false; - if (!rhs.c_str()) - return false; - return memcmp(lhs.c_str(), rhs.c_str(), lhs.size()) == 0; - } - friend bool operator!=(JsonString lhs, JsonString rhs) { - return !(lhs == rhs); - } + friend struct detail::StringAdapter; + + public: + JsonString() + : str_(nullptr, 0, true) { + } + JsonString(const char * data, bool isStatic = false) + : str_(data, data ? ::strlen(data) : 0, isStatic) { + } + template ::value && !detail::is_same::value, int> = 0> + JsonString(const char * data, TSize sz, bool isStatic = false) + : str_(data, size_t(sz), isStatic) { + } + const char * c_str() const { + return str_.data(); + } + bool isNull() const { + return str_.isNull(); + } + bool isStatic() const { + return str_.isStatic(); + } + size_t size() const { + return str_.size(); + } + explicit operator bool() const { + return str_.data() != 0; + } + friend bool operator==(JsonString lhs, JsonString rhs) { + if (lhs.size() != rhs.size()) + return false; + if (lhs.c_str() == rhs.c_str()) + return true; + if (!lhs.c_str()) + return false; + if (!rhs.c_str()) + return false; + return memcmp(lhs.c_str(), rhs.c_str(), lhs.size()) == 0; + } + friend bool operator!=(JsonString lhs, JsonString rhs) { + return !(lhs == rhs); + } #if ARDUINOJSON_ENABLE_STD_STREAM - friend std::ostream& operator<<(std::ostream& lhs, const JsonString& rhs) { - lhs.write(rhs.c_str(), static_cast(rhs.size())); - return lhs; - } + friend std::ostream & operator<<(std::ostream & lhs, const JsonString & rhs) { + lhs.write(rhs.c_str(), static_cast(rhs.size())); + return lhs; + } #endif - private: - detail::RamString str_; + private: + detail::RamString str_; }; namespace detail { template <> struct StringAdapter { - using AdaptedString = RamString; - static const AdaptedString& adapt(const JsonString& s) { - return s.str_; - } + using AdaptedString = RamString; + static const AdaptedString & adapt(const JsonString & s) { + return s.str_; + } }; -} // namespace detail +} // namespace detail ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE class VariantData; class ResourceManager; class CollectionIterator { - friend class CollectionData; - public: - CollectionIterator() : slot_(nullptr), currentId_(NULL_SLOT) {} - void next(const ResourceManager* resources); - bool done() const { - return slot_ == nullptr; - } - bool operator==(const CollectionIterator& other) const { - return slot_ == other.slot_; - } - bool operator!=(const CollectionIterator& other) const { - return slot_ != other.slot_; - } - VariantData* operator->() { - ARDUINOJSON_ASSERT(slot_ != nullptr); - return data(); - } - VariantData& operator*() { - ARDUINOJSON_ASSERT(slot_ != nullptr); - return *data(); - } - const VariantData& operator*() const { - ARDUINOJSON_ASSERT(slot_ != nullptr); - return *data(); - } - VariantData* data() { - return reinterpret_cast(slot_); - } - const VariantData* data() const { - return reinterpret_cast(slot_); - } - private: - CollectionIterator(VariantData* slot, SlotId slotId); - VariantData* slot_; - SlotId currentId_, nextId_; + friend class CollectionData; + + public: + CollectionIterator() + : slot_(nullptr) + , currentId_(NULL_SLOT) { + } + void next(const ResourceManager * resources); + bool done() const { + return slot_ == nullptr; + } + bool operator==(const CollectionIterator & other) const { + return slot_ == other.slot_; + } + bool operator!=(const CollectionIterator & other) const { + return slot_ != other.slot_; + } + VariantData * operator->() { + ARDUINOJSON_ASSERT(slot_ != nullptr); + return data(); + } + VariantData & operator*() { + ARDUINOJSON_ASSERT(slot_ != nullptr); + return *data(); + } + const VariantData & operator*() const { + ARDUINOJSON_ASSERT(slot_ != nullptr); + return *data(); + } + VariantData * data() { + return reinterpret_cast(slot_); + } + const VariantData * data() const { + return reinterpret_cast(slot_); + } + + private: + CollectionIterator(VariantData * slot, SlotId slotId); + VariantData * slot_; + SlotId currentId_, nextId_; }; class CollectionData { - SlotId head_ = NULL_SLOT; - SlotId tail_ = NULL_SLOT; - public: - static void* operator new(size_t, void* p) noexcept { - return p; - } - static void operator delete(void*, void*) noexcept {} - using iterator = CollectionIterator; - iterator createIterator(const ResourceManager* resources) const; - size_t size(const ResourceManager*) const; - size_t nesting(const ResourceManager*) const; - void clear(ResourceManager* resources); - static void clear(CollectionData* collection, ResourceManager* resources) { - if (!collection) - return; - collection->clear(resources); - } - SlotId head() const { - return head_; - } - protected: - void appendOne(Slot slot, const ResourceManager* resources); - void appendPair(Slot key, Slot value, - const ResourceManager* resources); - void removeOne(iterator it, ResourceManager* resources); - void removePair(iterator it, ResourceManager* resources); - private: - Slot getPreviousSlot(VariantData*, const ResourceManager*) const; + SlotId head_ = NULL_SLOT; + SlotId tail_ = NULL_SLOT; + + public: + static void * operator new(size_t, void * p) noexcept { + return p; + } + static void operator delete(void *, void *) noexcept { + } + using iterator = CollectionIterator; + iterator createIterator(const ResourceManager * resources) const; + size_t size(const ResourceManager *) const; + size_t nesting(const ResourceManager *) const; + void clear(ResourceManager * resources); + static void clear(CollectionData * collection, ResourceManager * resources) { + if (!collection) + return; + collection->clear(resources); + } + SlotId head() const { + return head_; + } + + protected: + void appendOne(Slot slot, const ResourceManager * resources); + void appendPair(Slot key, Slot value, const ResourceManager * resources); + void removeOne(iterator it, ResourceManager * resources); + void removePair(iterator it, ResourceManager * resources); + + private: + Slot getPreviousSlot(VariantData *, const ResourceManager *) const; }; -inline const VariantData* collectionToVariant( - const CollectionData* collection) { - const void* data = collection; // prevent warning cast-align - return reinterpret_cast(data); +inline const VariantData * collectionToVariant(const CollectionData * collection) { + const void * data = collection; // prevent warning cast-align + return reinterpret_cast(data); } -inline VariantData* collectionToVariant(CollectionData* collection) { - void* data = collection; // prevent warning cast-align - return reinterpret_cast(data); +inline VariantData * collectionToVariant(CollectionData * collection) { + void * data = collection; // prevent warning cast-align + return reinterpret_cast(data); } class ArrayData : public CollectionData { - public: - VariantData* addElement(ResourceManager* resources); - static VariantData* addElement(ArrayData* array, ResourceManager* resources) { - if (!array) - return nullptr; - return array->addElement(resources); - } - template - bool addValue(const T& value, ResourceManager* resources); - template - static bool addValue(ArrayData* array, const T& value, - ResourceManager* resources) { - if (!array) - return false; - return array->addValue(value, resources); - } - VariantData* getOrAddElement(size_t index, ResourceManager* resources); - VariantData* getElement(size_t index, const ResourceManager* resources) const; - static VariantData* getElement(const ArrayData* array, size_t index, - const ResourceManager* resources) { - if (!array) - return nullptr; - return array->getElement(index, resources); - } - void removeElement(size_t index, ResourceManager* resources); - static void removeElement(ArrayData* array, size_t index, - ResourceManager* resources) { - if (!array) - return; - array->removeElement(index, resources); - } - void remove(iterator it, ResourceManager* resources) { - CollectionData::removeOne(it, resources); - } - static void remove(ArrayData* array, iterator it, - ResourceManager* resources) { - if (array) - return array->remove(it, resources); - } - private: - iterator at(size_t index, const ResourceManager* resources) const; + public: + VariantData * addElement(ResourceManager * resources); + static VariantData * addElement(ArrayData * array, ResourceManager * resources) { + if (!array) + return nullptr; + return array->addElement(resources); + } + template + bool addValue(const T & value, ResourceManager * resources); + template + static bool addValue(ArrayData * array, const T & value, ResourceManager * resources) { + if (!array) + return false; + return array->addValue(value, resources); + } + VariantData * getOrAddElement(size_t index, ResourceManager * resources); + VariantData * getElement(size_t index, const ResourceManager * resources) const; + static VariantData * getElement(const ArrayData * array, size_t index, const ResourceManager * resources) { + if (!array) + return nullptr; + return array->getElement(index, resources); + } + void removeElement(size_t index, ResourceManager * resources); + static void removeElement(ArrayData * array, size_t index, ResourceManager * resources) { + if (!array) + return; + array->removeElement(index, resources); + } + void remove(iterator it, ResourceManager * resources) { + CollectionData::removeOne(it, resources); + } + static void remove(ArrayData * array, iterator it, ResourceManager * resources) { + if (array) + return array->remove(it, resources); + } + + private: + iterator at(size_t index, const ResourceManager * resources) const; }; ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE #if ARDUINOJSON_USE_LONG_LONG using JsonInteger = int64_t; -using JsonUInt = uint64_t; +using JsonUInt = uint64_t; #else using JsonInteger = long; -using JsonUInt = unsigned long; +using JsonUInt = unsigned long; #endif ARDUINOJSON_END_PUBLIC_NAMESPACE -#define ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(T) \ - static_assert(sizeof(T) <= sizeof(ArduinoJson::JsonInteger), \ - "To use 64-bit integers with ArduinoJson, you must set " \ - "ARDUINOJSON_USE_LONG_LONG to 1. See " \ - "https://arduinojson.org/v7/api/config/use_long_long/"); +#define ARDUINOJSON_ASSERT_INTEGER_TYPE_IS_SUPPORTED(T) \ + static_assert(sizeof(T) <= sizeof(ArduinoJson::JsonInteger), \ + "To use 64-bit integers with ArduinoJson, you must set " \ + "ARDUINOJSON_USE_LONG_LONG to 1. See " \ + "https://arduinojson.org/v7/api/config/use_long_long/"); ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE class ObjectData : public CollectionData { - public: - template // also works with StringNode* - VariantData* addMember(TAdaptedString key, ResourceManager* resources); - template - VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources); - template - VariantData* getMember(TAdaptedString key, - const ResourceManager* resources) const; - template - static VariantData* getMember(const ObjectData* object, TAdaptedString key, - const ResourceManager* resources) { - if (!object) - return nullptr; - return object->getMember(key, resources); - } - template - void removeMember(TAdaptedString key, ResourceManager* resources); - template - static void removeMember(ObjectData* obj, TAdaptedString key, - ResourceManager* resources) { - if (!obj) - return; - obj->removeMember(key, resources); - } - void remove(iterator it, ResourceManager* resources) { - CollectionData::removePair(it, resources); - } - static void remove(ObjectData* obj, ObjectData::iterator it, - ResourceManager* resources) { - if (!obj) - return; - obj->remove(it, resources); - } - size_t size(const ResourceManager* resources) const { - return CollectionData::size(resources) / 2; - } - static size_t size(const ObjectData* obj, const ResourceManager* resources) { - if (!obj) - return 0; - return obj->size(resources); - } - private: - template - iterator findKey(TAdaptedString key, const ResourceManager* resources) const; + public: + template + VariantData * addMember(TAdaptedString key, ResourceManager * resources); + VariantData * addPair(VariantData ** value, ResourceManager * resources); + template + VariantData * getOrAddMember(TAdaptedString key, ResourceManager * resources); + template + VariantData * getMember(TAdaptedString key, const ResourceManager * resources) const; + template + static VariantData * getMember(const ObjectData * object, TAdaptedString key, const ResourceManager * resources) { + if (!object) + return nullptr; + return object->getMember(key, resources); + } + template + void removeMember(TAdaptedString key, ResourceManager * resources); + template + static void removeMember(ObjectData * obj, TAdaptedString key, ResourceManager * resources) { + if (!obj) + return; + obj->removeMember(key, resources); + } + void remove(iterator it, ResourceManager * resources) { + CollectionData::removePair(it, resources); + } + static void remove(ObjectData * obj, ObjectData::iterator it, ResourceManager * resources) { + if (!obj) + return; + obj->remove(it, resources); + } + size_t size(const ResourceManager * resources) const { + return CollectionData::size(resources) / 2; + } + static size_t size(const ObjectData * obj, const ResourceManager * resources) { + if (!obj) + return 0; + return obj->size(resources); + } + + private: + template + iterator findKey(TAdaptedString key, const ResourceManager * resources) const; }; enum class VariantTypeBits : uint8_t { - OwnedStringBit = 0x01, // 0000 0001 - NumberBit = 0x08, // 0000 1000 + OwnedStringBit = 0x01, // 0000 0001 + NumberBit = 0x08, // 0000 1000 #if ARDUINOJSON_USE_EXTENSIONS - ExtensionBit = 0x10, // 0001 0000 + ExtensionBit = 0x10, // 0001 0000 #endif - CollectionMask = 0x60, + CollectionMask = 0x60, }; enum class VariantType : uint8_t { - Null = 0, // 0000 0000 - RawString = 0x03, // 0000 0011 - LinkedString = 0x04, // 0000 0100 - OwnedString = 0x05, // 0000 0101 - Boolean = 0x06, // 0000 0110 - Uint32 = 0x0A, // 0000 1010 - Int32 = 0x0C, // 0000 1100 - Float = 0x0E, // 0000 1110 + Null = 0, // 0000 0000 + TinyString = 0x02, // 0000 0010 + RawString = 0x03, // 0000 0011 + LinkedString = 0x04, // 0000 0100 + OwnedString = 0x05, // 0000 0101 + Boolean = 0x06, // 0000 0110 + Uint32 = 0x0A, // 0000 1010 + Int32 = 0x0C, // 0000 1100 + Float = 0x0E, // 0000 1110 #if ARDUINOJSON_USE_LONG_LONG - Uint64 = 0x1A, // 0001 1010 - Int64 = 0x1C, // 0001 1100 + Uint64 = 0x1A, // 0001 1010 + Int64 = 0x1C, // 0001 1100 #endif #if ARDUINOJSON_USE_DOUBLE - Double = 0x1E, // 0001 1110 + Double = 0x1E, // 0001 1110 #endif - Object = 0x20, - Array = 0x40, + Object = 0x20, + Array = 0x40, }; inline bool operator&(VariantType type, VariantTypeBits bit) { - return (uint8_t(type) & uint8_t(bit)) != 0; + return (uint8_t(type) & uint8_t(bit)) != 0; } +const size_t tinyStringMaxLength = 3; union VariantContent { - VariantContent() {} - float asFloat; - bool asBoolean; - uint32_t asUint32; - int32_t asInt32; + VariantContent() { + } + float asFloat; + bool asBoolean; + uint32_t asUint32; + int32_t asInt32; #if ARDUINOJSON_USE_EXTENSIONS - SlotId asSlotId; + SlotId asSlotId; #endif - ArrayData asArray; - ObjectData asObject; - CollectionData asCollection; - const char* asLinkedString; - struct StringNode* asOwnedString; + ArrayData asArray; + ObjectData asObject; + CollectionData asCollection; + const char * asLinkedString; + struct StringNode * asOwnedString; + char asTinyString[tinyStringMaxLength + 1]; }; #if ARDUINOJSON_USE_EXTENSIONS union VariantExtension { -# if ARDUINOJSON_USE_LONG_LONG - uint64_t asUint64; - int64_t asInt64; -# endif -# if ARDUINOJSON_USE_DOUBLE - double asDouble; -# endif +#if ARDUINOJSON_USE_LONG_LONG + uint64_t asUint64; + int64_t asInt64; +#endif +#if ARDUINOJSON_USE_DOUBLE + double asDouble; +#endif }; #endif template -T parseNumber(const char* s); -class VariantData { - VariantContent content_; // must be first to allow cast from array to variant - VariantType type_; - SlotId next_; - public: - static void* operator new(size_t, void* p) noexcept { - return p; - } - static void operator delete(void*, void*) noexcept {} - VariantData() : type_(VariantType::Null), next_(NULL_SLOT) {} - SlotId next() const { - return next_; - } - void setNext(SlotId slot) { - next_ = slot; - } - template - typename TVisitor::result_type accept( - TVisitor& visit, const ResourceManager* resources) const { -#if ARDUINOJSON_USE_EXTENSIONS - auto extension = getExtension(resources); -#else - (void)resources; // silence warning -#endif - switch (type_) { - case VariantType::Float: - return visit.visit(content_.asFloat); -#if ARDUINOJSON_USE_DOUBLE - case VariantType::Double: - return visit.visit(extension->asDouble); -#endif - case VariantType::Array: - return visit.visit(content_.asArray); - case VariantType::Object: - return visit.visit(content_.asObject); - case VariantType::LinkedString: - return visit.visit(JsonString(content_.asLinkedString, true)); - case VariantType::OwnedString: - return visit.visit(JsonString(content_.asOwnedString->data, - content_.asOwnedString->length)); - case VariantType::RawString: - return visit.visit(RawString(content_.asOwnedString->data, - content_.asOwnedString->length)); - case VariantType::Int32: - return visit.visit(static_cast(content_.asInt32)); - case VariantType::Uint32: - return visit.visit(static_cast(content_.asUint32)); -#if ARDUINOJSON_USE_LONG_LONG - case VariantType::Int64: - return visit.visit(extension->asInt64); - case VariantType::Uint64: - return visit.visit(extension->asUint64); -#endif - case VariantType::Boolean: - return visit.visit(content_.asBoolean != 0); - default: - return visit.visit(nullptr); - } - } - template - static typename TVisitor::result_type accept(const VariantData* var, - const ResourceManager* resources, - TVisitor& visit) { - if (var != 0) - return var->accept(visit, resources); - else - return visit.visit(nullptr); - } - VariantData* addElement(ResourceManager* resources) { - auto array = isNull() ? &toArray() : asArray(); - return detail::ArrayData::addElement(array, resources); - } - static VariantData* addElement(VariantData* var, ResourceManager* resources) { - if (!var) - return nullptr; - return var->addElement(resources); - } - template - bool addValue(const T& value, ResourceManager* resources) { - auto array = isNull() ? &toArray() : asArray(); - return detail::ArrayData::addValue(array, value, resources); - } - template - static bool addValue(VariantData* var, const T& value, - ResourceManager* resources) { - if (!var) - return false; - return var->addValue(value, resources); - } - bool asBoolean(const ResourceManager* resources) const { -#if ARDUINOJSON_USE_EXTENSIONS - auto extension = getExtension(resources); -#else - (void)resources; // silence warning -#endif - switch (type_) { - case VariantType::Boolean: - return content_.asBoolean; - case VariantType::Uint32: - case VariantType::Int32: - return content_.asUint32 != 0; - case VariantType::Float: - return content_.asFloat != 0; -#if ARDUINOJSON_USE_DOUBLE - case VariantType::Double: - return extension->asDouble != 0; -#endif - case VariantType::Null: +T parseNumber(const char * s); +template +static bool isTinyString(const T & s, size_t n) { + if (n > tinyStringMaxLength) return false; -#if ARDUINOJSON_USE_LONG_LONG - case VariantType::Uint64: - case VariantType::Int64: - return extension->asUint64 != 0; + bool containsNul = false; + for (uint8_t i = 0; i < uint8_t(n); i++) + containsNul |= !s[i]; + return !containsNul; +} +class VariantData { + VariantContent content_; // must be first to allow cast from array to variant + VariantType type_; + SlotId next_; + + public: + static void * operator new(size_t, void * p) noexcept { + return p; + } + static void operator delete(void *, void *) noexcept { + } + VariantData() + : type_(VariantType::Null) + , next_(NULL_SLOT) { + } + SlotId next() const { + return next_; + } + void setNext(SlotId slot) { + next_ = slot; + } + template + typename TVisitor::result_type accept(TVisitor & visit, const ResourceManager * resources) const { +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else + (void)resources; // silence warning #endif - default: + switch (type_) { + case VariantType::Float: + return visit.visit(content_.asFloat); +#if ARDUINOJSON_USE_DOUBLE + case VariantType::Double: + return visit.visit(extension->asDouble); +#endif + case VariantType::Array: + return visit.visit(content_.asArray); + case VariantType::Object: + return visit.visit(content_.asObject); + case VariantType::TinyString: + return visit.visit(JsonString(content_.asTinyString)); + case VariantType::LinkedString: + return visit.visit(JsonString(content_.asLinkedString, true)); + case VariantType::OwnedString: + return visit.visit(JsonString(content_.asOwnedString->data, content_.asOwnedString->length)); + case VariantType::RawString: + return visit.visit(RawString(content_.asOwnedString->data, content_.asOwnedString->length)); + case VariantType::Int32: + return visit.visit(static_cast(content_.asInt32)); + case VariantType::Uint32: + return visit.visit(static_cast(content_.asUint32)); +#if ARDUINOJSON_USE_LONG_LONG + case VariantType::Int64: + return visit.visit(extension->asInt64); + case VariantType::Uint64: + return visit.visit(extension->asUint64); +#endif + case VariantType::Boolean: + return visit.visit(content_.asBoolean != 0); + default: + return visit.visit(nullptr); + } + } + template + static typename TVisitor::result_type accept(const VariantData * var, const ResourceManager * resources, TVisitor & visit) { + if (var != 0) + return var->accept(visit, resources); + else + return visit.visit(nullptr); + } + VariantData * addElement(ResourceManager * resources) { + auto array = isNull() ? &toArray() : asArray(); + return detail::ArrayData::addElement(array, resources); + } + static VariantData * addElement(VariantData * var, ResourceManager * resources) { + if (!var) + return nullptr; + return var->addElement(resources); + } + template + bool addValue(const T & value, ResourceManager * resources) { + auto array = isNull() ? &toArray() : asArray(); + return detail::ArrayData::addValue(array, value, resources); + } + template + static bool addValue(VariantData * var, const T & value, ResourceManager * resources) { + if (!var) + return false; + return var->addValue(value, resources); + } + bool asBoolean(const ResourceManager * resources) const { +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else + (void)resources; // silence warning +#endif + switch (type_) { + case VariantType::Boolean: + return content_.asBoolean; + case VariantType::Uint32: + case VariantType::Int32: + return content_.asUint32 != 0; + case VariantType::Float: + return content_.asFloat != 0; +#if ARDUINOJSON_USE_DOUBLE + case VariantType::Double: + return extension->asDouble != 0; +#endif + case VariantType::Null: + return false; +#if ARDUINOJSON_USE_LONG_LONG + case VariantType::Uint64: + case VariantType::Int64: + return extension->asUint64 != 0; +#endif + default: + return true; + } + } + ArrayData * asArray() { + return isArray() ? &content_.asArray : 0; + } + const ArrayData * asArray() const { + return const_cast(this)->asArray(); + } + CollectionData * asCollection() { + return isCollection() ? &content_.asCollection : 0; + } + const CollectionData * asCollection() const { + return const_cast(this)->asCollection(); + } + template + T asFloat(const ResourceManager * resources) const { + static_assert(is_floating_point::value, "T must be a floating point"); +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else + (void)resources; // silence warning +#endif + const char * str = nullptr; + switch (type_) { + case VariantType::Boolean: + return static_cast(content_.asBoolean); + case VariantType::Uint32: + return static_cast(content_.asUint32); + case VariantType::Int32: + return static_cast(content_.asInt32); +#if ARDUINOJSON_USE_LONG_LONG + case VariantType::Uint64: + return static_cast(extension->asUint64); + case VariantType::Int64: + return static_cast(extension->asInt64); +#endif + case VariantType::TinyString: + str = content_.asTinyString; + break; + case VariantType::LinkedString: + str = content_.asLinkedString; + break; + case VariantType::OwnedString: + str = content_.asOwnedString->data; + break; + case VariantType::Float: + return static_cast(content_.asFloat); +#if ARDUINOJSON_USE_DOUBLE + case VariantType::Double: + return static_cast(extension->asDouble); +#endif + default: + return 0.0; + } + ARDUINOJSON_ASSERT(str != nullptr); + return parseNumber(str); + } + template + T asIntegral(const ResourceManager * resources) const { + static_assert(is_integral::value, "T must be an integral type"); +#if ARDUINOJSON_USE_EXTENSIONS + auto extension = getExtension(resources); +#else + (void)resources; // silence warning +#endif + const char * str = nullptr; + switch (type_) { + case VariantType::Boolean: + return content_.asBoolean; + case VariantType::Uint32: + return convertNumber(content_.asUint32); + case VariantType::Int32: + return convertNumber(content_.asInt32); +#if ARDUINOJSON_USE_LONG_LONG + case VariantType::Uint64: + return convertNumber(extension->asUint64); + case VariantType::Int64: + return convertNumber(extension->asInt64); +#endif + case VariantType::TinyString: + str = content_.asTinyString; + break; + case VariantType::LinkedString: + str = content_.asLinkedString; + break; + case VariantType::OwnedString: + str = content_.asOwnedString->data; + break; + case VariantType::Float: + return convertNumber(content_.asFloat); +#if ARDUINOJSON_USE_DOUBLE + case VariantType::Double: + return convertNumber(extension->asDouble); +#endif + default: + return 0; + } + ARDUINOJSON_ASSERT(str != nullptr); + return parseNumber(str); + } + ObjectData * asObject() { + return isObject() ? &content_.asObject : 0; + } + const ObjectData * asObject() const { + return const_cast(this)->asObject(); + } + JsonString asRawString() const { + switch (type_) { + case VariantType::RawString: + return JsonString(content_.asOwnedString->data, content_.asOwnedString->length); + default: + return JsonString(); + } + } + JsonString asString() const { + switch (type_) { + case VariantType::TinyString: + return JsonString(content_.asTinyString); + case VariantType::LinkedString: + return JsonString(content_.asLinkedString, true); + case VariantType::OwnedString: + return JsonString(content_.asOwnedString->data, content_.asOwnedString->length); + default: + return JsonString(); + } + } +#if ARDUINOJSON_USE_EXTENSIONS + const VariantExtension * getExtension(const ResourceManager * resources) const; +#endif + VariantData * getElement(size_t index, const ResourceManager * resources) const { + return ArrayData::getElement(asArray(), index, resources); + } + static VariantData * getElement(const VariantData * var, size_t index, const ResourceManager * resources) { + return var != 0 ? var->getElement(index, resources) : 0; + } + template + VariantData * getMember(TAdaptedString key, const ResourceManager * resources) const { + return ObjectData::getMember(asObject(), key, resources); + } + template + static VariantData * getMember(const VariantData * var, TAdaptedString key, const ResourceManager * resources) { + if (!var) + return 0; + return var->getMember(key, resources); + } + VariantData * getOrAddElement(size_t index, ResourceManager * resources) { + auto array = isNull() ? &toArray() : asArray(); + if (!array) + return nullptr; + return array->getOrAddElement(index, resources); + } + template + VariantData * getOrAddMember(TAdaptedString key, ResourceManager * resources) { + if (key.isNull()) + return nullptr; + auto obj = isNull() ? &toObject() : asObject(); + if (!obj) + return nullptr; + return obj->getOrAddMember(key, resources); + } + bool isArray() const { + return type_ == VariantType::Array; + } + bool isBoolean() const { + return type_ == VariantType::Boolean; + } + bool isCollection() const { + return type_ & VariantTypeBits::CollectionMask; + } + bool isFloat() const { + return type_ & VariantTypeBits::NumberBit; + } + template + bool isInteger(const ResourceManager * resources) const { +#if ARDUINOJSON_USE_LONG_LONG + auto extension = getExtension(resources); +#else + (void)resources; // silence warning +#endif + switch (type_) { + case VariantType::Uint32: + return canConvertNumber(content_.asUint32); + case VariantType::Int32: + return canConvertNumber(content_.asInt32); +#if ARDUINOJSON_USE_LONG_LONG + case VariantType::Uint64: + return canConvertNumber(extension->asUint64); + case VariantType::Int64: + return canConvertNumber(extension->asInt64); +#endif + default: + return false; + } + } + bool isNull() const { + return type_ == VariantType::Null; + } + static bool isNull(const VariantData * var) { + if (!var) + return true; + return var->isNull(); + } + bool isObject() const { + return type_ == VariantType::Object; + } + bool isString() const { + return type_ == VariantType::LinkedString || type_ == VariantType::OwnedString || type_ == VariantType::TinyString; + } + size_t nesting(const ResourceManager * resources) const { + auto collection = asCollection(); + if (collection) + return collection->nesting(resources); + else + return 0; + } + static size_t nesting(const VariantData * var, const ResourceManager * resources) { + if (!var) + return 0; + return var->nesting(resources); + } + void removeElement(size_t index, ResourceManager * resources) { + ArrayData::removeElement(asArray(), index, resources); + } + static void removeElement(VariantData * var, size_t index, ResourceManager * resources) { + if (!var) + return; + var->removeElement(index, resources); + } + template + void removeMember(TAdaptedString key, ResourceManager * resources) { + ObjectData::removeMember(asObject(), key, resources); + } + template + static void removeMember(VariantData * var, TAdaptedString key, ResourceManager * resources) { + if (!var) + return; + var->removeMember(key, resources); + } + void reset() { + type_ = VariantType::Null; + } + void setBoolean(bool value) { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + type_ = VariantType::Boolean; + content_.asBoolean = value; + } + template + enable_if_t setFloat(T value, ResourceManager *) { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + type_ = VariantType::Float; + content_.asFloat = value; return true; } - } - ArrayData* asArray() { - return isArray() ? &content_.asArray : 0; - } - const ArrayData* asArray() const { - return const_cast(this)->asArray(); - } - CollectionData* asCollection() { - return isCollection() ? &content_.asCollection : 0; - } - const CollectionData* asCollection() const { - return const_cast(this)->asCollection(); - } - template - T asFloat(const ResourceManager* resources) const { - static_assert(is_floating_point::value, "T must be a floating point"); -#if ARDUINOJSON_USE_EXTENSIONS - auto extension = getExtension(resources); -#else - (void)resources; // silence warning -#endif - switch (type_) { - case VariantType::Boolean: - return static_cast(content_.asBoolean); - case VariantType::Uint32: - return static_cast(content_.asUint32); - case VariantType::Int32: - return static_cast(content_.asInt32); -#if ARDUINOJSON_USE_LONG_LONG - case VariantType::Uint64: - return static_cast(extension->asUint64); - case VariantType::Int64: - return static_cast(extension->asInt64); -#endif - case VariantType::LinkedString: - case VariantType::OwnedString: - return parseNumber(content_.asOwnedString->data); - case VariantType::Float: - return static_cast(content_.asFloat); -#if ARDUINOJSON_USE_DOUBLE - case VariantType::Double: - return static_cast(extension->asDouble); -#endif - default: + template + enable_if_t setFloat(T value, ResourceManager *); + template + enable_if_t::value, bool> setInteger(T value, ResourceManager * resources); + template + enable_if_t::value, bool> setInteger(T value, ResourceManager * resources); + void setRawString(StringNode * s) { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + ARDUINOJSON_ASSERT(s); + type_ = VariantType::RawString; + content_.asOwnedString = s; + } + template + void setRawString(SerializedValue value, ResourceManager * resources); + template + static void setRawString(VariantData * var, SerializedValue value, ResourceManager * resources) { + if (!var) + return; + var->clear(resources); + var->setRawString(value, resources); + } + template + bool setString(TAdaptedString value, ResourceManager * resources); + template + static void setString(VariantData * var, TAdaptedString value, ResourceManager * resources) { + if (!var) + return; + var->clear(resources); + var->setString(value, resources); + } + void setLinkedString(const char * s) { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + ARDUINOJSON_ASSERT(s); + type_ = VariantType::LinkedString; + content_.asLinkedString = s; + } + template + void setTinyString(const TAdaptedString & s) { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + ARDUINOJSON_ASSERT(s.size() <= tinyStringMaxLength); + type_ = VariantType::TinyString; + auto n = uint8_t(s.size()); + for (uint8_t i = 0; i < n; i++) { + char c = s[i]; + ARDUINOJSON_ASSERT(c != 0); // no NUL in tiny string + content_.asTinyString[i] = c; + } + content_.asTinyString[n] = 0; + } + void setOwnedString(StringNode * s) { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + ARDUINOJSON_ASSERT(s); + type_ = VariantType::OwnedString; + content_.asOwnedString = s; + } + size_t size(const ResourceManager * resources) const { + if (isObject()) + return content_.asObject.size(resources); + if (isArray()) + return content_.asArray.size(resources); return 0; } - } - template - T asIntegral(const ResourceManager* resources) const { - static_assert(is_integral::value, "T must be an integral type"); -#if ARDUINOJSON_USE_EXTENSIONS - auto extension = getExtension(resources); -#else - (void)resources; // silence warning -#endif - switch (type_) { - case VariantType::Boolean: - return content_.asBoolean; - case VariantType::Uint32: - return convertNumber(content_.asUint32); - case VariantType::Int32: - return convertNumber(content_.asInt32); -#if ARDUINOJSON_USE_LONG_LONG - case VariantType::Uint64: - return convertNumber(extension->asUint64); - case VariantType::Int64: - return convertNumber(extension->asInt64); -#endif - case VariantType::LinkedString: - return parseNumber(content_.asLinkedString); - case VariantType::OwnedString: - return parseNumber(content_.asOwnedString->data); - case VariantType::Float: - return convertNumber(content_.asFloat); -#if ARDUINOJSON_USE_DOUBLE - case VariantType::Double: - return convertNumber(extension->asDouble); -#endif - default: - return 0; + static size_t size(const VariantData * var, const ResourceManager * resources) { + return var != 0 ? var->size(resources) : 0; } - } - ObjectData* asObject() { - return isObject() ? &content_.asObject : 0; - } - const ObjectData* asObject() const { - return const_cast(this)->asObject(); - } - JsonString asRawString() const { - switch (type_) { - case VariantType::RawString: - return JsonString(content_.asOwnedString->data, - content_.asOwnedString->length); - default: - return JsonString(); + ArrayData & toArray() { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + type_ = VariantType::Array; + new (&content_.asArray) ArrayData(); + return content_.asArray; } - } - JsonString asString() const { - switch (type_) { - case VariantType::LinkedString: - return JsonString(content_.asLinkedString, true); - case VariantType::OwnedString: - return JsonString(content_.asOwnedString->data, - content_.asOwnedString->length); - default: - return JsonString(); + static ArrayData * toArray(VariantData * var, ResourceManager * resources) { + if (!var) + return 0; + var->clear(resources); + return &var->toArray(); } - } -#if ARDUINOJSON_USE_EXTENSIONS - const VariantExtension* getExtension(const ResourceManager* resources) const; -#endif - VariantData* getElement(size_t index, - const ResourceManager* resources) const { - return ArrayData::getElement(asArray(), index, resources); - } - static VariantData* getElement(const VariantData* var, size_t index, - const ResourceManager* resources) { - return var != 0 ? var->getElement(index, resources) : 0; - } - template - VariantData* getMember(TAdaptedString key, - const ResourceManager* resources) const { - return ObjectData::getMember(asObject(), key, resources); - } - template - static VariantData* getMember(const VariantData* var, TAdaptedString key, - const ResourceManager* resources) { - if (!var) - return 0; - return var->getMember(key, resources); - } - VariantData* getOrAddElement(size_t index, ResourceManager* resources) { - auto array = isNull() ? &toArray() : asArray(); - if (!array) - return nullptr; - return array->getOrAddElement(index, resources); - } - template - VariantData* getOrAddMember(TAdaptedString key, ResourceManager* resources) { - if (key.isNull()) - return nullptr; - auto obj = isNull() ? &toObject() : asObject(); - if (!obj) - return nullptr; - return obj->getOrAddMember(key, resources); - } - bool isArray() const { - return type_ == VariantType::Array; - } - bool isBoolean() const { - return type_ == VariantType::Boolean; - } - bool isCollection() const { - return type_ & VariantTypeBits::CollectionMask; - } - bool isFloat() const { - return type_ & VariantTypeBits::NumberBit; - } - template - bool isInteger(const ResourceManager* resources) const { -#if ARDUINOJSON_USE_LONG_LONG - auto extension = getExtension(resources); -#else - (void)resources; // silence warning -#endif - switch (type_) { - case VariantType::Uint32: - return canConvertNumber(content_.asUint32); - case VariantType::Int32: - return canConvertNumber(content_.asInt32); -#if ARDUINOJSON_USE_LONG_LONG - case VariantType::Uint64: - return canConvertNumber(extension->asUint64); - case VariantType::Int64: - return canConvertNumber(extension->asInt64); -#endif - default: - return false; + ObjectData & toObject() { + ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first + type_ = VariantType::Object; + new (&content_.asObject) ObjectData(); + return content_.asObject; + } + static ObjectData * toObject(VariantData * var, ResourceManager * resources) { + if (!var) + return 0; + var->clear(resources); + return &var->toObject(); + } + VariantType type() const { + return type_; + } + void clear(ResourceManager * resources); + static void clear(VariantData * var, ResourceManager * resources) { + if (!var) + return; + var->clear(resources); } - } - bool isNull() const { - return type_ == VariantType::Null; - } - static bool isNull(const VariantData* var) { - if (!var) - return true; - return var->isNull(); - } - bool isObject() const { - return type_ == VariantType::Object; - } - bool isString() const { - return type_ == VariantType::LinkedString || - type_ == VariantType::OwnedString; - } - size_t nesting(const ResourceManager* resources) const { - auto collection = asCollection(); - if (collection) - return collection->nesting(resources); - else - return 0; - } - static size_t nesting(const VariantData* var, - const ResourceManager* resources) { - if (!var) - return 0; - return var->nesting(resources); - } - void removeElement(size_t index, ResourceManager* resources) { - ArrayData::removeElement(asArray(), index, resources); - } - static void removeElement(VariantData* var, size_t index, - ResourceManager* resources) { - if (!var) - return; - var->removeElement(index, resources); - } - template - void removeMember(TAdaptedString key, ResourceManager* resources) { - ObjectData::removeMember(asObject(), key, resources); - } - template - static void removeMember(VariantData* var, TAdaptedString key, - ResourceManager* resources) { - if (!var) - return; - var->removeMember(key, resources); - } - void reset() { - type_ = VariantType::Null; - } - void setBoolean(bool value) { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - type_ = VariantType::Boolean; - content_.asBoolean = value; - } - template - enable_if_t setFloat(T value, ResourceManager*) { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - type_ = VariantType::Float; - content_.asFloat = value; - return true; - } - template - enable_if_t setFloat(T value, ResourceManager*); - template - enable_if_t::value, bool> setInteger(T value, - ResourceManager* resources); - template - enable_if_t::value, bool> setInteger( - T value, ResourceManager* resources); - void setRawString(StringNode* s) { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - ARDUINOJSON_ASSERT(s); - type_ = VariantType::RawString; - content_.asOwnedString = s; - } - template - void setRawString(SerializedValue value, ResourceManager* resources); - template - static void setRawString(VariantData* var, SerializedValue value, - ResourceManager* resources) { - if (!var) - return; - var->clear(resources); - var->setRawString(value, resources); - } - template - bool setString(TAdaptedString value, ResourceManager* resources); - bool setString(StringNode* s, ResourceManager*) { - setOwnedString(s); - return true; - } - template - static void setString(VariantData* var, TAdaptedString value, - ResourceManager* resources) { - if (!var) - return; - var->clear(resources); - var->setString(value, resources); - } - void setLinkedString(const char* s) { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - ARDUINOJSON_ASSERT(s); - type_ = VariantType::LinkedString; - content_.asLinkedString = s; - } - void setOwnedString(StringNode* s) { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - ARDUINOJSON_ASSERT(s); - type_ = VariantType::OwnedString; - content_.asOwnedString = s; - } - size_t size(const ResourceManager* resources) const { - if (isObject()) - return content_.asObject.size(resources); - if (isArray()) - return content_.asArray.size(resources); - return 0; - } - static size_t size(const VariantData* var, const ResourceManager* resources) { - return var != 0 ? var->size(resources) : 0; - } - ArrayData& toArray() { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - type_ = VariantType::Array; - new (&content_.asArray) ArrayData(); - return content_.asArray; - } - static ArrayData* toArray(VariantData* var, ResourceManager* resources) { - if (!var) - return 0; - var->clear(resources); - return &var->toArray(); - } - ObjectData& toObject() { - ARDUINOJSON_ASSERT(type_ == VariantType::Null); // must call clear() first - type_ = VariantType::Object; - new (&content_.asObject) ObjectData(); - return content_.asObject; - } - static ObjectData* toObject(VariantData* var, ResourceManager* resources) { - if (!var) - return 0; - var->clear(resources); - return &var->toObject(); - } - VariantType type() const { - return type_; - } - void clear(ResourceManager* resources); - static void clear(VariantData* var, ResourceManager* resources) { - if (!var) - return; - var->clear(resources); - } }; class VariantData; class VariantWithId; class ResourceManager { - union SlotData { - VariantData variant; + union SlotData { + VariantData variant; #if ARDUINOJSON_USE_EXTENSIONS - VariantExtension extension; + VariantExtension extension; #endif - }; - public: - constexpr static size_t slotSize = sizeof(SlotData); - ResourceManager(Allocator* allocator = DefaultAllocator::instance()) - : allocator_(allocator), overflowed_(false) {} - ~ResourceManager() { - stringPool_.clear(allocator_); - variantPools_.clear(allocator_); - } - ResourceManager(const ResourceManager&) = delete; - ResourceManager& operator=(const ResourceManager& src) = delete; - friend void swap(ResourceManager& a, ResourceManager& b) { - swap(a.stringPool_, b.stringPool_); - swap(a.variantPools_, b.variantPools_); - swap_(a.allocator_, b.allocator_); - swap_(a.overflowed_, b.overflowed_); - } - Allocator* allocator() const { - return allocator_; - } - size_t size() const { - return variantPools_.size() + stringPool_.size(); - } - bool overflowed() const { - return overflowed_; - } - Slot allocVariant(); - void freeVariant(Slot slot); - VariantData* getVariant(SlotId id) const; + }; + + public: + constexpr static size_t slotSize = sizeof(SlotData); + ResourceManager(Allocator * allocator = DefaultAllocator::instance()) + : allocator_(allocator) + , overflowed_(false) { + } + ~ResourceManager() { + stringPool_.clear(allocator_); + variantPools_.clear(allocator_); + } + ResourceManager(const ResourceManager &) = delete; + ResourceManager & operator=(const ResourceManager & src) = delete; + friend void swap(ResourceManager & a, ResourceManager & b) { + swap(a.stringPool_, b.stringPool_); + swap(a.variantPools_, b.variantPools_); + swap_(a.allocator_, b.allocator_); + swap_(a.overflowed_, b.overflowed_); + } + Allocator * allocator() const { + return allocator_; + } + size_t size() const { + return variantPools_.size() + stringPool_.size(); + } + bool overflowed() const { + return overflowed_; + } + Slot allocVariant(); + void freeVariant(Slot slot); + VariantData * getVariant(SlotId id) const; #if ARDUINOJSON_USE_EXTENSIONS - Slot allocExtension(); - void freeExtension(SlotId slot); - VariantExtension* getExtension(SlotId id) const; + Slot allocExtension(); + void freeExtension(SlotId slot); + VariantExtension * getExtension(SlotId id) const; #endif - template - StringNode* saveString(TAdaptedString str) { - if (str.isNull()) - return 0; - auto node = stringPool_.add(str, allocator_); - if (!node) - overflowed_ = true; - return node; - } - void saveString(StringNode* node) { - stringPool_.add(node); - } - template - StringNode* getString(const TAdaptedString& str) const { - return stringPool_.get(str); - } - StringNode* createString(size_t length) { - auto node = StringNode::create(length, allocator_); - if (!node) - overflowed_ = true; - return node; - } - StringNode* resizeString(StringNode* node, size_t length) { - node = StringNode::resize(node, length, allocator_); - if (!node) - overflowed_ = true; - return node; - } - void destroyString(StringNode* node) { - StringNode::destroy(node, allocator_); - } - void dereferenceString(const char* s) { - stringPool_.dereference(s, allocator_); - } - void clear() { - variantPools_.clear(allocator_); - overflowed_ = false; - stringPool_.clear(allocator_); - } - void shrinkToFit() { - variantPools_.shrinkToFit(allocator_); - } - private: - Allocator* allocator_; - bool overflowed_; - StringPool stringPool_; - MemoryPoolList variantPools_; + template + StringNode * saveString(TAdaptedString str) { + if (str.isNull()) + return 0; + auto node = stringPool_.add(str, allocator_); + if (!node) + overflowed_ = true; + return node; + } + void saveString(StringNode * node) { + stringPool_.add(node); + } + template + StringNode * getString(const TAdaptedString & str) const { + return stringPool_.get(str); + } + StringNode * createString(size_t length) { + auto node = StringNode::create(length, allocator_); + if (!node) + overflowed_ = true; + return node; + } + StringNode * resizeString(StringNode * node, size_t length) { + node = StringNode::resize(node, length, allocator_); + if (!node) + overflowed_ = true; + return node; + } + void destroyString(StringNode * node) { + StringNode::destroy(node, allocator_); + } + void dereferenceString(const char * s) { + stringPool_.dereference(s, allocator_); + } + void clear() { + variantPools_.clear(allocator_); + overflowed_ = false; + stringPool_.clear(allocator_); + } + void shrinkToFit() { + variantPools_.shrinkToFit(allocator_); + } + + private: + Allocator * allocator_; + bool overflowed_; + StringPool stringPool_; + MemoryPoolList variantPools_; }; template struct IsString : false_type {}; template -struct IsString::AdaptedString>> - : true_type {}; +struct IsString::AdaptedString>> : true_type {}; ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE class JsonArray; @@ -2665,122 +2645,104 @@ template struct VariantTo {}; template <> struct VariantTo { - using type = JsonArray; + using type = JsonArray; }; template <> struct VariantTo { - using type = JsonObject; + using type = JsonObject; }; template <> struct VariantTo { - using type = JsonVariant; + using type = JsonVariant; }; class VariantAttorney { - public: - template - static auto getResourceManager(TClient& client) - -> decltype(client.getResourceManager()) { - return client.getResourceManager(); - } - template - static auto getData(TClient& client) -> decltype(client.getData()) { - return client.getData(); - } - template - static VariantData* getOrCreateData(TClient& client) { - return client.getOrCreateData(); - } + public: + template + static auto getResourceManager(TClient & client) -> decltype(client.getResourceManager()) { + return client.getResourceManager(); + } + template + static auto getData(TClient & client) -> decltype(client.getData()) { + return client.getData(); + } + template + static VariantData * getOrCreateData(TClient & client) { + return client.getOrCreateData(); + } }; enum CompareResult { - COMPARE_RESULT_DIFFER = 0, - COMPARE_RESULT_EQUAL = 1, - COMPARE_RESULT_GREATER = 2, - COMPARE_RESULT_LESS = 4, - COMPARE_RESULT_GREATER_OR_EQUAL = 3, - COMPARE_RESULT_LESS_OR_EQUAL = 5 + COMPARE_RESULT_DIFFER = 0, + COMPARE_RESULT_EQUAL = 1, + COMPARE_RESULT_GREATER = 2, + COMPARE_RESULT_LESS = 4, + COMPARE_RESULT_GREATER_OR_EQUAL = 3, + COMPARE_RESULT_LESS_OR_EQUAL = 5 }; template -CompareResult arithmeticCompare(const T& lhs, const T& rhs) { - if (lhs < rhs) - return COMPARE_RESULT_LESS; - else if (lhs > rhs) - return COMPARE_RESULT_GREATER; - else - return COMPARE_RESULT_EQUAL; +CompareResult arithmeticCompare(const T & lhs, const T & rhs) { + if (lhs < rhs) + return COMPARE_RESULT_LESS; + else if (lhs > rhs) + return COMPARE_RESULT_GREATER; + else + return COMPARE_RESULT_EQUAL; +} +template +CompareResult arithmeticCompare(const T1 & lhs, const T2 & rhs, enable_if_t::value && is_integral::value && sizeof(T1) < sizeof(T2)> * = 0) { + return arithmeticCompare(static_cast(lhs), rhs); +} +template +CompareResult arithmeticCompare(const T1 & lhs, const T2 & rhs, enable_if_t::value && is_integral::value && sizeof(T2) < sizeof(T1)> * = 0) { + return arithmeticCompare(lhs, static_cast(rhs)); +} +template +CompareResult +arithmeticCompare(const T1 & lhs, + const T2 & rhs, + enable_if_t::value && is_integral::value && is_signed::value == is_signed::value && sizeof(T2) == sizeof(T1)> * = 0) { + return arithmeticCompare(lhs, static_cast(rhs)); } template CompareResult arithmeticCompare( - const T1& lhs, const T2& rhs, - enable_if_t::value && is_integral::value && - sizeof(T1) < sizeof(T2)>* = 0) { - return arithmeticCompare(static_cast(lhs), rhs); + const T1 & lhs, + const T2 & rhs, + enable_if_t::value && is_integral::value && is_unsigned::value && is_signed::value && sizeof(T2) == sizeof(T1)> * = 0) { + if (rhs < 0) + return COMPARE_RESULT_GREATER; + return arithmeticCompare(lhs, static_cast(rhs)); } template CompareResult arithmeticCompare( - const T1& lhs, const T2& rhs, - enable_if_t::value && is_integral::value && - sizeof(T2) < sizeof(T1)>* = 0) { - return arithmeticCompare(lhs, static_cast(rhs)); + const T1 & lhs, + const T2 & rhs, + enable_if_t::value && is_integral::value && is_signed::value && is_unsigned::value && sizeof(T2) == sizeof(T1)> * = 0) { + if (lhs < 0) + return COMPARE_RESULT_LESS; + return arithmeticCompare(static_cast(lhs), rhs); } template -CompareResult arithmeticCompare( - const T1& lhs, const T2& rhs, - enable_if_t::value && is_integral::value && - is_signed::value == is_signed::value && - sizeof(T2) == sizeof(T1)>* = 0) { - return arithmeticCompare(lhs, static_cast(rhs)); -} -template -CompareResult arithmeticCompare( - const T1& lhs, const T2& rhs, - enable_if_t::value && is_integral::value && - is_unsigned::value && is_signed::value && - sizeof(T2) == sizeof(T1)>* = 0) { - if (rhs < 0) - return COMPARE_RESULT_GREATER; - return arithmeticCompare(lhs, static_cast(rhs)); -} -template -CompareResult arithmeticCompare( - const T1& lhs, const T2& rhs, - enable_if_t::value && is_integral::value && - is_signed::value && is_unsigned::value && - sizeof(T2) == sizeof(T1)>* = 0) { - if (lhs < 0) - return COMPARE_RESULT_LESS; - return arithmeticCompare(static_cast(lhs), rhs); -} -template -CompareResult arithmeticCompare( - const T1& lhs, const T2& rhs, - enable_if_t::value || is_floating_point::value>* = - 0) { - return arithmeticCompare(static_cast(lhs), - static_cast(rhs)); +CompareResult arithmeticCompare(const T1 & lhs, const T2 & rhs, enable_if_t::value || is_floating_point::value> * = 0) { + return arithmeticCompare(static_cast(lhs), static_cast(rhs)); } template -CompareResult arithmeticCompareNegateLeft( - JsonUInt, const T2&, enable_if_t::value>* = 0) { - return COMPARE_RESULT_LESS; +CompareResult arithmeticCompareNegateLeft(JsonUInt, const T2 &, enable_if_t::value> * = 0) { + return COMPARE_RESULT_LESS; } template -CompareResult arithmeticCompareNegateLeft( - JsonUInt lhs, const T2& rhs, enable_if_t::value>* = 0) { - if (rhs > 0) - return COMPARE_RESULT_LESS; - return arithmeticCompare(-rhs, static_cast(lhs)); +CompareResult arithmeticCompareNegateLeft(JsonUInt lhs, const T2 & rhs, enable_if_t::value> * = 0) { + if (rhs > 0) + return COMPARE_RESULT_LESS; + return arithmeticCompare(-rhs, static_cast(lhs)); } template -CompareResult arithmeticCompareNegateRight( - const T1&, JsonUInt, enable_if_t::value>* = 0) { - return COMPARE_RESULT_GREATER; -} -template -CompareResult arithmeticCompareNegateRight( - const T1& lhs, JsonUInt rhs, enable_if_t::value>* = 0) { - if (lhs > 0) +CompareResult arithmeticCompareNegateRight(const T1 &, JsonUInt, enable_if_t::value> * = 0) { return COMPARE_RESULT_GREATER; - return arithmeticCompare(static_cast(rhs), -lhs); +} +template +CompareResult arithmeticCompareNegateRight(const T1 & lhs, JsonUInt rhs, enable_if_t::value> * = 0) { + if (lhs > 0) + return COMPARE_RESULT_GREATER; + return arithmeticCompare(static_cast(rhs), -lhs); } struct VariantTag {}; template @@ -2792,254 +2754,225 @@ ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template CompareResult compare(JsonVariantConst lhs, - const T& rhs); // VariantCompare.cpp + const T & rhs); // VariantCompare.cpp struct VariantOperatorTag {}; template struct VariantOperators : VariantOperatorTag { - template ::value && !is_array::value, int> = 0> - friend T operator|(const TVariant& variant, const T& defaultValue) { - if (variant.template is()) - return variant.template as(); - else - return defaultValue; - } - friend const char* operator|(const TVariant& variant, - const char* defaultValue) { - if (variant.template is()) - return variant.template as(); - else - return defaultValue; - } - template - friend enable_if_t::value, JsonVariantConst> operator|( - const TVariant& variant, const T& defaultValue) { - if (variant) - return variant; - else - return defaultValue; - } - template - friend bool operator==(T* lhs, const TVariant& rhs) { - return compare(rhs, lhs) == COMPARE_RESULT_EQUAL; - } - template - friend bool operator==(const T& lhs, const TVariant& rhs) { - return compare(rhs, lhs) == COMPARE_RESULT_EQUAL; - } - template - friend bool operator==(const TVariant& lhs, T* rhs) { - return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; - } - template ::value, int> = 0> - friend bool operator==(const TVariant& lhs, const T& rhs) { - return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; - } - template - friend bool operator!=(T* lhs, const TVariant& rhs) { - return compare(rhs, lhs) != COMPARE_RESULT_EQUAL; - } - template - friend bool operator!=(const T& lhs, const TVariant& rhs) { - return compare(rhs, lhs) != COMPARE_RESULT_EQUAL; - } - template - friend bool operator!=(const TVariant& lhs, T* rhs) { - return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; - } - template ::value, int> = 0> - friend bool operator!=(TVariant lhs, const T& rhs) { - return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; - } - template - friend bool operator<(T* lhs, const TVariant& rhs) { - return compare(rhs, lhs) == COMPARE_RESULT_GREATER; - } - template - friend bool operator<(const T& lhs, const TVariant& rhs) { - return compare(rhs, lhs) == COMPARE_RESULT_GREATER; - } - template - friend bool operator<(const TVariant& lhs, T* rhs) { - return compare(lhs, rhs) == COMPARE_RESULT_LESS; - } - template ::value, int> = 0> - friend bool operator<(TVariant lhs, const T& rhs) { - return compare(lhs, rhs) == COMPARE_RESULT_LESS; - } - template - friend bool operator<=(T* lhs, const TVariant& rhs) { - return (compare(rhs, lhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; - } - template - friend bool operator<=(const T& lhs, const TVariant& rhs) { - return (compare(rhs, lhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; - } - template - friend bool operator<=(const TVariant& lhs, T* rhs) { - return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; - } - template ::value, int> = 0> - friend bool operator<=(TVariant lhs, const T& rhs) { - return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; - } - template - friend bool operator>(T* lhs, const TVariant& rhs) { - return compare(rhs, lhs) == COMPARE_RESULT_LESS; - } - template - friend bool operator>(const T& lhs, const TVariant& rhs) { - return compare(rhs, lhs) == COMPARE_RESULT_LESS; - } - template - friend bool operator>(const TVariant& lhs, T* rhs) { - return compare(lhs, rhs) == COMPARE_RESULT_GREATER; - } - template ::value, int> = 0> - friend bool operator>(TVariant lhs, const T& rhs) { - return compare(lhs, rhs) == COMPARE_RESULT_GREATER; - } - template - friend bool operator>=(T* lhs, const TVariant& rhs) { - return (compare(rhs, lhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; - } - template - friend bool operator>=(const T& lhs, const TVariant& rhs) { - return (compare(rhs, lhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; - } - template - friend bool operator>=(const TVariant& lhs, T* rhs) { - return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; - } - template ::value, int> = 0> - friend bool operator>=(const TVariant& lhs, const T& rhs) { - return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; - } + template ::value && !is_array::value, int> = 0> + friend T operator|(const TVariant & variant, const T & defaultValue) { + if (variant.template is()) + return variant.template as(); + else + return defaultValue; + } + friend const char * operator|(const TVariant & variant, const char * defaultValue) { + if (variant.template is()) + return variant.template as(); + else + return defaultValue; + } + template + friend enable_if_t::value, JsonVariantConst> operator|(const TVariant & variant, const T & defaultValue) { + if (variant) + return variant; + else + return defaultValue; + } + template + friend bool operator==(T * lhs, const TVariant & rhs) { + return compare(rhs, lhs) == COMPARE_RESULT_EQUAL; + } + template + friend bool operator==(const T & lhs, const TVariant & rhs) { + return compare(rhs, lhs) == COMPARE_RESULT_EQUAL; + } + template + friend bool operator==(const TVariant & lhs, T * rhs) { + return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; + } + template ::value, int> = 0> + friend bool operator==(const TVariant & lhs, const T & rhs) { + return compare(lhs, rhs) == COMPARE_RESULT_EQUAL; + } + template + friend bool operator!=(T * lhs, const TVariant & rhs) { + return compare(rhs, lhs) != COMPARE_RESULT_EQUAL; + } + template + friend bool operator!=(const T & lhs, const TVariant & rhs) { + return compare(rhs, lhs) != COMPARE_RESULT_EQUAL; + } + template + friend bool operator!=(const TVariant & lhs, T * rhs) { + return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; + } + template ::value, int> = 0> + friend bool operator!=(TVariant lhs, const T & rhs) { + return compare(lhs, rhs) != COMPARE_RESULT_EQUAL; + } + template + friend bool operator<(T * lhs, const TVariant & rhs) { + return compare(rhs, lhs) == COMPARE_RESULT_GREATER; + } + template + friend bool operator<(const T & lhs, const TVariant & rhs) { + return compare(rhs, lhs) == COMPARE_RESULT_GREATER; + } + template + friend bool operator<(const TVariant & lhs, T * rhs) { + return compare(lhs, rhs) == COMPARE_RESULT_LESS; + } + template ::value, int> = 0> + friend bool operator<(TVariant lhs, const T & rhs) { + return compare(lhs, rhs) == COMPARE_RESULT_LESS; + } + template + friend bool operator<=(T * lhs, const TVariant & rhs) { + return (compare(rhs, lhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; + } + template + friend bool operator<=(const T & lhs, const TVariant & rhs) { + return (compare(rhs, lhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; + } + template + friend bool operator<=(const TVariant & lhs, T * rhs) { + return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; + } + template ::value, int> = 0> + friend bool operator<=(TVariant lhs, const T & rhs) { + return (compare(lhs, rhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; + } + template + friend bool operator>(T * lhs, const TVariant & rhs) { + return compare(rhs, lhs) == COMPARE_RESULT_LESS; + } + template + friend bool operator>(const T & lhs, const TVariant & rhs) { + return compare(rhs, lhs) == COMPARE_RESULT_LESS; + } + template + friend bool operator>(const TVariant & lhs, T * rhs) { + return compare(lhs, rhs) == COMPARE_RESULT_GREATER; + } + template ::value, int> = 0> + friend bool operator>(TVariant lhs, const T & rhs) { + return compare(lhs, rhs) == COMPARE_RESULT_GREATER; + } + template + friend bool operator>=(T * lhs, const TVariant & rhs) { + return (compare(rhs, lhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; + } + template + friend bool operator>=(const T & lhs, const TVariant & rhs) { + return (compare(rhs, lhs) & COMPARE_RESULT_LESS_OR_EQUAL) != 0; + } + template + friend bool operator>=(const TVariant & lhs, T * rhs) { + return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; + } + template ::value, int> = 0> + friend bool operator>=(const TVariant & lhs, const T & rhs) { + return (compare(lhs, rhs) & COMPARE_RESULT_GREATER_OR_EQUAL) != 0; + } }; ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE class JsonArray; class JsonObject; -class JsonVariantConst : public detail::VariantTag, - public detail::VariantOperators { - friend class detail::VariantAttorney; - template - using ConversionSupported = - detail::is_same::fromJson)>::arg1_type, - JsonVariantConst>; - public: - JsonVariantConst() : data_(nullptr), resources_(nullptr) {} - explicit JsonVariantConst(const detail::VariantData* data, - const detail::ResourceManager* resources) - : data_(data), resources_(resources) {} - bool isNull() const { - return detail::VariantData::isNull(data_); - } - bool isUnbound() const { - return !data_; - } - size_t nesting() const { - return detail::VariantData::nesting(data_, resources_); - } - size_t size() const { - return detail::VariantData::size(data_, resources_); - } - template ::value, int> = 0> - T as() const { - return Converter::fromJson(*this); - } - template ::value, int> = 0> - detail::InvalidConversion as() const; - template ::value, int> = 0> - bool is() const { - return Converter::checkJson(*this); - } - template ::value, int> = 0> - bool is() const { - return false; - } - template - operator T() const { - return as(); - } - template ::value, int> = 0> - JsonVariantConst operator[](T index) const { - return JsonVariantConst( - detail::VariantData::getElement(data_, size_t(index), resources_), - resources_); - } - template ::value, int> = 0> - JsonVariantConst operator[](const TString& key) const { - return JsonVariantConst(detail::VariantData::getMember( - data_, detail::adaptString(key), resources_), - resources_); - } - template ::value && - !detail::is_const::value, - int> = 0> - JsonVariantConst operator[](TChar* key) const { - return JsonVariantConst(detail::VariantData::getMember( - data_, detail::adaptString(key), resources_), - resources_); - } - template ::value, int> = 0> - JsonVariantConst operator[](const TVariant& key) const { - if (key.template is()) - return operator[](key.template as()); - else - return operator[](key.template as()); - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use var[key].is() instead") - bool containsKey(const TString& key) const { - return detail::VariantData::getMember(getData(), detail::adaptString(key), - resources_) != 0; - } - template ::value && - !detail::is_const::value, - int> = 0> - ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") - bool containsKey(TChar* key) const { - return detail::VariantData::getMember(getData(), detail::adaptString(key), - resources_) != 0; - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use var[key].is() instead") - bool containsKey(const TVariant& key) const { - return containsKey(key.template as()); - } - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - protected: - const detail::VariantData* getData() const { - return data_; - } - const detail::ResourceManager* getResourceManager() const { - return resources_; - } - private: - const detail::VariantData* data_; - const detail::ResourceManager* resources_; +class JsonVariantConst : public detail::VariantTag, public detail::VariantOperators { + friend class detail::VariantAttorney; + template + using ConversionSupported = detail::is_same::fromJson)>::arg1_type, JsonVariantConst>; + + public: + JsonVariantConst() + : data_(nullptr) + , resources_(nullptr) { + } + explicit JsonVariantConst(const detail::VariantData * data, const detail::ResourceManager * resources) + : data_(data) + , resources_(resources) { + } + bool isNull() const { + return detail::VariantData::isNull(data_); + } + bool isUnbound() const { + return !data_; + } + size_t nesting() const { + return detail::VariantData::nesting(data_, resources_); + } + size_t size() const { + return detail::VariantData::size(data_, resources_); + } + template ::value, int> = 0> + T as() const { + return Converter::fromJson(*this); + } + template ::value, int> = 0> + detail::InvalidConversion as() const; + template ::value, int> = 0> + bool is() const { + return Converter::checkJson(*this); + } + template ::value, int> = 0> + bool is() const { + return false; + } + template + operator T() const { + return as(); + } + template ::value, int> = 0> + JsonVariantConst operator[](T index) const { + return JsonVariantConst(detail::VariantData::getElement(data_, size_t(index), resources_), resources_); + } + template ::value, int> = 0> + JsonVariantConst operator[](const TString & key) const { + return JsonVariantConst(detail::VariantData::getMember(data_, detail::adaptString(key), resources_), resources_); + } + template ::value && !detail::is_const::value, int> = 0> + JsonVariantConst operator[](TChar * key) const { + return JsonVariantConst(detail::VariantData::getMember(data_, detail::adaptString(key), resources_), resources_); + } + template ::value, int> = 0> + JsonVariantConst operator[](const TVariant & key) const { + if (key.template is()) + return operator[](key.template as()); + else + return operator[](key.template as()); + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use var[key].is() instead") + bool containsKey(const TString & key) const { + return detail::VariantData::getMember(getData(), detail::adaptString(key), resources_) != 0; + } + template ::value && !detail::is_const::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") + bool containsKey(TChar * key) const { + return detail::VariantData::getMember(getData(), detail::adaptString(key), resources_) != 0; + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use var[key].is() instead") + bool containsKey(const TVariant & key) const { + return containsKey(key.template as()); + } + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + + protected: + const detail::VariantData * getData() const { + return data_; + } + const detail::ResourceManager * getResourceManager() const { + return resources_; + } + + private: + const detail::VariantData * data_; + const detail::ResourceManager * resources_; }; class JsonVariant; ARDUINOJSON_END_PUBLIC_NAMESPACE @@ -3050,2048 +2983,2026 @@ template class MemberProxy; template class VariantRefBase : public VariantTag { - friend class VariantAttorney; - public: - void clear() const { - VariantData::clear(getOrCreateData(), getResourceManager()); - } - bool isNull() const { - return VariantData::isNull(getData()); - } - bool isUnbound() const { - return !getData(); - } - template - T as() const; - template ::value, int> = 0> - operator T() const { - return as(); - } - template ::value, int> = 0> - JsonArray to() const; - template ::value, int> = 0> - JsonObject to() const; - template ::value, int> = 0> - JsonVariant to() const; - template - FORCE_INLINE bool is() const; - template - bool set(const T& value) const { - using TypeForConverter = conditional_t::value, T, - remove_cv_t>>; - return doSet>(value); - } - template ::value, int> = 0> - bool set(T* value) const { - return doSet>(value); - } - size_t size() const { - return VariantData::size(getData(), getResourceManager()); - } - size_t nesting() const { - return VariantData::nesting(getData(), getResourceManager()); - } - template ::value, int> = 0> - T add() const { - return add().template to(); - } - template ::value, int> = 0> - T add() const; - template - bool add(const T& value) const { - return detail::VariantData::addValue(getOrCreateData(), value, - getResourceManager()); - } - template ::value, int> = 0> - bool add(T* value) const { - return detail::VariantData::addValue(getOrCreateData(), value, - getResourceManager()); - } - void remove(size_t index) const { - VariantData::removeElement(getData(), index, getResourceManager()); - } - template ::value, int> = 0> - void remove(TChar* key) const { - VariantData::removeMember(getData(), adaptString(key), - getResourceManager()); - } - template ::value, int> = 0> - void remove(const TString& key) const { - VariantData::removeMember(getData(), adaptString(key), - getResourceManager()); - } - template ::value, int> = 0> - void remove(const TVariant& key) const { - if (key.template is()) - remove(key.template as()); - else - remove(key.template as()); - } - ElementProxy operator[](size_t index) const; - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[key].is() instead") - bool containsKey(const TString& key) const; - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") - bool containsKey(TChar* key) const; - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[key].is() instead") - bool containsKey(const TVariant& key) const; - template ::value, int> = 0> - FORCE_INLINE MemberProxy> operator[]( - const TString& key) const; - template < - typename TChar, - enable_if_t::value && !is_const::value, int> = 0> - FORCE_INLINE MemberProxy> operator[]( - TChar* key) const; - template ::value, int> = 0> - JsonVariantConst operator[](const TVariant& key) const { - if (key.template is()) - return operator[](key.template as()); - else - return operator[](key.template as()); - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonVariant add() const; - ARDUINOJSON_DEPRECATED("use add() instead") - JsonArray createNestedArray() const; - template - ARDUINOJSON_DEPRECATED("use var[key].to() instead") - JsonArray createNestedArray(TChar* key) const; - template - ARDUINOJSON_DEPRECATED("use var[key].to() instead") - JsonArray createNestedArray(const TString& key) const; - ARDUINOJSON_DEPRECATED("use add() instead") - JsonObject createNestedObject() const; - template - ARDUINOJSON_DEPRECATED("use var[key].to() instead") - JsonObject createNestedObject(TChar* key) const; - template - ARDUINOJSON_DEPRECATED("use var[key].to() instead") - JsonObject createNestedObject(const TString& key) const; - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - ARDUINOJSON_DEPRECATED("performs a deep copy") - void shallowCopy(JsonVariantConst src) const { - set(src); - } - private: - TDerived& derived() { - return static_cast(*this); - } - const TDerived& derived() const { - return static_cast(*this); - } - ResourceManager* getResourceManager() const { - return VariantAttorney::getResourceManager(derived()); - } - VariantData* getData() const { - return VariantAttorney::getData(derived()); - } - VariantData* getOrCreateData() const { - return VariantAttorney::getOrCreateData(derived()); - } - FORCE_INLINE ArduinoJson::JsonVariant getVariant() const; - FORCE_INLINE ArduinoJson::JsonVariantConst getVariantConst() const { - return ArduinoJson::JsonVariantConst(getData(), getResourceManager()); - } - template - FORCE_INLINE enable_if_t::value, T> getVariant() - const { - return getVariantConst(); - } - template - FORCE_INLINE enable_if_t::value, T> getVariant() - const { - return getVariant(); - } - template - bool doSet(const T& value) const { - return doSet( - value, is_same::return_type, - bool>{}); - } - template - bool doSet(const T& value, false_type) const; - template - bool doSet(const T& value, true_type) const; - ArduinoJson::JsonVariant getOrCreateVariant() const; + friend class VariantAttorney; + + public: + void clear() const { + VariantData::clear(getOrCreateData(), getResourceManager()); + } + bool isNull() const { + return VariantData::isNull(getData()); + } + bool isUnbound() const { + return !getData(); + } + template + T as() const; + template ::value, int> = 0> + operator T() const { + return as(); + } + template ::value, int> = 0> + JsonArray to() const; + template ::value, int> = 0> + JsonObject to() const; + template ::value, int> = 0> + JsonVariant to() const; + template + FORCE_INLINE bool is() const; + template + bool set(const T & value) const { + using TypeForConverter = conditional_t::value, T, remove_cv_t>>; + return doSet>(value); + } + template ::value, int> = 0> + bool set(T * value) const { + return doSet>(value); + } + size_t size() const { + return VariantData::size(getData(), getResourceManager()); + } + size_t nesting() const { + return VariantData::nesting(getData(), getResourceManager()); + } + template ::value, int> = 0> + T add() const { + return add().template to(); + } + template ::value, int> = 0> + T add() const; + template + bool add(const T & value) const { + return detail::VariantData::addValue(getOrCreateData(), value, getResourceManager()); + } + template ::value, int> = 0> + bool add(T * value) const { + return detail::VariantData::addValue(getOrCreateData(), value, getResourceManager()); + } + void remove(size_t index) const { + VariantData::removeElement(getData(), index, getResourceManager()); + } + template ::value, int> = 0> + void remove(TChar * key) const { + VariantData::removeMember(getData(), adaptString(key), getResourceManager()); + } + template ::value, int> = 0> + void remove(const TString & key) const { + VariantData::removeMember(getData(), adaptString(key), getResourceManager()); + } + template ::value, int> = 0> + void remove(const TVariant & key) const { + if (key.template is()) + remove(key.template as()); + else + remove(key.template as()); + } + ElementProxy operator[](size_t index) const; + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[key].is() instead") + bool containsKey(const TString & key) const; + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") + bool containsKey(TChar * key) const; + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[key].is() instead") + bool containsKey(const TVariant & key) const; + template ::value, int> = 0> + FORCE_INLINE MemberProxy> operator[](const TString & key) const; + template ::value && !is_const::value, int> = 0> + FORCE_INLINE MemberProxy> operator[](TChar * key) const; + template ::value, int> = 0> + JsonVariantConst operator[](const TVariant & key) const { + if (key.template is()) + return operator[](key.template as()); + else + return operator[](key.template as()); + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonVariant add() const; + ARDUINOJSON_DEPRECATED("use add() instead") + JsonArray createNestedArray() const; + template + ARDUINOJSON_DEPRECATED("use var[key].to() instead") + JsonArray createNestedArray(TChar * key) const; + template + ARDUINOJSON_DEPRECATED("use var[key].to() instead") + JsonArray createNestedArray(const TString & key) const; + ARDUINOJSON_DEPRECATED("use add() instead") + JsonObject createNestedObject() const; + template + ARDUINOJSON_DEPRECATED("use var[key].to() instead") + JsonObject createNestedObject(TChar * key) const; + template + ARDUINOJSON_DEPRECATED("use var[key].to() instead") + JsonObject createNestedObject(const TString & key) const; + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + ARDUINOJSON_DEPRECATED("performs a deep copy") + void shallowCopy(JsonVariantConst src) const { + set(src); + } + + private: + TDerived & derived() { + return static_cast(*this); + } + const TDerived & derived() const { + return static_cast(*this); + } + ResourceManager * getResourceManager() const { + return VariantAttorney::getResourceManager(derived()); + } + VariantData * getData() const { + return VariantAttorney::getData(derived()); + } + VariantData * getOrCreateData() const { + return VariantAttorney::getOrCreateData(derived()); + } + FORCE_INLINE ArduinoJson::JsonVariant getVariant() const; + FORCE_INLINE ArduinoJson::JsonVariantConst getVariantConst() const { + return ArduinoJson::JsonVariantConst(getData(), getResourceManager()); + } + template + FORCE_INLINE enable_if_t::value, T> getVariant() const { + return getVariantConst(); + } + template + FORCE_INLINE enable_if_t::value, T> getVariant() const { + return getVariant(); + } + template + bool doSet(const T & value) const { + return doSet(value, is_same::return_type, bool>{}); + } + template + bool doSet(const T & value, false_type) const; + template + bool doSet(const T & value, true_type) const; + ArduinoJson::JsonVariant getOrCreateVariant() const; }; template -class ElementProxy : public VariantRefBase>, - public VariantOperators> { - friend class VariantAttorney; - friend class VariantRefBase>; - template - friend class MemberProxy; - template - friend class ElementProxy; - public: - ElementProxy(TUpstream upstream, size_t index) - : upstream_(upstream), index_(index) {} - ElementProxy& operator=(const ElementProxy& src) { - this->set(src); - return *this; - } - template - ElementProxy& operator=(const T& src) { - this->set(src); - return *this; - } - template - ElementProxy& operator=(T* src) { - this->set(src); - return *this; - } - private: - ElementProxy(const ElementProxy& src) // Error here? See https://arduinojson.org/v7/proxy-non-copyable/ - : upstream_(src.upstream_), index_(src.index_) {} - ResourceManager* getResourceManager() const { - return VariantAttorney::getResourceManager(upstream_); - } - FORCE_INLINE VariantData* getData() const { - return VariantData::getElement( - VariantAttorney::getData(upstream_), index_, - VariantAttorney::getResourceManager(upstream_)); - } - VariantData* getOrCreateData() const { - auto data = VariantAttorney::getOrCreateData(upstream_); - if (!data) - return nullptr; - return data->getOrAddElement( - index_, VariantAttorney::getResourceManager(upstream_)); - } - TUpstream upstream_; - size_t index_; +class ElementProxy : public VariantRefBase>, public VariantOperators> { + friend class VariantAttorney; + friend class VariantRefBase>; + template + friend class MemberProxy; + template + friend class ElementProxy; + + public: + ElementProxy(TUpstream upstream, size_t index) + : upstream_(upstream) + , index_(index) { + } + ElementProxy & operator=(const ElementProxy & src) { + this->set(src); + return *this; + } + template + ElementProxy & operator=(const T & src) { + this->set(src); + return *this; + } + template + ElementProxy & operator=(T * src) { + this->set(src); + return *this; + } + + private: + ElementProxy(const ElementProxy & src) // Error here? See https://arduinojson.org/v7/proxy-non-copyable/ + : upstream_(src.upstream_) + , index_(src.index_) { + } + ResourceManager * getResourceManager() const { + return VariantAttorney::getResourceManager(upstream_); + } + FORCE_INLINE VariantData * getData() const { + return VariantData::getElement(VariantAttorney::getData(upstream_), index_, VariantAttorney::getResourceManager(upstream_)); + } + VariantData * getOrCreateData() const { + auto data = VariantAttorney::getOrCreateData(upstream_); + if (!data) + return nullptr; + return data->getOrAddElement(index_, VariantAttorney::getResourceManager(upstream_)); + } + TUpstream upstream_; + size_t index_; }; ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE -class JsonVariant : public detail::VariantRefBase, - public detail::VariantOperators { - friend class detail::VariantAttorney; - public: - JsonVariant() : data_(0), resources_(0) {} - JsonVariant(detail::VariantData* data, detail::ResourceManager* resources) - : data_(data), resources_(resources) {} - private: - detail::ResourceManager* getResourceManager() const { - return resources_; - } - detail::VariantData* getData() const { - return data_; - } - detail::VariantData* getOrCreateData() const { - return data_; - } - detail::VariantData* data_; - detail::ResourceManager* resources_; +class JsonVariant : public detail::VariantRefBase, public detail::VariantOperators { + friend class detail::VariantAttorney; + + public: + JsonVariant() + : data_(0) + , resources_(0) { + } + JsonVariant(detail::VariantData * data, detail::ResourceManager * resources) + : data_(data) + , resources_(resources) { + } + + private: + detail::ResourceManager * getResourceManager() const { + return resources_; + } + detail::VariantData * getData() const { + return data_; + } + detail::VariantData * getOrCreateData() const { + return data_; + } + detail::VariantData * data_; + detail::ResourceManager * resources_; }; namespace detail { bool copyVariant(JsonVariant dst, JsonVariantConst src); } template <> struct Converter : private detail::VariantAttorney { - static void toJson(JsonVariantConst src, JsonVariant dst) { - copyVariant(dst, src); - } - static JsonVariant fromJson(JsonVariant src) { - return src; - } - static bool checkJson(JsonVariant src) { - auto data = getData(src); - return !!data; - } + static void toJson(JsonVariantConst src, JsonVariant dst) { + copyVariant(dst, src); + } + static JsonVariant fromJson(JsonVariant src) { + return src; + } + static bool checkJson(JsonVariant src) { + auto data = getData(src); + return !!data; + } }; template <> struct Converter : private detail::VariantAttorney { - static void toJson(JsonVariantConst src, JsonVariant dst) { - copyVariant(dst, src); - } - static JsonVariantConst fromJson(JsonVariantConst src) { - return JsonVariantConst(getData(src), getResourceManager(src)); - } - static bool checkJson(JsonVariantConst src) { - auto data = getData(src); - return !!data; - } + static void toJson(JsonVariantConst src, JsonVariant dst) { + copyVariant(dst, src); + } + static JsonVariantConst fromJson(JsonVariantConst src) { + return JsonVariantConst(getData(src), getResourceManager(src)); + } + static bool checkJson(JsonVariantConst src) { + auto data = getData(src); + return !!data; + } }; template class Ptr { - public: - Ptr(T value) : value_(value) {} - T* operator->() { - return &value_; - } - T& operator*() { - return value_; - } - private: - T value_; + public: + Ptr(T value) + : value_(value) { + } + T * operator->() { + return &value_; + } + T & operator*() { + return value_; + } + + private: + T value_; }; class JsonArrayIterator { - friend class JsonArray; - public: - JsonArrayIterator() {} - explicit JsonArrayIterator(detail::ArrayData::iterator iterator, - detail::ResourceManager* resources) - : iterator_(iterator), resources_(resources) {} - JsonVariant operator*() { - return JsonVariant(iterator_.data(), resources_); - } - Ptr operator->() { - return operator*(); - } - bool operator==(const JsonArrayIterator& other) const { - return iterator_ == other.iterator_; - } - bool operator!=(const JsonArrayIterator& other) const { - return iterator_ != other.iterator_; - } - JsonArrayIterator& operator++() { - iterator_.next(resources_); - return *this; - } - private: - detail::ArrayData::iterator iterator_; - detail::ResourceManager* resources_; + friend class JsonArray; + + public: + JsonArrayIterator() { + } + explicit JsonArrayIterator(detail::ArrayData::iterator iterator, detail::ResourceManager * resources) + : iterator_(iterator) + , resources_(resources) { + } + JsonVariant operator*() { + return JsonVariant(iterator_.data(), resources_); + } + Ptr operator->() { + return operator*(); + } + bool operator==(const JsonArrayIterator & other) const { + return iterator_ == other.iterator_; + } + bool operator!=(const JsonArrayIterator & other) const { + return iterator_ != other.iterator_; + } + JsonArrayIterator & operator++() { + iterator_.next(resources_); + return *this; + } + + private: + detail::ArrayData::iterator iterator_; + detail::ResourceManager * resources_; }; class JsonArrayConstIterator { - friend class JsonArray; - public: - JsonArrayConstIterator() {} - explicit JsonArrayConstIterator(detail::ArrayData::iterator iterator, - const detail::ResourceManager* resources) - : iterator_(iterator), resources_(resources) {} - JsonVariantConst operator*() const { - return JsonVariantConst(iterator_.data(), resources_); - } - Ptr operator->() { - return operator*(); - } - bool operator==(const JsonArrayConstIterator& other) const { - return iterator_ == other.iterator_; - } - bool operator!=(const JsonArrayConstIterator& other) const { - return iterator_ != other.iterator_; - } - JsonArrayConstIterator& operator++() { - iterator_.next(resources_); - return *this; - } - private: - detail::ArrayData::iterator iterator_; - const detail::ResourceManager* resources_; + friend class JsonArray; + + public: + JsonArrayConstIterator() { + } + explicit JsonArrayConstIterator(detail::ArrayData::iterator iterator, const detail::ResourceManager * resources) + : iterator_(iterator) + , resources_(resources) { + } + JsonVariantConst operator*() const { + return JsonVariantConst(iterator_.data(), resources_); + } + Ptr operator->() { + return operator*(); + } + bool operator==(const JsonArrayConstIterator & other) const { + return iterator_ == other.iterator_; + } + bool operator!=(const JsonArrayConstIterator & other) const { + return iterator_ != other.iterator_; + } + JsonArrayConstIterator & operator++() { + iterator_.next(resources_); + return *this; + } + + private: + detail::ArrayData::iterator iterator_; + const detail::ResourceManager * resources_; }; class JsonObject; class JsonArrayConst : public detail::VariantOperators { - friend class JsonArray; - friend class detail::VariantAttorney; - public: - using iterator = JsonArrayConstIterator; - iterator begin() const { - if (!data_) - return iterator(); - return iterator(data_->createIterator(resources_), resources_); - } - iterator end() const { - return iterator(); - } - JsonArrayConst() : data_(0), resources_(0) {} - JsonArrayConst(const detail::ArrayData* data, - const detail::ResourceManager* resources) - : data_(data), resources_(resources) {} - template ::value, int> = 0> - JsonVariantConst operator[](T index) const { - return JsonVariantConst( - detail::ArrayData::getElement(data_, size_t(index), resources_), - resources_); - } - template ::value, int> = 0> - JsonVariantConst operator[](const TVariant& variant) const { - if (variant.template is()) - return operator[](variant.template as()); - else - return JsonVariantConst(); - } - operator JsonVariantConst() const { - return JsonVariantConst(getData(), resources_); - } - bool isNull() const { - return data_ == 0; - } - operator bool() const { - return data_ != 0; - } - size_t nesting() const { - return detail::VariantData::nesting(getData(), resources_); - } - size_t size() const { - return data_ ? data_->size(resources_) : 0; - } - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - private: - const detail::VariantData* getData() const { - return collectionToVariant(data_); - } - const detail::ArrayData* data_; - const detail::ResourceManager* resources_; + friend class JsonArray; + friend class detail::VariantAttorney; + + public: + using iterator = JsonArrayConstIterator; + iterator begin() const { + if (!data_) + return iterator(); + return iterator(data_->createIterator(resources_), resources_); + } + iterator end() const { + return iterator(); + } + JsonArrayConst() + : data_(0) + , resources_(0) { + } + JsonArrayConst(const detail::ArrayData * data, const detail::ResourceManager * resources) + : data_(data) + , resources_(resources) { + } + template ::value, int> = 0> + JsonVariantConst operator[](T index) const { + return JsonVariantConst(detail::ArrayData::getElement(data_, size_t(index), resources_), resources_); + } + template ::value, int> = 0> + JsonVariantConst operator[](const TVariant & variant) const { + if (variant.template is()) + return operator[](variant.template as()); + else + return JsonVariantConst(); + } + operator JsonVariantConst() const { + return JsonVariantConst(getData(), resources_); + } + bool isNull() const { + return data_ == 0; + } + operator bool() const { + return data_ != 0; + } + size_t nesting() const { + return detail::VariantData::nesting(getData(), resources_); + } + size_t size() const { + return data_ ? data_->size(resources_) : 0; + } + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + + private: + const detail::VariantData * getData() const { + return collectionToVariant(data_); + } + const detail::ArrayData * data_; + const detail::ResourceManager * resources_; }; inline bool operator==(JsonArrayConst lhs, JsonArrayConst rhs) { - if (!lhs && !rhs) - return true; - if (!lhs || !rhs) - return false; - auto a = lhs.begin(); - auto b = rhs.begin(); - for (;;) { - if (a == b) // same pointer or both null - return true; - if (a == lhs.end() || b == rhs.end()) - return false; - if (*a != *b) - return false; - ++a; - ++b; - } + if (!lhs && !rhs) + return true; + if (!lhs || !rhs) + return false; + auto a = lhs.begin(); + auto b = rhs.begin(); + for (;;) { + if (a == b) // same pointer or both null + return true; + if (a == lhs.end() || b == rhs.end()) + return false; + if (*a != *b) + return false; + ++a; + ++b; + } } class JsonObject; class JsonArray : public detail::VariantOperators { - friend class detail::VariantAttorney; - public: - using iterator = JsonArrayIterator; - JsonArray() : data_(0), resources_(0) {} - JsonArray(detail::ArrayData* data, detail::ResourceManager* resources) - : data_(data), resources_(resources) {} - operator JsonVariant() { - void* data = data_; // prevent warning cast-align - return JsonVariant(reinterpret_cast(data), - resources_); - } - operator JsonArrayConst() const { - return JsonArrayConst(data_, resources_); - } - template ::value, int> = 0> - T add() const { - return add().to(); - } - template ::value, int> = 0> - JsonVariant add() const { - return JsonVariant(detail::ArrayData::addElement(data_, resources_), - resources_); - } - template - bool add(const T& value) const { - return detail::ArrayData::addValue(data_, value, resources_); - } - template ::value, int> = 0> - bool add(T* value) const { - return detail::ArrayData::addValue(data_, value, resources_); - } - iterator begin() const { - if (!data_) - return iterator(); - return iterator(data_->createIterator(resources_), resources_); - } - iterator end() const { - return iterator(); - } - bool set(JsonArrayConst src) const { - if (!data_) - return false; - clear(); - for (auto element : src) { - if (!add(element)) - return false; + friend class detail::VariantAttorney; + + public: + using iterator = JsonArrayIterator; + JsonArray() + : data_(0) + , resources_(0) { } - return true; - } - void remove(iterator it) const { - detail::ArrayData::remove(data_, it.iterator_, resources_); - } - void remove(size_t index) const { - detail::ArrayData::removeElement(data_, index, resources_); - } - template ::value, int> = 0> - void remove(const TVariant& variant) const { - if (variant.template is()) - remove(variant.template as()); - } - void clear() const { - detail::ArrayData::clear(data_, resources_); - } - template ::value, int> = 0> - detail::ElementProxy operator[](T index) const { - return {*this, size_t(index)}; - } - template ::value, int> = 0> - detail::ElementProxy operator[](const TVariant& variant) const { - if (variant.template is()) - return {*this, variant.template as()}; - else - return {*this, size_t(-1)}; - } - operator JsonVariantConst() const { - return JsonVariantConst(collectionToVariant(data_), resources_); - } - bool isNull() const { - return data_ == 0; - } - operator bool() const { - return data_ != 0; - } - size_t nesting() const { - return detail::VariantData::nesting(collectionToVariant(data_), resources_); - } - size_t size() const { - return data_ ? data_->size(resources_) : 0; - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonVariant add() const { - return add(); - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonArray createNestedArray() const { - return add(); - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonObject createNestedObject() const; - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - private: - detail::ResourceManager* getResourceManager() const { - return resources_; - } - detail::VariantData* getData() const { - return collectionToVariant(data_); - } - detail::VariantData* getOrCreateData() const { - return collectionToVariant(data_); - } - detail::ArrayData* data_; - detail::ResourceManager* resources_; + JsonArray(detail::ArrayData * data, detail::ResourceManager * resources) + : data_(data) + , resources_(resources) { + } + operator JsonVariant() { + void * data = data_; // prevent warning cast-align + return JsonVariant(reinterpret_cast(data), resources_); + } + operator JsonArrayConst() const { + return JsonArrayConst(data_, resources_); + } + template ::value, int> = 0> + T add() const { + return add().to(); + } + template ::value, int> = 0> + JsonVariant add() const { + return JsonVariant(detail::ArrayData::addElement(data_, resources_), resources_); + } + template + bool add(const T & value) const { + return detail::ArrayData::addValue(data_, value, resources_); + } + template ::value, int> = 0> + bool add(T * value) const { + return detail::ArrayData::addValue(data_, value, resources_); + } + iterator begin() const { + if (!data_) + return iterator(); + return iterator(data_->createIterator(resources_), resources_); + } + iterator end() const { + return iterator(); + } + bool set(JsonArrayConst src) const { + if (!data_) + return false; + clear(); + for (auto element : src) { + if (!add(element)) + return false; + } + return true; + } + void remove(iterator it) const { + detail::ArrayData::remove(data_, it.iterator_, resources_); + } + void remove(size_t index) const { + detail::ArrayData::removeElement(data_, index, resources_); + } + template ::value, int> = 0> + void remove(const TVariant & variant) const { + if (variant.template is()) + remove(variant.template as()); + } + void clear() const { + detail::ArrayData::clear(data_, resources_); + } + template ::value, int> = 0> + detail::ElementProxy operator[](T index) const { + return {*this, size_t(index)}; + } + template ::value, int> = 0> + detail::ElementProxy operator[](const TVariant & variant) const { + if (variant.template is()) + return {*this, variant.template as()}; + else + return {*this, size_t(-1)}; + } + operator JsonVariantConst() const { + return JsonVariantConst(collectionToVariant(data_), resources_); + } + bool isNull() const { + return data_ == 0; + } + operator bool() const { + return data_ != 0; + } + size_t nesting() const { + return detail::VariantData::nesting(collectionToVariant(data_), resources_); + } + size_t size() const { + return data_ ? data_->size(resources_) : 0; + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonVariant add() const { + return add(); + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonArray createNestedArray() const { + return add(); + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonObject createNestedObject() const; + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + + private: + detail::ResourceManager * getResourceManager() const { + return resources_; + } + detail::VariantData * getData() const { + return collectionToVariant(data_); + } + detail::VariantData * getOrCreateData() const { + return collectionToVariant(data_); + } + detail::ArrayData * data_; + detail::ResourceManager * resources_; }; class JsonPair { - public: - JsonPair(detail::ObjectData::iterator iterator, - detail::ResourceManager* resources) { - if (!iterator.done()) { - key_ = iterator->asString(); - iterator.next(resources); - value_ = JsonVariant(iterator.data(), resources); + public: + JsonPair(detail::ObjectData::iterator iterator, detail::ResourceManager * resources) { + if (!iterator.done()) { + key_ = iterator->asString(); + iterator.next(resources); + value_ = JsonVariant(iterator.data(), resources); + } } - } - JsonString key() const { - return key_; - } - JsonVariant value() { - return value_; - } - private: - JsonString key_; - JsonVariant value_; + JsonString key() const { + return key_; + } + JsonVariant value() { + return value_; + } + + private: + JsonString key_; + JsonVariant value_; }; class JsonPairConst { - public: - JsonPairConst(detail::ObjectData::iterator iterator, - const detail::ResourceManager* resources) { - if (!iterator.done()) { - key_ = iterator->asString(); - iterator.next(resources); - value_ = JsonVariantConst(iterator.data(), resources); + public: + JsonPairConst(detail::ObjectData::iterator iterator, const detail::ResourceManager * resources) { + if (!iterator.done()) { + key_ = iterator->asString(); + iterator.next(resources); + value_ = JsonVariantConst(iterator.data(), resources); + } } - } - JsonString key() const { - return key_; - } - JsonVariantConst value() const { - return value_; - } - private: - JsonString key_; - JsonVariantConst value_; + JsonString key() const { + return key_; + } + JsonVariantConst value() const { + return value_; + } + + private: + JsonString key_; + JsonVariantConst value_; }; class JsonObjectIterator { - friend class JsonObject; - public: - JsonObjectIterator() {} - explicit JsonObjectIterator(detail::ObjectData::iterator iterator, - detail::ResourceManager* resources) - : iterator_(iterator), resources_(resources) {} - JsonPair operator*() const { - return JsonPair(iterator_, resources_); - } - Ptr operator->() { - return operator*(); - } - bool operator==(const JsonObjectIterator& other) const { - return iterator_ == other.iterator_; - } - bool operator!=(const JsonObjectIterator& other) const { - return iterator_ != other.iterator_; - } - JsonObjectIterator& operator++() { - iterator_.next(resources_); // key - iterator_.next(resources_); // value - return *this; - } - private: - detail::ObjectData::iterator iterator_; - detail::ResourceManager* resources_; + friend class JsonObject; + + public: + JsonObjectIterator() { + } + explicit JsonObjectIterator(detail::ObjectData::iterator iterator, detail::ResourceManager * resources) + : iterator_(iterator) + , resources_(resources) { + } + JsonPair operator*() const { + return JsonPair(iterator_, resources_); + } + Ptr operator->() { + return operator*(); + } + bool operator==(const JsonObjectIterator & other) const { + return iterator_ == other.iterator_; + } + bool operator!=(const JsonObjectIterator & other) const { + return iterator_ != other.iterator_; + } + JsonObjectIterator & operator++() { + iterator_.next(resources_); // key + iterator_.next(resources_); // value + return *this; + } + + private: + detail::ObjectData::iterator iterator_; + detail::ResourceManager * resources_; }; class JsonObjectConstIterator { - friend class JsonObject; - public: - JsonObjectConstIterator() {} - explicit JsonObjectConstIterator(detail::ObjectData::iterator iterator, - const detail::ResourceManager* resources) - : iterator_(iterator), resources_(resources) {} - JsonPairConst operator*() const { - return JsonPairConst(iterator_, resources_); - } - Ptr operator->() { - return operator*(); - } - bool operator==(const JsonObjectConstIterator& other) const { - return iterator_ == other.iterator_; - } - bool operator!=(const JsonObjectConstIterator& other) const { - return iterator_ != other.iterator_; - } - JsonObjectConstIterator& operator++() { - iterator_.next(resources_); // key - iterator_.next(resources_); // value - return *this; - } - private: - detail::ObjectData::iterator iterator_; - const detail::ResourceManager* resources_; + friend class JsonObject; + + public: + JsonObjectConstIterator() { + } + explicit JsonObjectConstIterator(detail::ObjectData::iterator iterator, const detail::ResourceManager * resources) + : iterator_(iterator) + , resources_(resources) { + } + JsonPairConst operator*() const { + return JsonPairConst(iterator_, resources_); + } + Ptr operator->() { + return operator*(); + } + bool operator==(const JsonObjectConstIterator & other) const { + return iterator_ == other.iterator_; + } + bool operator!=(const JsonObjectConstIterator & other) const { + return iterator_ != other.iterator_; + } + JsonObjectConstIterator & operator++() { + iterator_.next(resources_); // key + iterator_.next(resources_); // value + return *this; + } + + private: + detail::ObjectData::iterator iterator_; + const detail::ResourceManager * resources_; }; class JsonObjectConst : public detail::VariantOperators { - friend class JsonObject; - friend class detail::VariantAttorney; - public: - using iterator = JsonObjectConstIterator; - JsonObjectConst() : data_(0), resources_(0) {} - JsonObjectConst(const detail::ObjectData* data, - const detail::ResourceManager* resources) - : data_(data), resources_(resources) {} - operator JsonVariantConst() const { - return JsonVariantConst(getData(), resources_); - } - bool isNull() const { - return data_ == 0; - } - operator bool() const { - return data_ != 0; - } - size_t nesting() const { - return detail::VariantData::nesting(getData(), resources_); - } - size_t size() const { - return data_ ? data_->size(resources_) : 0; - } - iterator begin() const { - if (!data_) - return iterator(); - return iterator(data_->createIterator(resources_), resources_); - } - iterator end() const { - return iterator(); - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[key].is() instead") - bool containsKey(const TString& key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; - } - template - ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") - bool containsKey(TChar* key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[key].is() instead") - bool containsKey(const TVariant& key) const { - return containsKey(key.template as()); - } - template ::value, int> = 0> - JsonVariantConst operator[](const TString& key) const { - return JsonVariantConst(detail::ObjectData::getMember( - data_, detail::adaptString(key), resources_), - resources_); - } - template ::value && - !detail::is_const::value, - int> = 0> - JsonVariantConst operator[](TChar* key) const { - return JsonVariantConst(detail::ObjectData::getMember( - data_, detail::adaptString(key), resources_), - resources_); - } - template ::value, int> = 0> - JsonVariantConst operator[](const TVariant& key) const { - if (key.template is()) - return operator[](key.template as()); - else - return JsonVariantConst(); - } - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - private: - const detail::VariantData* getData() const { - return collectionToVariant(data_); - } - const detail::ObjectData* data_; - const detail::ResourceManager* resources_; + friend class JsonObject; + friend class detail::VariantAttorney; + + public: + using iterator = JsonObjectConstIterator; + JsonObjectConst() + : data_(0) + , resources_(0) { + } + JsonObjectConst(const detail::ObjectData * data, const detail::ResourceManager * resources) + : data_(data) + , resources_(resources) { + } + operator JsonVariantConst() const { + return JsonVariantConst(getData(), resources_); + } + bool isNull() const { + return data_ == 0; + } + operator bool() const { + return data_ != 0; + } + size_t nesting() const { + return detail::VariantData::nesting(getData(), resources_); + } + size_t size() const { + return data_ ? data_->size(resources_) : 0; + } + iterator begin() const { + if (!data_) + return iterator(); + return iterator(data_->createIterator(resources_), resources_); + } + iterator end() const { + return iterator(); + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[key].is() instead") + bool containsKey(const TString & key) const { + return detail::ObjectData::getMember(data_, detail::adaptString(key), resources_) != 0; + } + template + ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") + bool containsKey(TChar * key) const { + return detail::ObjectData::getMember(data_, detail::adaptString(key), resources_) != 0; + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[key].is() instead") + bool containsKey(const TVariant & key) const { + return containsKey(key.template as()); + } + template ::value, int> = 0> + JsonVariantConst operator[](const TString & key) const { + return JsonVariantConst(detail::ObjectData::getMember(data_, detail::adaptString(key), resources_), resources_); + } + template ::value && !detail::is_const::value, int> = 0> + JsonVariantConst operator[](TChar * key) const { + return JsonVariantConst(detail::ObjectData::getMember(data_, detail::adaptString(key), resources_), resources_); + } + template ::value, int> = 0> + JsonVariantConst operator[](const TVariant & key) const { + if (key.template is()) + return operator[](key.template as()); + else + return JsonVariantConst(); + } + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + + private: + const detail::VariantData * getData() const { + return collectionToVariant(data_); + } + const detail::ObjectData * data_; + const detail::ResourceManager * resources_; }; inline bool operator==(JsonObjectConst lhs, JsonObjectConst rhs) { - if (!lhs && !rhs) // both are null - return true; - if (!lhs || !rhs) // only one is null - return false; - size_t count = 0; - for (auto kvp : lhs) { - auto rhsValue = rhs[kvp.key()]; - if (rhsValue.isUnbound()) - return false; - if (kvp.value() != rhsValue) - return false; - count++; - } - return count == rhs.size(); + if (!lhs && !rhs) // both are null + return true; + if (!lhs || !rhs) // only one is null + return false; + size_t count = 0; + for (auto kvp : lhs) { + auto rhsValue = rhs[kvp.key()]; + if (rhsValue.isUnbound()) + return false; + if (kvp.value() != rhsValue) + return false; + count++; + } + return count == rhs.size(); } ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template -class MemberProxy - : public VariantRefBase>, - public VariantOperators> { - friend class VariantAttorney; - friend class VariantRefBase>; - template - friend class MemberProxy; - template - friend class ElementProxy; - public: - MemberProxy(TUpstream upstream, AdaptedString key) - : upstream_(upstream), key_(key) {} - MemberProxy& operator=(const MemberProxy& src) { - this->set(src); - return *this; - } - template - MemberProxy& operator=(const T& src) { - this->set(src); - return *this; - } - template ::value, int> = 0> - MemberProxy& operator=(T* src) { - this->set(src); - return *this; - } - private: - MemberProxy(const MemberProxy& src) // Error here? See https://arduinojson.org/v7/proxy-non-copyable/ - : upstream_(src.upstream_), key_(src.key_) {} - ResourceManager* getResourceManager() const { - return VariantAttorney::getResourceManager(upstream_); - } - VariantData* getData() const { - return VariantData::getMember( - VariantAttorney::getData(upstream_), key_, - VariantAttorney::getResourceManager(upstream_)); - } - VariantData* getOrCreateData() const { - auto data = VariantAttorney::getOrCreateData(upstream_); - if (!data) - return nullptr; - return data->getOrAddMember(key_, - VariantAttorney::getResourceManager(upstream_)); - } - private: - TUpstream upstream_; - AdaptedString key_; +class MemberProxy : public VariantRefBase>, public VariantOperators> { + friend class VariantAttorney; + friend class VariantRefBase>; + template + friend class MemberProxy; + template + friend class ElementProxy; + + public: + MemberProxy(TUpstream upstream, AdaptedString key) + : upstream_(upstream) + , key_(key) { + } + MemberProxy & operator=(const MemberProxy & src) { + this->set(src); + return *this; + } + template + MemberProxy & operator=(const T & src) { + this->set(src); + return *this; + } + template ::value, int> = 0> + MemberProxy & operator=(T * src) { + this->set(src); + return *this; + } + + private: + MemberProxy(const MemberProxy & src) // Error here? See https://arduinojson.org/v7/proxy-non-copyable/ + : upstream_(src.upstream_) + , key_(src.key_) { + } + ResourceManager * getResourceManager() const { + return VariantAttorney::getResourceManager(upstream_); + } + VariantData * getData() const { + return VariantData::getMember(VariantAttorney::getData(upstream_), key_, VariantAttorney::getResourceManager(upstream_)); + } + VariantData * getOrCreateData() const { + auto data = VariantAttorney::getOrCreateData(upstream_); + if (!data) + return nullptr; + return data->getOrAddMember(key_, VariantAttorney::getResourceManager(upstream_)); + } + + private: + TUpstream upstream_; + AdaptedString key_; }; ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE class JsonArray; class JsonObject : public detail::VariantOperators { - friend class detail::VariantAttorney; - public: - using iterator = JsonObjectIterator; - JsonObject() : data_(0), resources_(0) {} - JsonObject(detail::ObjectData* data, detail::ResourceManager* resource) - : data_(data), resources_(resource) {} - operator JsonVariant() const { - void* data = data_; // prevent warning cast-align - return JsonVariant(reinterpret_cast(data), - resources_); - } - operator JsonObjectConst() const { - return JsonObjectConst(data_, resources_); - } - operator JsonVariantConst() const { - return JsonVariantConst(collectionToVariant(data_), resources_); - } - bool isNull() const { - return data_ == 0; - } - operator bool() const { - return data_ != 0; - } - size_t nesting() const { - return detail::VariantData::nesting(collectionToVariant(data_), resources_); - } - size_t size() const { - return data_ ? data_->size(resources_) : 0; - } - iterator begin() const { - if (!data_) - return iterator(); - return iterator(data_->createIterator(resources_), resources_); - } - iterator end() const { - return iterator(); - } - void clear() const { - detail::ObjectData::clear(data_, resources_); - } - bool set(JsonObjectConst src) { - if (!data_ || !src.data_) - return false; - clear(); - for (auto kvp : src) { - if (!operator[](kvp.key()).set(kvp.value())) - return false; + friend class detail::VariantAttorney; + + public: + using iterator = JsonObjectIterator; + JsonObject() + : data_(0) + , resources_(0) { } - return true; - } - template ::value, int> = 0> - detail::MemberProxy> operator[]( - const TString& key) const { - return {*this, detail::adaptString(key)}; - } - template ::value && - !detail::is_const::value, - int> = 0> - detail::MemberProxy> operator[]( - TChar* key) const { - return {*this, detail::adaptString(key)}; - } - template ::value, int> = 0> - detail::MemberProxy> operator[]( - const TVariant& key) const { - return {*this, detail::adaptString(key.template as())}; - } - FORCE_INLINE void remove(iterator it) const { - detail::ObjectData::remove(data_, it.iterator_, resources_); - } - template ::value, int> = 0> - void remove(const TString& key) const { - detail::ObjectData::removeMember(data_, detail::adaptString(key), - resources_); - } - template ::value, int> = 0> - void remove(const TVariant& key) const { - if (key.template is()) - remove(key.template as()); - } - template - FORCE_INLINE void remove(TChar* key) const { - detail::ObjectData::removeMember(data_, detail::adaptString(key), - resources_); - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[key].is() instead") - bool containsKey(const TString& key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; - } - template ::value && - !detail::is_const::value, - int> = 0> - ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") - bool containsKey(TChar* key) const { - return detail::ObjectData::getMember(data_, detail::adaptString(key), - resources_) != 0; - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use obj[key].is() instead") - bool containsKey(const TVariant& key) const { - return containsKey(key.template as()); - } - template - ARDUINOJSON_DEPRECATED("use obj[key].to() instead") - JsonArray createNestedArray(TChar* key) const { - return operator[](key).template to(); - } - template - ARDUINOJSON_DEPRECATED("use obj[key].to() instead") - JsonArray createNestedArray(const TString& key) const { - return operator[](key).template to(); - } - template - ARDUINOJSON_DEPRECATED("use obj[key].to() instead") - JsonObject createNestedObject(TChar* key) { - return operator[](key).template to(); - } - template - ARDUINOJSON_DEPRECATED("use obj[key].to() instead") - JsonObject createNestedObject(const TString& key) { - return operator[](key).template to(); - } - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - private: - detail::ResourceManager* getResourceManager() const { - return resources_; - } - detail::VariantData* getData() const { - return detail::collectionToVariant(data_); - } - detail::VariantData* getOrCreateData() const { - return detail::collectionToVariant(data_); - } - detail::ObjectData* data_; - detail::ResourceManager* resources_; + JsonObject(detail::ObjectData * data, detail::ResourceManager * resource) + : data_(data) + , resources_(resource) { + } + operator JsonVariant() const { + void * data = data_; // prevent warning cast-align + return JsonVariant(reinterpret_cast(data), resources_); + } + operator JsonObjectConst() const { + return JsonObjectConst(data_, resources_); + } + operator JsonVariantConst() const { + return JsonVariantConst(collectionToVariant(data_), resources_); + } + bool isNull() const { + return data_ == 0; + } + operator bool() const { + return data_ != 0; + } + size_t nesting() const { + return detail::VariantData::nesting(collectionToVariant(data_), resources_); + } + size_t size() const { + return data_ ? data_->size(resources_) : 0; + } + iterator begin() const { + if (!data_) + return iterator(); + return iterator(data_->createIterator(resources_), resources_); + } + iterator end() const { + return iterator(); + } + void clear() const { + detail::ObjectData::clear(data_, resources_); + } + bool set(JsonObjectConst src) { + if (!data_ || !src.data_) + return false; + clear(); + for (auto kvp : src) { + if (!operator[](kvp.key()).set(kvp.value())) + return false; + } + return true; + } + template ::value, int> = 0> + detail::MemberProxy> operator[](const TString & key) const { + return {*this, detail::adaptString(key)}; + } + template ::value && !detail::is_const::value, int> = 0> + detail::MemberProxy> operator[](TChar * key) const { + return {*this, detail::adaptString(key)}; + } + template ::value, int> = 0> + detail::MemberProxy> operator[](const TVariant & key) const { + return {*this, detail::adaptString(key.template as())}; + } + FORCE_INLINE void remove(iterator it) const { + detail::ObjectData::remove(data_, it.iterator_, resources_); + } + template ::value, int> = 0> + void remove(const TString & key) const { + detail::ObjectData::removeMember(data_, detail::adaptString(key), resources_); + } + template ::value, int> = 0> + void remove(const TVariant & key) const { + if (key.template is()) + remove(key.template as()); + } + template + FORCE_INLINE void remove(TChar * key) const { + detail::ObjectData::removeMember(data_, detail::adaptString(key), resources_); + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[key].is() instead") + bool containsKey(const TString & key) const { + return detail::ObjectData::getMember(data_, detail::adaptString(key), resources_) != 0; + } + template ::value && !detail::is_const::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[\"key\"].is() instead") + bool containsKey(TChar * key) const { + return detail::ObjectData::getMember(data_, detail::adaptString(key), resources_) != 0; + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use obj[key].is() instead") + bool containsKey(const TVariant & key) const { + return containsKey(key.template as()); + } + template + ARDUINOJSON_DEPRECATED("use obj[key].to() instead") + JsonArray createNestedArray(TChar * key) const { + return operator[](key).template to(); + } + template + ARDUINOJSON_DEPRECATED("use obj[key].to() instead") + JsonArray createNestedArray(const TString & key) const { + return operator[](key).template to(); + } + template + ARDUINOJSON_DEPRECATED("use obj[key].to() instead") + JsonObject createNestedObject(TChar * key) { + return operator[](key).template to(); + } + template + ARDUINOJSON_DEPRECATED("use obj[key].to() instead") + JsonObject createNestedObject(const TString & key) { + return operator[](key).template to(); + } + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + + private: + detail::ResourceManager * getResourceManager() const { + return resources_; + } + detail::VariantData * getData() const { + return detail::collectionToVariant(data_); + } + detail::VariantData * getOrCreateData() const { + return detail::collectionToVariant(data_); + } + detail::ObjectData * data_; + detail::ResourceManager * resources_; }; -class JsonDocument : public detail::VariantOperators { - friend class detail::VariantAttorney; - public: - explicit JsonDocument(Allocator* alloc = detail::DefaultAllocator::instance()) - : resources_(alloc) {} - JsonDocument(const JsonDocument& src) : JsonDocument(src.allocator()) { - set(src); - } - JsonDocument(JsonDocument&& src) - : JsonDocument(detail::DefaultAllocator::instance()) { - swap(*this, src); - } - template ::value || - detail::is_same::value || - detail::is_same::value || - detail::is_same::value || - detail::is_same::value, - int> = 0> - JsonDocument(const T& src, - Allocator* alloc = detail::DefaultAllocator::instance()) - : JsonDocument(alloc) { - set(src); - } - JsonDocument& operator=(JsonDocument src) { - swap(*this, src); - return *this; - } - template - JsonDocument& operator=(const T& src) { - set(src); - return *this; - } - Allocator* allocator() const { - return resources_.allocator(); - } - void shrinkToFit() { - resources_.shrinkToFit(); - } - template - T as() { - return getVariant().template as(); - } - template - T as() const { - return getVariant().template as(); - } - void clear() { - resources_.clear(); - data_.reset(); - } - template - bool is() { - return getVariant().template is(); - } - template - bool is() const { - return getVariant().template is(); - } - bool isNull() const { - return getVariant().isNull(); - } - bool overflowed() const { - return resources_.overflowed(); - } - size_t nesting() const { - return data_.nesting(&resources_); - } - size_t size() const { - return data_.size(&resources_); - } - bool set(const JsonDocument& src) { - return to().set(src.as()); - } - template < - typename T, - detail::enable_if_t::value, int> = 0> - bool set(const T& src) { - return to().set(src); - } - template ::value, int> = 0> - bool set(TChar* src) { - return to().set(src); - } - template - typename detail::VariantTo::type to() { - clear(); - return getVariant().template to(); - } - template - ARDUINOJSON_DEPRECATED("use doc[\"key\"].is() instead") - bool containsKey(TChar* key) const { - return data_.getMember(detail::adaptString(key), &resources_) != 0; - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use doc[key].is() instead") - bool containsKey(const TString& key) const { - return data_.getMember(detail::adaptString(key), &resources_) != 0; - } - template ::value, int> = 0> - ARDUINOJSON_DEPRECATED("use doc[key].is() instead") - bool containsKey(const TVariant& key) const { - return containsKey(key.template as()); - } - template ::value, int> = 0> - detail::MemberProxy> operator[]( - const TString& key) { - return {*this, detail::adaptString(key)}; - } - template ::value && - !detail::is_const::value, - int> = 0> - detail::MemberProxy> operator[]( - TChar* key) { - return {*this, detail::adaptString(key)}; - } - template ::value, int> = 0> - JsonVariantConst operator[](const TString& key) const { - return JsonVariantConst( - data_.getMember(detail::adaptString(key), &resources_), &resources_); - } - template ::value && - !detail::is_const::value, - int> = 0> - JsonVariantConst operator[](TChar* key) const { - return JsonVariantConst( - data_.getMember(detail::adaptString(key), &resources_), &resources_); - } - template ::value, int> = 0> - detail::ElementProxy operator[](T index) { - return {*this, size_t(index)}; - } - JsonVariantConst operator[](size_t index) const { - return JsonVariantConst(data_.getElement(index, &resources_), &resources_); - } - template ::value, int> = 0> - JsonVariantConst operator[](const TVariant& key) const { - if (key.template is()) - return operator[](key.template as()); - if (key.template is()) - return operator[](key.template as()); - return {}; - } - template ::value, int> = 0> - T add() { - return add().to(); - } - template ::value, int> = 0> - JsonVariant add() { - return JsonVariant(data_.addElement(&resources_), &resources_); - } - template - bool add(const TValue& value) { - return data_.addValue(value, &resources_); - } - template ::value, int> = 0> - bool add(TChar* value) { - return data_.addValue(value, &resources_); - } - template ::value, int> = 0> - void remove(T index) { - detail::VariantData::removeElement(getData(), size_t(index), - getResourceManager()); - } - template ::value && - !detail::is_const::value, - int> = 0> - void remove(TChar* key) { - detail::VariantData::removeMember(getData(), detail::adaptString(key), - getResourceManager()); - } - template ::value, int> = 0> - void remove(const TString& key) { - detail::VariantData::removeMember(getData(), detail::adaptString(key), - getResourceManager()); - } - template ::value, int> = 0> - void remove(const TVariant& key) { - if (key.template is()) - remove(key.template as()); - if (key.template is()) - remove(key.template as()); - } - operator JsonVariant() { - return getVariant(); - } - operator JsonVariantConst() const { - return getVariant(); - } - friend void swap(JsonDocument& a, JsonDocument& b) { - swap(a.resources_, b.resources_); - swap_(a.data_, b.data_); - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonVariant add() { - return add(); - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonArray createNestedArray() { - return add(); - } - template - ARDUINOJSON_DEPRECATED("use doc[key].to() instead") - JsonArray createNestedArray(TChar* key) { - return operator[](key).template to(); - } - template - ARDUINOJSON_DEPRECATED("use doc[key].to() instead") - JsonArray createNestedArray(const TString& key) { - return operator[](key).template to(); - } - ARDUINOJSON_DEPRECATED("use add() instead") - JsonObject createNestedObject() { - return add(); - } - template - ARDUINOJSON_DEPRECATED("use doc[key].to() instead") - JsonObject createNestedObject(TChar* key) { - return operator[](key).template to(); - } - template - ARDUINOJSON_DEPRECATED("use doc[key].to() instead") - JsonObject createNestedObject(const TString& key) { - return operator[](key).template to(); - } - ARDUINOJSON_DEPRECATED("always returns zero") - size_t memoryUsage() const { - return 0; - } - private: - JsonVariant getVariant() { - return JsonVariant(&data_, &resources_); - } - JsonVariantConst getVariant() const { - return JsonVariantConst(&data_, &resources_); - } - detail::ResourceManager* getResourceManager() { - return &resources_; - } - detail::VariantData* getData() { - return &data_; - } - const detail::VariantData* getData() const { - return &data_; - } - detail::VariantData* getOrCreateData() { - return &data_; - } - detail::ResourceManager resources_; - detail::VariantData data_; +class JsonDocument : public detail::VariantOperators { + friend class detail::VariantAttorney; + + public: + explicit JsonDocument(Allocator * alloc = detail::DefaultAllocator::instance()) + : resources_(alloc) { + } + JsonDocument(const JsonDocument & src) + : JsonDocument(src.allocator()) { + set(src); + } + JsonDocument(JsonDocument && src) + : JsonDocument(detail::DefaultAllocator::instance()) { + swap(*this, src); + } + template ::value || detail::is_same::value || detail::is_same::value + || detail::is_same::value || detail::is_same::value, + int> = 0> + JsonDocument(const T & src, Allocator * alloc = detail::DefaultAllocator::instance()) + : JsonDocument(alloc) { + set(src); + } + JsonDocument & operator=(JsonDocument src) { + swap(*this, src); + return *this; + } + template + JsonDocument & operator=(const T & src) { + set(src); + return *this; + } + Allocator * allocator() const { + return resources_.allocator(); + } + void shrinkToFit() { + resources_.shrinkToFit(); + } + template + T as() { + return getVariant().template as(); + } + template + T as() const { + return getVariant().template as(); + } + void clear() { + resources_.clear(); + data_.reset(); + } + template + bool is() { + return getVariant().template is(); + } + template + bool is() const { + return getVariant().template is(); + } + bool isNull() const { + return getVariant().isNull(); + } + bool overflowed() const { + return resources_.overflowed(); + } + size_t nesting() const { + return data_.nesting(&resources_); + } + size_t size() const { + return data_.size(&resources_); + } + bool set(const JsonDocument & src) { + return to().set(src.as()); + } + template ::value, int> = 0> + bool set(const T & src) { + return to().set(src); + } + template ::value, int> = 0> + bool set(TChar * src) { + return to().set(src); + } + template + typename detail::VariantTo::type to() { + clear(); + return getVariant().template to(); + } + template + ARDUINOJSON_DEPRECATED("use doc[\"key\"].is() instead") + bool containsKey(TChar * key) const { + return data_.getMember(detail::adaptString(key), &resources_) != 0; + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use doc[key].is() instead") + bool containsKey(const TString & key) const { + return data_.getMember(detail::adaptString(key), &resources_) != 0; + } + template ::value, int> = 0> + ARDUINOJSON_DEPRECATED("use doc[key].is() instead") + bool containsKey(const TVariant & key) const { + return containsKey(key.template as()); + } + template ::value, int> = 0> + detail::MemberProxy> operator[](const TString & key) { + return {*this, detail::adaptString(key)}; + } + template ::value && !detail::is_const::value, int> = 0> + detail::MemberProxy> operator[](TChar * key) { + return {*this, detail::adaptString(key)}; + } + template ::value, int> = 0> + JsonVariantConst operator[](const TString & key) const { + return JsonVariantConst(data_.getMember(detail::adaptString(key), &resources_), &resources_); + } + template ::value && !detail::is_const::value, int> = 0> + JsonVariantConst operator[](TChar * key) const { + return JsonVariantConst(data_.getMember(detail::adaptString(key), &resources_), &resources_); + } + template ::value, int> = 0> + detail::ElementProxy operator[](T index) { + return {*this, size_t(index)}; + } + JsonVariantConst operator[](size_t index) const { + return JsonVariantConst(data_.getElement(index, &resources_), &resources_); + } + template ::value, int> = 0> + JsonVariantConst operator[](const TVariant & key) const { + if (key.template is()) + return operator[](key.template as()); + if (key.template is()) + return operator[](key.template as()); + return {}; + } + template ::value, int> = 0> + T add() { + return add().to(); + } + template ::value, int> = 0> + JsonVariant add() { + return JsonVariant(data_.addElement(&resources_), &resources_); + } + template + bool add(const TValue & value) { + return data_.addValue(value, &resources_); + } + template ::value, int> = 0> + bool add(TChar * value) { + return data_.addValue(value, &resources_); + } + template ::value, int> = 0> + void remove(T index) { + detail::VariantData::removeElement(getData(), size_t(index), getResourceManager()); + } + template ::value && !detail::is_const::value, int> = 0> + void remove(TChar * key) { + detail::VariantData::removeMember(getData(), detail::adaptString(key), getResourceManager()); + } + template ::value, int> = 0> + void remove(const TString & key) { + detail::VariantData::removeMember(getData(), detail::adaptString(key), getResourceManager()); + } + template ::value, int> = 0> + void remove(const TVariant & key) { + if (key.template is()) + remove(key.template as()); + if (key.template is()) + remove(key.template as()); + } + operator JsonVariant() { + return getVariant(); + } + operator JsonVariantConst() const { + return getVariant(); + } + friend void swap(JsonDocument & a, JsonDocument & b) { + swap(a.resources_, b.resources_); + swap_(a.data_, b.data_); + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonVariant add() { + return add(); + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonArray createNestedArray() { + return add(); + } + template + ARDUINOJSON_DEPRECATED("use doc[key].to() instead") + JsonArray createNestedArray(TChar * key) { + return operator[](key).template to(); + } + template + ARDUINOJSON_DEPRECATED("use doc[key].to() instead") + JsonArray createNestedArray(const TString & key) { + return operator[](key).template to(); + } + ARDUINOJSON_DEPRECATED("use add() instead") + JsonObject createNestedObject() { + return add(); + } + template + ARDUINOJSON_DEPRECATED("use doc[key].to() instead") + JsonObject createNestedObject(TChar * key) { + return operator[](key).template to(); + } + template + ARDUINOJSON_DEPRECATED("use doc[key].to() instead") + JsonObject createNestedObject(const TString & key) { + return operator[](key).template to(); + } + ARDUINOJSON_DEPRECATED("always returns zero") + size_t memoryUsage() const { + return 0; + } + + private: + JsonVariant getVariant() { + return JsonVariant(&data_, &resources_); + } + JsonVariantConst getVariant() const { + return JsonVariantConst(&data_, &resources_); + } + detail::ResourceManager * getResourceManager() { + return &resources_; + } + detail::VariantData * getData() { + return &data_; + } + const detail::VariantData * getData() const { + return &data_; + } + detail::VariantData * getOrCreateData() { + return &data_; + } + detail::ResourceManager resources_; + detail::VariantData data_; }; -inline void convertToJson(const JsonDocument& src, JsonVariant dst) { - dst.set(src.as()); +inline void convertToJson(const JsonDocument & src, JsonVariant dst) { + dst.set(src.as()); } ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE template struct VariantDataVisitor { - using result_type = TResult; - template - TResult visit(const T&) { - return TResult(); - } + using result_type = TResult; + template + TResult visit(const T &) { + return TResult(); + } }; template struct JsonVariantVisitor { - using result_type = TResult; - template - TResult visit(const T&) { - return TResult(); - } + using result_type = TResult; + template + TResult visit(const T &) { + return TResult(); + } }; template class VisitorAdapter { - public: - using result_type = typename TVisitor::result_type; - VisitorAdapter(TVisitor& visitor, const ResourceManager* resources) - : visitor_(&visitor), resources_(resources) {} - result_type visit(const ArrayData& value) { - return visitor_->visit(JsonArrayConst(&value, resources_)); - } - result_type visit(const ObjectData& value) { - return visitor_->visit(JsonObjectConst(&value, resources_)); - } - template - result_type visit(const T& value) { - return visitor_->visit(value); - } - private: - TVisitor* visitor_; - const ResourceManager* resources_; + public: + using result_type = typename TVisitor::result_type; + VisitorAdapter(TVisitor & visitor, const ResourceManager * resources) + : visitor_(&visitor) + , resources_(resources) { + } + result_type visit(const ArrayData & value) { + return visitor_->visit(JsonArrayConst(&value, resources_)); + } + result_type visit(const ObjectData & value) { + return visitor_->visit(JsonObjectConst(&value, resources_)); + } + template + result_type visit(const T & value) { + return visitor_->visit(value); + } + + private: + TVisitor * visitor_; + const ResourceManager * resources_; }; template -typename TVisitor::result_type accept(JsonVariantConst variant, - TVisitor& visit) { - auto data = VariantAttorney::getData(variant); - if (!data) - return visit.visit(nullptr); - auto resources = VariantAttorney::getResourceManager(variant); - VisitorAdapter adapter(visit, resources); - return data->accept(adapter, resources); +typename TVisitor::result_type accept(JsonVariantConst variant, TVisitor & visit) { + auto data = VariantAttorney::getData(variant); + if (!data) + return visit.visit(nullptr); + auto resources = VariantAttorney::getResourceManager(variant); + VisitorAdapter adapter(visit, resources); + return data->accept(adapter, resources); } struct ComparerBase : JsonVariantVisitor {}; template struct Comparer; template struct Comparer::value>> : ComparerBase { - T rhs; - explicit Comparer(T value) : rhs(value) {} - CompareResult visit(JsonString lhs) { - int i = stringCompare(adaptString(rhs), adaptString(lhs)); - if (i < 0) - return COMPARE_RESULT_GREATER; - else if (i > 0) - return COMPARE_RESULT_LESS; - else - return COMPARE_RESULT_EQUAL; - } - CompareResult visit(nullptr_t) { - if (adaptString(rhs).isNull()) - return COMPARE_RESULT_EQUAL; - else - return COMPARE_RESULT_DIFFER; - } - using ComparerBase::visit; + T rhs; + explicit Comparer(T value) + : rhs(value) { + } + CompareResult visit(JsonString lhs) { + int i = stringCompare(adaptString(rhs), adaptString(lhs)); + if (i < 0) + return COMPARE_RESULT_GREATER; + else if (i > 0) + return COMPARE_RESULT_LESS; + else + return COMPARE_RESULT_EQUAL; + } + CompareResult visit(nullptr_t) { + if (adaptString(rhs).isNull()) + return COMPARE_RESULT_EQUAL; + else + return COMPARE_RESULT_DIFFER; + } + using ComparerBase::visit; }; template -struct Comparer< - T, enable_if_t::value || is_floating_point::value>> - : ComparerBase { - T rhs; - explicit Comparer(T value) : rhs(value) {} - template - enable_if_t::value || is_integral::value, - CompareResult> - visit(const U& lhs) { - return arithmeticCompare(lhs, rhs); - } - template - enable_if_t::value && !is_integral::value, - CompareResult> - visit(const U& lhs) { - return ComparerBase::visit(lhs); - } +struct Comparer::value || is_floating_point::value>> : ComparerBase { + T rhs; + explicit Comparer(T value) + : rhs(value) { + } + template + enable_if_t::value || is_integral::value, CompareResult> visit(const U & lhs) { + return arithmeticCompare(lhs, rhs); + } + template + enable_if_t::value && !is_integral::value, CompareResult> visit(const U & lhs) { + return ComparerBase::visit(lhs); + } }; struct NullComparer : ComparerBase { - CompareResult visit(nullptr_t) { - return COMPARE_RESULT_EQUAL; - } - using ComparerBase::visit; + CompareResult visit(nullptr_t) { + return COMPARE_RESULT_EQUAL; + } + using ComparerBase::visit; }; template <> struct Comparer : NullComparer { - explicit Comparer(nullptr_t) : NullComparer() {} + explicit Comparer(nullptr_t) + : NullComparer() { + } }; struct ArrayComparer : ComparerBase { - JsonArrayConst rhs_; - explicit ArrayComparer(JsonArrayConst rhs) : rhs_(rhs) {} - CompareResult visit(JsonArrayConst lhs) { - if (rhs_ == lhs) - return COMPARE_RESULT_EQUAL; - else - return COMPARE_RESULT_DIFFER; - } - using ComparerBase::visit; + JsonArrayConst rhs_; + explicit ArrayComparer(JsonArrayConst rhs) + : rhs_(rhs) { + } + CompareResult visit(JsonArrayConst lhs) { + if (rhs_ == lhs) + return COMPARE_RESULT_EQUAL; + else + return COMPARE_RESULT_DIFFER; + } + using ComparerBase::visit; }; struct ObjectComparer : ComparerBase { - JsonObjectConst rhs_; - explicit ObjectComparer(JsonObjectConst rhs) : rhs_(rhs) {} - CompareResult visit(JsonObjectConst lhs) { - if (lhs == rhs_) - return COMPARE_RESULT_EQUAL; - else - return COMPARE_RESULT_DIFFER; - } - using ComparerBase::visit; + JsonObjectConst rhs_; + explicit ObjectComparer(JsonObjectConst rhs) + : rhs_(rhs) { + } + CompareResult visit(JsonObjectConst lhs) { + if (lhs == rhs_) + return COMPARE_RESULT_EQUAL; + else + return COMPARE_RESULT_DIFFER; + } + using ComparerBase::visit; }; struct RawComparer : ComparerBase { - RawString rhs_; - explicit RawComparer(RawString rhs) : rhs_(rhs) {} - CompareResult visit(RawString lhs) { - size_t size = rhs_.size() < lhs.size() ? rhs_.size() : lhs.size(); - int n = memcmp(lhs.data(), rhs_.data(), size); - if (n < 0) - return COMPARE_RESULT_LESS; - else if (n > 0) - return COMPARE_RESULT_GREATER; - else - return COMPARE_RESULT_EQUAL; - } - using ComparerBase::visit; + RawString rhs_; + explicit RawComparer(RawString rhs) + : rhs_(rhs) { + } + CompareResult visit(RawString lhs) { + size_t size = rhs_.size() < lhs.size() ? rhs_.size() : lhs.size(); + int n = memcmp(lhs.data(), rhs_.data(), size); + if (n < 0) + return COMPARE_RESULT_LESS; + else if (n > 0) + return COMPARE_RESULT_GREATER; + else + return COMPARE_RESULT_EQUAL; + } + using ComparerBase::visit; }; struct VariantComparer : ComparerBase { - JsonVariantConst rhs; - explicit VariantComparer(JsonVariantConst value) : rhs(value) {} - CompareResult visit(JsonArrayConst lhs) { - ArrayComparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(JsonObjectConst lhs) { - ObjectComparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(JsonFloat lhs) { - Comparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(JsonString lhs) { - Comparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(RawString value) { - RawComparer comparer(value); - return reverseResult(comparer); - } - CompareResult visit(JsonInteger lhs) { - Comparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(JsonUInt lhs) { - Comparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(bool lhs) { - Comparer comparer(lhs); - return reverseResult(comparer); - } - CompareResult visit(nullptr_t) { - NullComparer comparer; - return reverseResult(comparer); - } - private: - template - CompareResult reverseResult(TComparer& comparer) { - CompareResult reversedResult = accept(rhs, comparer); - switch (reversedResult) { - case COMPARE_RESULT_GREATER: - return COMPARE_RESULT_LESS; - case COMPARE_RESULT_LESS: - return COMPARE_RESULT_GREATER; - default: - return reversedResult; + JsonVariantConst rhs; + explicit VariantComparer(JsonVariantConst value) + : rhs(value) { + } + CompareResult visit(JsonArrayConst lhs) { + ArrayComparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(JsonObjectConst lhs) { + ObjectComparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(JsonFloat lhs) { + Comparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(JsonString lhs) { + Comparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(RawString value) { + RawComparer comparer(value); + return reverseResult(comparer); + } + CompareResult visit(JsonInteger lhs) { + Comparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(JsonUInt lhs) { + Comparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(bool lhs) { + Comparer comparer(lhs); + return reverseResult(comparer); + } + CompareResult visit(nullptr_t) { + NullComparer comparer; + return reverseResult(comparer); + } + + private: + template + CompareResult reverseResult(TComparer & comparer) { + CompareResult reversedResult = accept(rhs, comparer); + switch (reversedResult) { + case COMPARE_RESULT_GREATER: + return COMPARE_RESULT_LESS; + case COMPARE_RESULT_LESS: + return COMPARE_RESULT_GREATER; + default: + return reversedResult; + } } - } }; template -struct Comparer< - T, enable_if_t::value>> - : VariantComparer { - explicit Comparer(const T& value) - : VariantComparer(static_cast(value)) {} +struct Comparer::value>> : VariantComparer { + explicit Comparer(const T & value) + : VariantComparer(static_cast(value)) { + } }; template -CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T& rhs) { - Comparer comparer(rhs); - return accept(lhs, comparer); +CompareResult compare(ArduinoJson::JsonVariantConst lhs, const T & rhs) { + Comparer comparer(rhs); + return accept(lhs, comparer); } -inline ArrayData::iterator ArrayData::at( - size_t index, const ResourceManager* resources) const { - auto it = createIterator(resources); - while (!it.done() && index) { - it.next(resources); - --index; - } - return it; +inline ArrayData::iterator ArrayData::at(size_t index, const ResourceManager * resources) const { + auto it = createIterator(resources); + while (!it.done() && index) { + it.next(resources); + --index; + } + return it; } -inline VariantData* ArrayData::addElement(ResourceManager* resources) { - auto slot = resources->allocVariant(); - if (!slot) - return nullptr; - CollectionData::appendOne(slot, resources); - return slot.ptr(); +inline VariantData * ArrayData::addElement(ResourceManager * resources) { + auto slot = resources->allocVariant(); + if (!slot) + return nullptr; + CollectionData::appendOne(slot, resources); + return slot.ptr(); } -inline VariantData* ArrayData::getOrAddElement(size_t index, - ResourceManager* resources) { - auto it = createIterator(resources); - while (!it.done() && index > 0) { - it.next(resources); - index--; - } - if (it.done()) - index++; - VariantData* element = it.data(); - while (index > 0) { - element = addElement(resources); - if (!element) - return nullptr; - index--; - } - return element; +inline VariantData * ArrayData::getOrAddElement(size_t index, ResourceManager * resources) { + auto it = createIterator(resources); + while (!it.done() && index > 0) { + it.next(resources); + index--; + } + if (it.done()) + index++; + VariantData * element = it.data(); + while (index > 0) { + element = addElement(resources); + if (!element) + return nullptr; + index--; + } + return element; } -inline VariantData* ArrayData::getElement( - size_t index, const ResourceManager* resources) const { - return at(index, resources).data(); +inline VariantData * ArrayData::getElement(size_t index, const ResourceManager * resources) const { + return at(index, resources).data(); } -inline void ArrayData::removeElement(size_t index, ResourceManager* resources) { - remove(at(index, resources), resources); +inline void ArrayData::removeElement(size_t index, ResourceManager * resources) { + remove(at(index, resources), resources); } template -inline bool ArrayData::addValue(const T& value, ResourceManager* resources) { - ARDUINOJSON_ASSERT(resources != nullptr); - auto slot = resources->allocVariant(); - if (!slot) - return false; - JsonVariant variant(slot.ptr(), resources); - if (!variant.set(value)) { - resources->freeVariant(slot); - return false; - } - CollectionData::appendOne(slot, resources); - return true; +inline bool ArrayData::addValue(const T & value, ResourceManager * resources) { + ARDUINOJSON_ASSERT(resources != nullptr); + auto slot = resources->allocVariant(); + if (!slot) + return false; + JsonVariant variant(slot.ptr(), resources); + if (!variant.set(value)) { + resources->freeVariant(slot); + return false; + } + CollectionData::appendOne(slot, resources); + return true; } constexpr size_t sizeofArray(size_t n) { - return n * ResourceManager::slotSize; + return n * ResourceManager::slotSize; } ARDUINOJSON_END_PRIVATE_NAMESPACE ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE template ::value, int> = 0> -inline bool copyArray(const T& src, JsonVariant dst) { - return dst.set(src); +inline bool copyArray(const T & src, JsonVariant dst) { + return dst.set(src); } -template ::value, int> = 0> -inline bool copyArray(T (&src)[N], const TDestination& dst) { - return copyArray(src, N, dst); +template ::value, int> = 0> +inline bool copyArray(T (&src)[N], const TDestination & dst) { + return copyArray(src, N, dst); } -template ::value, int> = 0> -inline bool copyArray(const T* src, size_t len, const TDestination& dst) { - bool ok = true; - for (size_t i = 0; i < len; i++) { - ok &= copyArray(src[i], dst.template add()); - } - return ok; +template ::value, int> = 0> +inline bool copyArray(const T * src, size_t len, const TDestination & dst) { + bool ok = true; + for (size_t i = 0; i < len; i++) { + ok &= copyArray(src[i], dst.template add()); + } + return ok; } template -inline bool copyArray(const char* src, size_t, const TDestination& dst) { - return dst.set(src); +inline bool copyArray(const char * src, size_t, const TDestination & dst) { + return dst.set(src); } template -inline bool copyArray(const T& src, JsonDocument& dst) { - return copyArray(src, dst.to()); +inline bool copyArray(const T & src, JsonDocument & dst) { + return copyArray(src, dst.to()); } template -inline bool copyArray(const T* src, size_t len, JsonDocument& dst) { - return copyArray(src, len, dst.to()); +inline bool copyArray(const T * src, size_t len, JsonDocument & dst) { + return copyArray(src, len, dst.to()); } template ::value, int> = 0> -inline size_t copyArray(JsonVariantConst src, T& dst) { - dst = src.as(); - return 1; +inline size_t copyArray(JsonVariantConst src, T & dst) { + dst = src.as(); + return 1; } template inline size_t copyArray(JsonArrayConst src, T (&dst)[N]) { - return copyArray(src, dst, N); + return copyArray(src, dst, N); } template -inline size_t copyArray(JsonArrayConst src, T* dst, size_t len) { - size_t i = 0; - for (JsonArrayConst::iterator it = src.begin(); it != src.end() && i < len; - ++it) - copyArray(*it, dst[i++]); - return i; +inline size_t copyArray(JsonArrayConst src, T * dst, size_t len) { + size_t i = 0; + for (JsonArrayConst::iterator it = src.begin(); it != src.end() && i < len; ++it) + copyArray(*it, dst[i++]); + return i; } template inline size_t copyArray(JsonVariantConst src, char (&dst)[N]) { - JsonString s = src; - size_t len = N - 1; - if (len > s.size()) - len = s.size(); - memcpy(dst, s.c_str(), len); - dst[len] = 0; - return 1; + JsonString s = src; + size_t len = N - 1; + if (len > s.size()) + len = s.size(); + memcpy(dst, s.c_str(), len); + dst[len] = 0; + return 1; } -template < - typename TSource, typename T, - detail::enable_if_t::value && - detail::is_base_of::value, - int> = 0> -inline size_t copyArray(const TSource& src, T& dst) { - return copyArray(src.template as(), dst); +template ::value && detail::is_base_of::value, int> = 0> +inline size_t copyArray(const TSource & src, T & dst) { + return copyArray(src.template as(), dst); } ARDUINOJSON_END_PUBLIC_NAMESPACE ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE #if ARDUINOJSON_ENABLE_ALIGNMENT inline bool isAligned(size_t value) { - const size_t mask = sizeof(void*) - 1; - size_t addr = value; - return (addr & mask) == 0; + const size_t mask = sizeof(void *) - 1; + size_t addr = value; + return (addr & mask) == 0; } inline size_t addPadding(size_t bytes) { - const size_t mask = sizeof(void*) - 1; - return (bytes + mask) & ~mask; + const size_t mask = sizeof(void *) - 1; + return (bytes + mask) & ~mask; } template struct AddPadding { - static const size_t mask = sizeof(void*) - 1; - static const size_t value = (bytes + mask) & ~mask; + static const size_t mask = sizeof(void *) - 1; + static const size_t value = (bytes + mask) & ~mask; }; #else inline bool isAligned(size_t) { - return true; + return true; } inline size_t addPadding(size_t bytes) { - return bytes; + return bytes; } template struct AddPadding { - static const size_t value = bytes; + static const size_t value = bytes; }; #endif template -inline bool isAligned(T* ptr) { - return isAligned(reinterpret_cast(ptr)); +inline bool isAligned(T * ptr) { + return isAligned(reinterpret_cast(ptr)); } template -inline T* addPadding(T* p) { - size_t address = addPadding(reinterpret_cast(p)); - return reinterpret_cast(address); +inline T * addPadding(T * p) { + size_t address = addPadding(reinterpret_cast(p)); + return reinterpret_cast(address); } -inline CollectionIterator::CollectionIterator(VariantData* slot, SlotId slotId) - : slot_(slot), currentId_(slotId) { - nextId_ = slot_ ? slot_->next() : NULL_SLOT; +inline CollectionIterator::CollectionIterator(VariantData * slot, SlotId slotId) + : slot_(slot) + , currentId_(slotId) { + nextId_ = slot_ ? slot_->next() : NULL_SLOT; } -inline void CollectionIterator::next(const ResourceManager* resources) { - ARDUINOJSON_ASSERT(currentId_ != NULL_SLOT); - slot_ = resources->getVariant(nextId_); - currentId_ = nextId_; - if (slot_) - nextId_ = slot_->next(); +inline void CollectionIterator::next(const ResourceManager * resources) { + ARDUINOJSON_ASSERT(currentId_ != NULL_SLOT); + slot_ = resources->getVariant(nextId_); + currentId_ = nextId_; + if (slot_) + nextId_ = slot_->next(); } -inline CollectionData::iterator CollectionData::createIterator( - const ResourceManager* resources) const { - return iterator(resources->getVariant(head_), head_); +inline CollectionData::iterator CollectionData::createIterator(const ResourceManager * resources) const { + return iterator(resources->getVariant(head_), head_); } -inline void CollectionData::appendOne(Slot slot, - const ResourceManager* resources) { - if (tail_ != NULL_SLOT) { - auto tail = resources->getVariant(tail_); - tail->setNext(slot.id()); - tail_ = slot.id(); - } else { - head_ = slot.id(); - tail_ = slot.id(); - } +inline void CollectionData::appendOne(Slot slot, const ResourceManager * resources) { + if (tail_ != NULL_SLOT) { + auto tail = resources->getVariant(tail_); + tail->setNext(slot.id()); + tail_ = slot.id(); + } else { + head_ = slot.id(); + tail_ = slot.id(); + } } -inline void CollectionData::appendPair(Slot key, - Slot value, - const ResourceManager* resources) { - key->setNext(value.id()); - if (tail_ != NULL_SLOT) { - auto tail = resources->getVariant(tail_); - tail->setNext(key.id()); - tail_ = value.id(); - } else { - head_ = key.id(); - tail_ = value.id(); - } +inline void CollectionData::appendPair(Slot key, Slot value, const ResourceManager * resources) { + key->setNext(value.id()); + if (tail_ != NULL_SLOT) { + auto tail = resources->getVariant(tail_); + tail->setNext(key.id()); + tail_ = value.id(); + } else { + head_ = key.id(); + tail_ = value.id(); + } } -inline void CollectionData::clear(ResourceManager* resources) { - auto next = head_; - while (next != NULL_SLOT) { - auto currId = next; - auto slot = resources->getVariant(next); - next = slot->next(); - resources->freeVariant({slot, currId}); - } - head_ = NULL_SLOT; - tail_ = NULL_SLOT; +inline void CollectionData::clear(ResourceManager * resources) { + auto next = head_; + while (next != NULL_SLOT) { + auto currId = next; + auto slot = resources->getVariant(next); + next = slot->next(); + resources->freeVariant({slot, currId}); + } + head_ = NULL_SLOT; + tail_ = NULL_SLOT; } -inline Slot CollectionData::getPreviousSlot( - VariantData* target, const ResourceManager* resources) const { - auto prev = Slot(); - auto currentId = head_; - while (currentId != NULL_SLOT) { - auto currentSlot = resources->getVariant(currentId); - if (currentSlot == target) - break; - prev = Slot(currentSlot, currentId); - currentId = currentSlot->next(); - } - return prev; +inline Slot CollectionData::getPreviousSlot(VariantData * target, const ResourceManager * resources) const { + auto prev = Slot(); + auto currentId = head_; + while (currentId != NULL_SLOT) { + auto currentSlot = resources->getVariant(currentId); + if (currentSlot == target) + break; + prev = Slot(currentSlot, currentId); + currentId = currentSlot->next(); + } + return prev; } -inline void CollectionData::removeOne(iterator it, ResourceManager* resources) { - if (it.done()) - return; - auto curr = it.slot_; - auto prev = getPreviousSlot(curr, resources); - auto next = curr->next(); - if (prev) - prev->setNext(next); - else - head_ = next; - if (next == NULL_SLOT) - tail_ = prev.id(); - resources->freeVariant({it.slot_, it.currentId_}); +inline void CollectionData::removeOne(iterator it, ResourceManager * resources) { + if (it.done()) + return; + auto curr = it.slot_; + auto prev = getPreviousSlot(curr, resources); + auto next = curr->next(); + if (prev) + prev->setNext(next); + else + head_ = next; + if (next == NULL_SLOT) + tail_ = prev.id(); + resources->freeVariant({it.slot_, it.currentId_}); } -inline void CollectionData::removePair(ObjectData::iterator it, - ResourceManager* resources) { - if (it.done()) - return; - auto keySlot = it.slot_; - auto valueId = it.nextId_; - auto valueSlot = resources->getVariant(valueId); - keySlot->setNext(valueSlot->next()); - resources->freeVariant({valueSlot, valueId}); - removeOne(it, resources); +inline void CollectionData::removePair(ObjectData::iterator it, ResourceManager * resources) { + if (it.done()) + return; + auto keySlot = it.slot_; + auto valueId = it.nextId_; + auto valueSlot = resources->getVariant(valueId); + keySlot->setNext(valueSlot->next()); + resources->freeVariant({valueSlot, valueId}); + removeOne(it, resources); } -inline size_t CollectionData::nesting(const ResourceManager* resources) const { - size_t maxChildNesting = 0; - for (auto it = createIterator(resources); !it.done(); it.next(resources)) { - size_t childNesting = it->nesting(resources); - if (childNesting > maxChildNesting) - maxChildNesting = childNesting; - } - return maxChildNesting + 1; +inline size_t CollectionData::nesting(const ResourceManager * resources) const { + size_t maxChildNesting = 0; + for (auto it = createIterator(resources); !it.done(); it.next(resources)) { + size_t childNesting = it->nesting(resources); + if (childNesting > maxChildNesting) + maxChildNesting = childNesting; + } + return maxChildNesting + 1; } -inline size_t CollectionData::size(const ResourceManager* resources) const { - size_t count = 0; - for (auto it = createIterator(resources); !it.done(); it.next(resources)) - count++; - return count; +inline size_t CollectionData::size(const ResourceManager * resources) const { + size_t count = 0; + for (auto it = createIterator(resources); !it.done(); it.next(resources)) + count++; + return count; } inline Slot ResourceManager::allocVariant() { - auto p = variantPools_.allocSlot(allocator_); - if (!p) { - overflowed_ = true; - return {}; - } - return {new (&p->variant) VariantData, p.id()}; + auto p = variantPools_.allocSlot(allocator_); + if (!p) { + overflowed_ = true; + return {}; + } + return {new (&p->variant) VariantData, p.id()}; } inline void ResourceManager::freeVariant(Slot variant) { - variant->clear(this); - variantPools_.freeSlot({alias_cast(variant.ptr()), variant.id()}); + variant->clear(this); + variantPools_.freeSlot({alias_cast(variant.ptr()), variant.id()}); } -inline VariantData* ResourceManager::getVariant(SlotId id) const { - return reinterpret_cast(variantPools_.getSlot(id)); +inline VariantData * ResourceManager::getVariant(SlotId id) const { + return reinterpret_cast(variantPools_.getSlot(id)); } #if ARDUINOJSON_USE_EXTENSIONS inline Slot ResourceManager::allocExtension() { - auto p = variantPools_.allocSlot(allocator_); - if (!p) { - overflowed_ = true; - return {}; - } - return {&p->extension, p.id()}; + auto p = variantPools_.allocSlot(allocator_); + if (!p) { + overflowed_ = true; + return {}; + } + return {&p->extension, p.id()}; } inline void ResourceManager::freeExtension(SlotId id) { - auto p = getExtension(id); - variantPools_.freeSlot({reinterpret_cast(p), id}); + auto p = getExtension(id); + variantPools_.freeSlot({reinterpret_cast(p), id}); } -inline VariantExtension* ResourceManager::getExtension(SlotId id) const { - return &variantPools_.getSlot(id)->extension; +inline VariantExtension * ResourceManager::getExtension(SlotId id) const { + return &variantPools_.getSlot(id)->extension; } #endif template -inline VariantData* ObjectData::getMember( - TAdaptedString key, const ResourceManager* resources) const { - auto it = findKey(key, resources); - if (it.done()) - return nullptr; - it.next(resources); - return it.data(); +inline VariantData * ObjectData::getMember(TAdaptedString key, const ResourceManager * resources) const { + auto it = findKey(key, resources); + if (it.done()) + return nullptr; + it.next(resources); + return it.data(); } template -VariantData* ObjectData::getOrAddMember(TAdaptedString key, - ResourceManager* resources) { - auto data = getMember(key, resources); - if (data) - return data; - return addMember(key, resources); +VariantData * ObjectData::getOrAddMember(TAdaptedString key, ResourceManager * resources) { + auto data = getMember(key, resources); + if (data) + return data; + return addMember(key, resources); } template -inline ObjectData::iterator ObjectData::findKey( - TAdaptedString key, const ResourceManager* resources) const { - if (key.isNull()) +inline ObjectData::iterator ObjectData::findKey(TAdaptedString key, const ResourceManager * resources) const { + if (key.isNull()) + return iterator(); + bool isKey = true; + for (auto it = createIterator(resources); !it.done(); it.next(resources)) { + if (isKey && stringEquals(key, adaptString(it->asString()))) + return it; + isKey = !isKey; + } return iterator(); - bool isKey = true; - for (auto it = createIterator(resources); !it.done(); it.next(resources)) { - if (isKey && stringEquals(key, adaptString(it->asString()))) - return it; - isKey = !isKey; - } - return iterator(); } template -inline void ObjectData::removeMember(TAdaptedString key, - ResourceManager* resources) { - remove(findKey(key, resources), resources); +inline void ObjectData::removeMember(TAdaptedString key, ResourceManager * resources) { + remove(findKey(key, resources), resources); } template -inline VariantData* ObjectData::addMember(TAdaptedString key, - ResourceManager* resources) { - auto keySlot = resources->allocVariant(); - if (!keySlot) - return nullptr; - auto valueSlot = resources->allocVariant(); - if (!valueSlot) - return nullptr; - if (!keySlot->setString(key, resources)) - return nullptr; - CollectionData::appendPair(keySlot, valueSlot, resources); - return valueSlot.ptr(); +inline VariantData * ObjectData::addMember(TAdaptedString key, ResourceManager * resources) { + auto keySlot = resources->allocVariant(); + if (!keySlot) + return nullptr; + auto valueSlot = resources->allocVariant(); + if (!valueSlot) + return nullptr; + if (!keySlot->setString(key, resources)) + return nullptr; + CollectionData::appendPair(keySlot, valueSlot, resources); + return valueSlot.ptr(); +} +inline VariantData * ObjectData::addPair(VariantData ** value, ResourceManager * resources) { + auto keySlot = resources->allocVariant(); + if (!keySlot) + return nullptr; + auto valueSlot = resources->allocVariant(); + if (!valueSlot) + return nullptr; + *value = valueSlot.ptr(); + CollectionData::appendPair(keySlot, valueSlot, resources); + return keySlot.ptr(); } constexpr size_t sizeofObject(size_t n) { - return 2 * n * ResourceManager::slotSize; + return 2 * n * ResourceManager::slotSize; } class EscapeSequence { - public: - static char escapeChar(char c) { - const char* p = escapeTable(true); - while (p[0] && p[1] != c) { - p += 2; + public: + static char escapeChar(char c) { + const char * p = escapeTable(true); + while (p[0] && p[1] != c) { + p += 2; + } + return p[0]; } - return p[0]; - } - static char unescapeChar(char c) { - const char* p = escapeTable(false); - for (;;) { - if (p[0] == '\0') - return 0; - if (p[0] == c) - return p[1]; - p += 2; + static char unescapeChar(char c) { + const char * p = escapeTable(false); + for (;;) { + if (p[0] == '\0') + return 0; + if (p[0] == c) + return p[1]; + p += 2; + } + } + + private: + static const char * escapeTable(bool isSerializing) { + return &"//''\"\"\\\\b\bf\fn\nr\rt\t"[isSerializing ? 4 : 0]; } - } - private: - static const char* escapeTable(bool isSerializing) { - return &"//''\"\"\\\\b\bf\fn\nr\rt\t"[isSerializing ? 4 : 0]; - } }; struct FloatParts { - uint32_t integral; - uint32_t decimal; - int16_t exponent; - int8_t decimalPlaces; + uint32_t integral; + uint32_t decimal; + int16_t exponent; + int8_t decimalPlaces; }; template -inline int16_t normalize(TFloat& value) { - using traits = FloatTraits; - int16_t powersOf10 = 0; - int8_t index = sizeof(TFloat) == 8 ? 8 : 5; - int bit = 1 << index; - if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) { - for (; index >= 0; index--) { - if (value >= traits::positiveBinaryPowersOfTen()[index]) { - value *= traits::negativeBinaryPowersOfTen()[index]; - powersOf10 = int16_t(powersOf10 + bit); - } - bit >>= 1; +inline int16_t normalize(TFloat & value) { + using traits = FloatTraits; + int16_t powersOf10 = 0; + int8_t index = sizeof(TFloat) == 8 ? 8 : 5; + int bit = 1 << index; + if (value >= ARDUINOJSON_POSITIVE_EXPONENTIATION_THRESHOLD) { + for (; index >= 0; index--) { + if (value >= traits::positiveBinaryPowersOfTen()[index]) { + value *= traits::negativeBinaryPowersOfTen()[index]; + powersOf10 = int16_t(powersOf10 + bit); + } + bit >>= 1; + } } - } - if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) { - for (; index >= 0; index--) { - if (value < traits::negativeBinaryPowersOfTen()[index] * 10) { - value *= traits::positiveBinaryPowersOfTen()[index]; - powersOf10 = int16_t(powersOf10 - bit); - } - bit >>= 1; + if (value > 0 && value <= ARDUINOJSON_NEGATIVE_EXPONENTIATION_THRESHOLD) { + for (; index >= 0; index--) { + if (value < traits::negativeBinaryPowersOfTen()[index] * 10) { + value *= traits::positiveBinaryPowersOfTen()[index]; + powersOf10 = int16_t(powersOf10 - bit); + } + bit >>= 1; + } } - } - return powersOf10; + return powersOf10; } constexpr uint32_t pow10(int exponent) { - return (exponent == 0) ? 1 : 10 * pow10(exponent - 1); + return (exponent == 0) ? 1 : 10 * pow10(exponent - 1); } inline FloatParts decomposeFloat(JsonFloat value, int8_t decimalPlaces) { - uint32_t maxDecimalPart = pow10(decimalPlaces); - int16_t exponent = normalize(value); - uint32_t integral = uint32_t(value); - for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) { - maxDecimalPart /= 10; - decimalPlaces--; - } - JsonFloat remainder = - (value - JsonFloat(integral)) * JsonFloat(maxDecimalPart); - uint32_t decimal = uint32_t(remainder); - remainder = remainder - JsonFloat(decimal); - decimal += uint32_t(remainder * 2); - if (decimal >= maxDecimalPart) { - decimal = 0; - integral++; - if (exponent && integral >= 10) { - exponent++; - integral = 1; + uint32_t maxDecimalPart = pow10(decimalPlaces); + int16_t exponent = normalize(value); + uint32_t integral = uint32_t(value); + for (uint32_t tmp = integral; tmp >= 10; tmp /= 10) { + maxDecimalPart /= 10; + decimalPlaces--; } - } - while (decimal % 10 == 0 && decimalPlaces > 0) { - decimal /= 10; - decimalPlaces--; - } - return {integral, decimal, exponent, decimalPlaces}; + JsonFloat remainder = (value - JsonFloat(integral)) * JsonFloat(maxDecimalPart); + uint32_t decimal = uint32_t(remainder); + remainder = remainder - JsonFloat(decimal); + decimal += uint32_t(remainder * 2); + if (decimal >= maxDecimalPart) { + decimal = 0; + integral++; + if (exponent && integral >= 10) { + exponent++; + integral = 1; + } + } + while (decimal % 10 == 0 && decimalPlaces > 0) { + decimal /= 10; + decimalPlaces--; + } + return {integral, decimal, exponent, decimalPlaces}; } template class CountingDecorator { - public: - explicit CountingDecorator(TWriter& writer) : writer_(writer), count_(0) {} - void write(uint8_t c) { - count_ += writer_.write(c); - } - void write(const uint8_t* s, size_t n) { - count_ += writer_.write(s, n); - } - size_t count() const { - return count_; - } - private: - TWriter writer_; - size_t count_; + public: + explicit CountingDecorator(TWriter & writer) + : writer_(writer) + , count_(0) { + } + void write(uint8_t c) { + count_ += writer_.write(c); + } + void write(const uint8_t * s, size_t n) { + count_ += writer_.write(s, n); + } + size_t count() const { + return count_; + } + + private: + TWriter writer_; + size_t count_; }; template class TextFormatter { - public: - explicit TextFormatter(TWriter writer) : writer_(writer) {} - TextFormatter& operator=(const TextFormatter&) = delete; - size_t bytesWritten() const { - return writer_.count(); - } - void writeBoolean(bool value) { - if (value) - writeRaw("true"); - else - writeRaw("false"); - } - void writeString(const char* value) { - ARDUINOJSON_ASSERT(value != NULL); - writeRaw('\"'); - while (*value) - writeChar(*value++); - writeRaw('\"'); - } - void writeString(const char* value, size_t n) { - ARDUINOJSON_ASSERT(value != NULL); - writeRaw('\"'); - while (n--) - writeChar(*value++); - writeRaw('\"'); - } - void writeChar(char c) { - char specialChar = EscapeSequence::escapeChar(c); - if (specialChar) { - writeRaw('\\'); - writeRaw(specialChar); - } else if (c) { - writeRaw(c); - } else { - writeRaw("\\u0000"); + public: + explicit TextFormatter(TWriter writer) + : writer_(writer) { } - } - template - void writeFloat(T value) { - writeFloat(JsonFloat(value), sizeof(T) >= 8 ? 9 : 6); - } - void writeFloat(JsonFloat value, int8_t decimalPlaces) { - if (isnan(value)) - return writeRaw(ARDUINOJSON_ENABLE_NAN ? "NaN" : "null"); + TextFormatter & operator=(const TextFormatter &) = delete; + size_t bytesWritten() const { + return writer_.count(); + } + void writeBoolean(bool value) { + if (value) + writeRaw("true"); + else + writeRaw("false"); + } + void writeString(const char * value) { + ARDUINOJSON_ASSERT(value != NULL); + writeRaw('\"'); + while (*value) + writeChar(*value++); + writeRaw('\"'); + } + void writeString(const char * value, size_t n) { + ARDUINOJSON_ASSERT(value != NULL); + writeRaw('\"'); + while (n--) + writeChar(*value++); + writeRaw('\"'); + } + void writeChar(char c) { + char specialChar = EscapeSequence::escapeChar(c); + if (specialChar) { + writeRaw('\\'); + writeRaw(specialChar); + } else if (c) { + writeRaw(c); + } else { + writeRaw("\\u0000"); + } + } + template + void writeFloat(T value) { + writeFloat(JsonFloat(value), sizeof(T) >= 8 ? 9 : 6); + } + void writeFloat(JsonFloat value, int8_t decimalPlaces) { + if (isnan(value)) + return writeRaw(ARDUINOJSON_ENABLE_NAN ? "NaN" : "null"); #if ARDUINOJSON_ENABLE_INFINITY - if (value < 0.0) { - writeRaw('-'); - value = -value; - } - if (isinf(value)) - return writeRaw("Infinity"); + if (value < 0.0) { + writeRaw('-'); + value = -value; + } + if (isinf(value)) + return writeRaw("Infinity"); #else - if (isinf(value)) - return writeRaw("null"); - if (value < 0.0) { - writeRaw('-'); - value = -value; - } + if (isinf(value)) + return writeRaw("null"); + if (value < 0.0) { + writeRaw('-'); + value = -value; + } #endif - auto parts = decomposeFloat(value, decimalPlaces); - writeInteger(parts.integral); - if (parts.decimalPlaces) - writeDecimals(parts.decimal, parts.decimalPlaces); - if (parts.exponent) { - writeRaw('e'); - writeInteger(parts.exponent); + auto parts = decomposeFloat(value, decimalPlaces); + writeInteger(parts.integral); + if (parts.decimalPlaces) + writeDecimals(parts.decimal, parts.decimalPlaces); + if (parts.exponent) { + writeRaw('e'); + writeInteger(parts.exponent); + } } - } - template - enable_if_t::value> writeInteger(T value) { - using unsigned_type = make_unsigned_t; - unsigned_type unsigned_value; - if (value < 0) { - writeRaw('-'); - unsigned_value = unsigned_type(unsigned_type(~value) + 1); - } else { - unsigned_value = unsigned_type(value); + template + enable_if_t::value> writeInteger(T value) { + using unsigned_type = make_unsigned_t; + unsigned_type unsigned_value; + if (value < 0) { + writeRaw('-'); + unsigned_value = unsigned_type(unsigned_type(~value) + 1); + } else { + unsigned_value = unsigned_type(value); + } + writeInteger(unsigned_value); } - writeInteger(unsigned_value); - } - template - enable_if_t::value> writeInteger(T value) { - char buffer[22]; - char* end = buffer + sizeof(buffer); - char* begin = end; - do { - *--begin = char(value % 10 + '0'); - value = T(value / 10); - } while (value); - writeRaw(begin, end); - } - void writeDecimals(uint32_t value, int8_t width) { - char buffer[16]; - char* end = buffer + sizeof(buffer); - char* begin = end; - while (width--) { - *--begin = char(value % 10 + '0'); - value /= 10; + template + enable_if_t::value> writeInteger(T value) { + char buffer[22]; + char * end = buffer + sizeof(buffer); + char * begin = end; + do { + *--begin = char(value % 10 + '0'); + value = T(value / 10); + } while (value); + writeRaw(begin, end); } - *--begin = '.'; - writeRaw(begin, end); - } - void writeRaw(const char* s) { - writer_.write(reinterpret_cast(s), strlen(s)); - } - void writeRaw(const char* s, size_t n) { - writer_.write(reinterpret_cast(s), n); - } - void writeRaw(const char* begin, const char* end) { - writer_.write(reinterpret_cast(begin), - static_cast(end - begin)); - } - template - void writeRaw(const char (&s)[N]) { - writer_.write(reinterpret_cast(s), N - 1); - } - void writeRaw(char c) { - writer_.write(static_cast(c)); - } - protected: - CountingDecorator writer_; + void writeDecimals(uint32_t value, int8_t width) { + char buffer[16]; + char * end = buffer + sizeof(buffer); + char * begin = end; + while (width--) { + *--begin = char(value % 10 + '0'); + value /= 10; + } + *--begin = '.'; + writeRaw(begin, end); + } + void writeRaw(const char * s) { + writer_.write(reinterpret_cast(s), strlen(s)); + } + void writeRaw(const char * s, size_t n) { + writer_.write(reinterpret_cast(s), n); + } + void writeRaw(const char * begin, const char * end) { + writer_.write(reinterpret_cast(begin), static_cast(end - begin)); + } + template + void writeRaw(const char (&s)[N]) { + writer_.write(reinterpret_cast(s), N - 1); + } + void writeRaw(char c) { + writer_.write(static_cast(c)); + } + + protected: + CountingDecorator writer_; }; class DummyWriter { - public: - size_t write(uint8_t) { - return 1; - } - size_t write(const uint8_t*, size_t n) { - return n; - } + public: + size_t write(uint8_t) { + return 1; + } + size_t write(const uint8_t *, size_t n) { + return n; + } }; template